tokens.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl, Pierre Muller
  4. Tokens used by the compiler
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit tokens;
  19. {$i defines.inc}
  20. interface
  21. uses
  22. globtype;
  23. type
  24. ttoken=(NOTOKEN,
  25. { operators, which can also be overloaded }
  26. _PLUS,
  27. _MINUS,
  28. _STAR,
  29. _SLASH,
  30. _EQUAL,
  31. _GT,
  32. _LT,
  33. _GTE,
  34. _LTE,
  35. _SYMDIF,
  36. _STARSTAR,
  37. _OP_AS,
  38. _OP_IN,
  39. _OP_IS,
  40. _OP_OR,
  41. _OP_AND,
  42. _OP_DIV,
  43. _OP_MOD,
  44. _OP_NOT,
  45. _OP_SHL,
  46. _OP_SHR,
  47. _OP_XOR,
  48. _ASSIGNMENT,
  49. { special chars }
  50. _CARET,
  51. _UNEQUAL,
  52. _LECKKLAMMER,
  53. _RECKKLAMMER,
  54. _POINT,
  55. _COMMA,
  56. _LKLAMMER,
  57. _RKLAMMER,
  58. _COLON,
  59. _SEMICOLON,
  60. _KLAMMERAFFE,
  61. _POINTPOINT,
  62. _DOUBLEADDR,
  63. _EOF,
  64. _ID,
  65. _NOID,
  66. _REALNUMBER,
  67. _INTCONST,
  68. _CSTRING,
  69. _CCHAR,
  70. _CWSTRING,
  71. _CWCHAR,
  72. { C like operators }
  73. _PLUSASN,
  74. _MINUSASN,
  75. _ANDASN,
  76. _ORASN,
  77. _STARASN,
  78. _SLASHASN,
  79. _MODASN,
  80. _DIVASN,
  81. _NOTASN,
  82. _XORASN,
  83. { Normal words }
  84. _AS,
  85. _AT,
  86. _DO,
  87. _IF,
  88. _IN,
  89. _IS,
  90. _OF,
  91. _ON,
  92. _OR,
  93. _TO,
  94. _AND,
  95. _ASM,
  96. _DIV,
  97. _END,
  98. _FAR,
  99. _FOR,
  100. _MOD,
  101. _NEW,
  102. _NIL,
  103. _NOT,
  104. _OUT,
  105. _SET,
  106. _SHL,
  107. _SHR,
  108. _TRY,
  109. _VAR,
  110. _XOR,
  111. _CASE,
  112. _CVAR,
  113. _ELSE,
  114. _EXIT,
  115. _FAIL,
  116. _FILE,
  117. _GOTO,
  118. _NAME,
  119. _NEAR,
  120. _READ,
  121. _SELF,
  122. _THEN,
  123. _TRUE,
  124. _TYPE,
  125. _UNIT,
  126. _USES,
  127. _WITH,
  128. _ALIAS,
  129. _ARRAY,
  130. _BEGIN,
  131. _BREAK,
  132. _CDECL,
  133. _CLASS,
  134. _CONST,
  135. _FALSE,
  136. _INDEX,
  137. _LABEL,
  138. _RAISE,
  139. _UNTIL,
  140. _WHILE,
  141. _WRITE,
  142. _DISPID,
  143. _DOWNTO,
  144. _EXCEPT,
  145. _EXPORT,
  146. _INLINE,
  147. _OBJECT,
  148. _PACKED,
  149. _PASCAL,
  150. _PUBLIC,
  151. _RECORD,
  152. _REPEAT,
  153. _RESULT,
  154. _STATIC,
  155. _STORED,
  156. _STRING,
  157. _SYSTEM,
  158. _ASMNAME,
  159. _CPPDECL,
  160. _DEFAULT,
  161. _DISPOSE,
  162. _DYNAMIC,
  163. _EXPORTS,
  164. _FINALLY,
  165. _FORWARD,
  166. _IOCHECK,
  167. _LIBRARY,
  168. _MESSAGE,
  169. _PRIVATE,
  170. _PROGRAM,
  171. _STDCALL,
  172. _SYSCALL,
  173. _VARARGS,
  174. _VIRTUAL,
  175. _ABSOLUTE,
  176. _ABSTRACT,
  177. _CONTINUE,
  178. _CPPCLASS,
  179. _EXTERNAL,
  180. _FUNCTION,
  181. _OPERATOR,
  182. _OVERLOAD,
  183. _OVERRIDE,
  184. _PLATFORM,
  185. _POPSTACK,
  186. _PROPERTY,
  187. _REGISTER,
  188. _RESIDENT,
  189. _SAFECALL,
  190. _ASSEMBLER,
  191. _INHERITED,
  192. _INTERFACE,
  193. _INTERRUPT,
  194. _NODEFAULT,
  195. _OTHERWISE,
  196. _PROCEDURE,
  197. _PROTECTED,
  198. _PUBLISHED,
  199. _THREADVAR,
  200. _DEPRECATED,
  201. _DESTRUCTOR,
  202. _IMPLEMENTS,
  203. _INTERNPROC,
  204. _OPENSTRING,
  205. _CONSTRUCTOR,
  206. _INTERNCONST,
  207. _REINTRODUCE,
  208. _SHORTSTRING,
  209. _COMPILERPROC,
  210. _FINALIZATION,
  211. _DISPINTERFACE,
  212. _SAVEREGISTERS,
  213. _IMPLEMENTATION,
  214. _INITIALIZATION,
  215. _RESOURCESTRING
  216. );
  217. const
  218. tokenlenmin = 2;
  219. tokenlenmax = 14;
  220. { last operator which can be overloaded, the first_overloaded should
  221. be declared directly after NOTOKEN }
  222. first_overloaded = succ(NOTOKEN);
  223. last_overloaded = _ASSIGNMENT;
  224. type
  225. tokenrec=record
  226. str : string[tokenlenmax];
  227. special : boolean;
  228. keyword : tmodeswitch;
  229. op : ttoken;
  230. end;
  231. ttokenarray=array[ttoken] of tokenrec;
  232. ptokenarray=^ttokenarray;
  233. tokenidxrec=record
  234. first,last : ttoken;
  235. end;
  236. ptokenidx=^ttokenidx;
  237. ttokenidx=array[tokenlenmin..tokenlenmax,'A'..'Z'] of tokenidxrec;
  238. const
  239. arraytokeninfo : ttokenarray =(
  240. (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
  241. { Operators which can be overloaded }
  242. (str:'+' ;special:true ;keyword:m_none;op:NOTOKEN),
  243. (str:'-' ;special:true ;keyword:m_none;op:NOTOKEN),
  244. (str:'*' ;special:true ;keyword:m_none;op:NOTOKEN),
  245. (str:'/' ;special:true ;keyword:m_none;op:NOTOKEN),
  246. (str:'=' ;special:true ;keyword:m_none;op:NOTOKEN),
  247. (str:'>' ;special:true ;keyword:m_none;op:NOTOKEN),
  248. (str:'<' ;special:true ;keyword:m_none;op:NOTOKEN),
  249. (str:'>=' ;special:true ;keyword:m_none;op:NOTOKEN),
  250. (str:'<=' ;special:true ;keyword:m_none;op:NOTOKEN),
  251. (str:'><' ;special:true ;keyword:m_none;op:NOTOKEN),
  252. (str:'**' ;special:true ;keyword:m_none;op:NOTOKEN),
  253. (str:'as' ;special:true ;keyword:m_none;op:NOTOKEN),
  254. (str:'in' ;special:true ;keyword:m_none;op:NOTOKEN),
  255. (str:'is' ;special:true ;keyword:m_none;op:NOTOKEN),
  256. (str:'or' ;special:true ;keyword:m_none;op:NOTOKEN),
  257. (str:'and' ;special:true ;keyword:m_none;op:NOTOKEN),
  258. (str:'div' ;special:true ;keyword:m_none;op:NOTOKEN),
  259. (str:'mod' ;special:true ;keyword:m_none;op:NOTOKEN),
  260. (str:'not' ;special:true ;keyword:m_none;op:NOTOKEN),
  261. (str:'shl' ;special:true ;keyword:m_none;op:NOTOKEN),
  262. (str:'shr' ;special:true ;keyword:m_none;op:NOTOKEN),
  263. (str:'xor' ;special:true ;keyword:m_none;op:NOTOKEN),
  264. (str:':=' ;special:true ;keyword:m_none;op:NOTOKEN),
  265. { Special chars }
  266. (str:'^' ;special:true ;keyword:m_none;op:NOTOKEN),
  267. (str:'<>' ;special:true ;keyword:m_none;op:NOTOKEN),
  268. (str:'[' ;special:true ;keyword:m_none;op:NOTOKEN),
  269. (str:']' ;special:true ;keyword:m_none;op:NOTOKEN),
  270. (str:'.' ;special:true ;keyword:m_none;op:NOTOKEN),
  271. (str:',' ;special:true ;keyword:m_none;op:NOTOKEN),
  272. (str:'(' ;special:true ;keyword:m_none;op:NOTOKEN),
  273. (str:')' ;special:true ;keyword:m_none;op:NOTOKEN),
  274. (str:':' ;special:true ;keyword:m_none;op:NOTOKEN),
  275. (str:';' ;special:true ;keyword:m_none;op:NOTOKEN),
  276. (str:'@' ;special:true ;keyword:m_none;op:NOTOKEN),
  277. (str:'..' ;special:true ;keyword:m_none;op:NOTOKEN),
  278. (str:'@@' ;special:true ;keyword:m_none;op:NOTOKEN),
  279. (str:'end of file' ;special:true ;keyword:m_none;op:NOTOKEN),
  280. (str:'identifier' ;special:true ;keyword:m_none;op:NOTOKEN),
  281. (str:'non identifier';special:true ;keyword:m_none;op:NOTOKEN),
  282. (str:'const real' ;special:true ;keyword:m_none;op:NOTOKEN),
  283. (str:'ordinal const' ;special:true ;keyword:m_none;op:NOTOKEN),
  284. (str:'const string' ;special:true ;keyword:m_none;op:NOTOKEN),
  285. (str:'const char' ;special:true ;keyword:m_none;op:NOTOKEN),
  286. (str:'const wstring' ;special:true ;keyword:m_none;op:NOTOKEN),
  287. (str:'const wchar' ;special:true ;keyword:m_none;op:NOTOKEN),
  288. { C like operators }
  289. (str:'+=' ;special:true ;keyword:m_none;op:NOTOKEN),
  290. (str:'-=' ;special:true ;keyword:m_none;op:NOTOKEN),
  291. (str:'&=' ;special:true ;keyword:m_none;op:NOTOKEN),
  292. (str:'|=' ;special:true ;keyword:m_none;op:NOTOKEN),
  293. (str:'*=' ;special:true ;keyword:m_none;op:NOTOKEN),
  294. (str:'/=' ;special:true ;keyword:m_none;op:NOTOKEN),
  295. (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
  296. (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
  297. (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
  298. (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
  299. { Normal words }
  300. (str:'AS' ;special:false;keyword:m_class;op:_OP_AS),
  301. (str:'AT' ;special:false;keyword:m_none;op:NOTOKEN),
  302. (str:'DO' ;special:false;keyword:m_all;op:NOTOKEN),
  303. (str:'IF' ;special:false;keyword:m_all;op:NOTOKEN),
  304. (str:'IN' ;special:false;keyword:m_all;op:_OP_IN),
  305. (str:'IS' ;special:false;keyword:m_class;op:_OP_IS),
  306. (str:'OF' ;special:false;keyword:m_all;op:NOTOKEN),
  307. (str:'ON' ;special:false;keyword:m_none;op:NOTOKEN),
  308. (str:'OR' ;special:false;keyword:m_all;op:_OP_OR),
  309. (str:'TO' ;special:false;keyword:m_all;op:NOTOKEN),
  310. (str:'AND' ;special:false;keyword:m_all;op:_OP_AND),
  311. (str:'ASM' ;special:false;keyword:m_all;op:NOTOKEN),
  312. (str:'DIV' ;special:false;keyword:m_all;op:_OP_DIV),
  313. (str:'END' ;special:false;keyword:m_all;op:NOTOKEN),
  314. (str:'FAR' ;special:false;keyword:m_none;op:NOTOKEN),
  315. (str:'FOR' ;special:false;keyword:m_all;op:NOTOKEN),
  316. (str:'MOD' ;special:false;keyword:m_all;op:_OP_MOD),
  317. (str:'NEW' ;special:false;keyword:m_none;op:NOTOKEN),
  318. (str:'NIL' ;special:false;keyword:m_all;op:NOTOKEN),
  319. (str:'NOT' ;special:false;keyword:m_all;op:_OP_NOT),
  320. (str:'OUT' ;special:false;keyword:m_none;op:NOTOKEN),
  321. (str:'SET' ;special:false;keyword:m_all;op:NOTOKEN),
  322. (str:'SHL' ;special:false;keyword:m_all;op:_OP_SHL),
  323. (str:'SHR' ;special:false;keyword:m_all;op:_OP_SHR),
  324. (str:'TRY' ;special:false;keyword:m_class;op:NOTOKEN),
  325. (str:'VAR' ;special:false;keyword:m_all;op:NOTOKEN),
  326. (str:'XOR' ;special:false;keyword:m_all;op:_OP_XOR),
  327. (str:'CASE' ;special:false;keyword:m_all;op:NOTOKEN),
  328. (str:'CVAR' ;special:false;keyword:m_none;op:NOTOKEN),
  329. (str:'ELSE' ;special:false;keyword:m_all;op:NOTOKEN),
  330. (str:'EXIT' ;special:false;keyword:m_all;op:NOTOKEN),
  331. (str:'FAIL' ;special:false;keyword:m_none;op:NOTOKEN), { only set within constructors PM }
  332. (str:'FILE' ;special:false;keyword:m_all;op:NOTOKEN),
  333. (str:'GOTO' ;special:false;keyword:m_all;op:NOTOKEN),
  334. (str:'NAME' ;special:false;keyword:m_none;op:NOTOKEN),
  335. (str:'NEAR' ;special:false;keyword:m_none;op:NOTOKEN),
  336. (str:'READ' ;special:false;keyword:m_none;op:NOTOKEN),
  337. (str:'SELF' ;special:false;keyword:m_none;op:NOTOKEN), {set inside methods only PM }
  338. (str:'THEN' ;special:false;keyword:m_all;op:NOTOKEN),
  339. (str:'TRUE' ;special:false;keyword:m_all;op:NOTOKEN),
  340. (str:'TYPE' ;special:false;keyword:m_all;op:NOTOKEN),
  341. (str:'UNIT' ;special:false;keyword:m_all;op:NOTOKEN),
  342. (str:'USES' ;special:false;keyword:m_all;op:NOTOKEN),
  343. (str:'WITH' ;special:false;keyword:m_all;op:NOTOKEN),
  344. (str:'ALIAS' ;special:false;keyword:m_none;op:NOTOKEN),
  345. (str:'ARRAY' ;special:false;keyword:m_all;op:NOTOKEN),
  346. (str:'BEGIN' ;special:false;keyword:m_all;op:NOTOKEN),
  347. (str:'BREAK' ;special:false;keyword:m_none;op:NOTOKEN),
  348. (str:'CDECL' ;special:false;keyword:m_none;op:NOTOKEN),
  349. (str:'CLASS' ;special:false;keyword:m_class;op:NOTOKEN),
  350. (str:'CONST' ;special:false;keyword:m_all;op:NOTOKEN),
  351. (str:'FALSE' ;special:false;keyword:m_all;op:NOTOKEN),
  352. (str:'INDEX' ;special:false;keyword:m_none;op:NOTOKEN),
  353. (str:'LABEL' ;special:false;keyword:m_all;op:NOTOKEN),
  354. (str:'RAISE' ;special:false;keyword:m_class;op:NOTOKEN),
  355. (str:'UNTIL' ;special:false;keyword:m_all;op:NOTOKEN),
  356. (str:'WHILE' ;special:false;keyword:m_all;op:NOTOKEN),
  357. (str:'WRITE' ;special:false;keyword:m_none;op:NOTOKEN),
  358. (str:'DISPID' ;special:false;keyword:m_none;op:NOTOKEN),
  359. (str:'DOWNTO' ;special:false;keyword:m_all;op:NOTOKEN),
  360. (str:'EXCEPT' ;special:false;keyword:m_class;op:NOTOKEN),
  361. (str:'EXPORT' ;special:false;keyword:m_none;op:NOTOKEN),
  362. (str:'INLINE' ;special:false;keyword:m_none;op:NOTOKEN),
  363. (str:'OBJECT' ;special:false;keyword:m_all;op:NOTOKEN),
  364. (str:'PACKED' ;special:false;keyword:m_all;op:NOTOKEN),
  365. (str:'PASCAL' ;special:false;keyword:m_none;op:NOTOKEN),
  366. (str:'PUBLIC' ;special:false;keyword:m_none;op:NOTOKEN),
  367. (str:'RECORD' ;special:false;keyword:m_all;op:NOTOKEN),
  368. (str:'REPEAT' ;special:false;keyword:m_all;op:NOTOKEN),
  369. (str:'RESULT' ;special:false;keyword:m_none;op:NOTOKEN),
  370. (str:'STATIC' ;special:false;keyword:m_none;op:NOTOKEN),
  371. (str:'STORED' ;special:false;keyword:m_none;op:NOTOKEN),
  372. (str:'STRING' ;special:false;keyword:m_all;op:NOTOKEN),
  373. (str:'SYSTEM' ;special:false;keyword:m_none;op:NOTOKEN),
  374. (str:'ASMNAME' ;special:false;keyword:m_none;op:NOTOKEN),
  375. (str:'CPPDECL' ;special:false;keyword:m_none;op:NOTOKEN),
  376. (str:'DEFAULT' ;special:false;keyword:m_none;op:NOTOKEN),
  377. (str:'DISPOSE' ;special:false;keyword:m_all;op:NOTOKEN),
  378. (str:'DYNAMIC' ;special:false;keyword:m_none;op:NOTOKEN),
  379. (str:'EXPORTS' ;special:false;keyword:m_all;op:NOTOKEN),
  380. (str:'FINALLY' ;special:false;keyword:m_class;op:NOTOKEN),
  381. (str:'FORWARD' ;special:false;keyword:m_none;op:NOTOKEN),
  382. (str:'IOCHECK' ;special:false;keyword:m_none;op:NOTOKEN),
  383. (str:'LIBRARY' ;special:false;keyword:m_all;op:NOTOKEN),
  384. (str:'MESSAGE' ;special:false;keyword:m_none;op:NOTOKEN),
  385. (str:'PRIVATE' ;special:false;keyword:m_none;op:NOTOKEN),
  386. (str:'PROGRAM' ;special:false;keyword:m_all;op:NOTOKEN),
  387. (str:'STDCALL' ;special:false;keyword:m_none;op:NOTOKEN),
  388. (str:'SYSCALL' ;special:false;keyword:m_none;op:NOTOKEN),
  389. (str:'VARARGS' ;special:false;keyword:m_none;op:NOTOKEN),
  390. (str:'VIRTUAL' ;special:false;keyword:m_none;op:NOTOKEN),
  391. (str:'ABSOLUTE' ;special:false;keyword:m_none;op:NOTOKEN),
  392. (str:'ABSTRACT' ;special:false;keyword:m_none;op:NOTOKEN),
  393. (str:'CONTINUE' ;special:false;keyword:m_none;op:NOTOKEN),
  394. (str:'CPPCLASS' ;special:false;keyword:m_fpc;op:NOTOKEN),
  395. (str:'EXTERNAL' ;special:false;keyword:m_none;op:NOTOKEN),
  396. (str:'FUNCTION' ;special:false;keyword:m_all;op:NOTOKEN),
  397. (str:'OPERATOR' ;special:false;keyword:m_fpc;op:NOTOKEN),
  398. (str:'OVERLOAD' ;special:false;keyword:m_none;op:NOTOKEN),
  399. (str:'OVERRIDE' ;special:false;keyword:m_none;op:NOTOKEN),
  400. (str:'PLATFORM' ;special:false;keyword:m_none;op:NOTOKEN),
  401. (str:'POPSTACK' ;special:false;keyword:m_none;op:NOTOKEN),
  402. (str:'PROPERTY' ;special:false;keyword:m_class;op:NOTOKEN),
  403. (str:'REGISTER' ;special:false;keyword:m_none;op:NOTOKEN),
  404. (str:'RESIDENT' ;special:false;keyword:m_none;op:NOTOKEN),
  405. (str:'SAFECALL' ;special:false;keyword:m_none;op:NOTOKEN),
  406. (str:'ASSEMBLER' ;special:false;keyword:m_none;op:NOTOKEN),
  407. (str:'INHERITED' ;special:false;keyword:m_all;op:NOTOKEN),
  408. (str:'INTERFACE' ;special:false;keyword:m_all;op:NOTOKEN),
  409. (str:'INTERRUPT' ;special:false;keyword:m_none;op:NOTOKEN),
  410. (str:'NODEFAULT' ;special:false;keyword:m_none;op:NOTOKEN),
  411. (str:'OTHERWISE' ;special:false;keyword:m_all;op:NOTOKEN),
  412. (str:'PROCEDURE' ;special:false;keyword:m_all;op:NOTOKEN),
  413. (str:'PROTECTED' ;special:false;keyword:m_none;op:NOTOKEN),
  414. (str:'PUBLISHED' ;special:false;keyword:m_none;op:NOTOKEN),
  415. (str:'THREADVAR' ;special:false;keyword:m_class;op:NOTOKEN),
  416. (str:'DEPRECATED' ;special:false;keyword:m_all;op:NOTOKEN),
  417. (str:'DESTRUCTOR' ;special:false;keyword:m_all;op:NOTOKEN),
  418. (str:'IMPLEMENTS' ;special:false;keyword:m_none;op:NOTOKEN),
  419. (str:'INTERNPROC' ;special:false;keyword:m_none;op:NOTOKEN),
  420. (str:'OPENSTRING' ;special:false;keyword:m_none;op:NOTOKEN),
  421. (str:'CONSTRUCTOR' ;special:false;keyword:m_all;op:NOTOKEN),
  422. (str:'INTERNCONST' ;special:false;keyword:m_none;op:NOTOKEN),
  423. (str:'REINTRODUCE' ;special:false;keyword:m_none;op:NOTOKEN),
  424. (str:'SHORTSTRING' ;special:false;keyword:m_none;op:NOTOKEN),
  425. (str:'COMPILERPROC' ;special:false;keyword:m_none;op:NOTOKEN),
  426. (str:'FINALIZATION' ;special:false;keyword:m_initfinal;op:NOTOKEN),
  427. (str:'DISPINTERFACE' ;special:false;keyword:m_class;op:NOTOKEN),
  428. (str:'SAVEREGISTERS' ;special:false;keyword:m_none;op:NOTOKEN),
  429. (str:'IMPLEMENTATION';special:false;keyword:m_all;op:NOTOKEN),
  430. (str:'INITIALIZATION';special:false;keyword:m_initfinal;op:NOTOKEN),
  431. (str:'RESOURCESTRING';special:false;keyword:m_class;op:NOTOKEN)
  432. );
  433. var
  434. tokeninfo:ptokenarray;
  435. tokenidx:ptokenidx;
  436. procedure inittokens;
  437. procedure donetokens;
  438. procedure create_tokenidx;
  439. implementation
  440. procedure create_tokenidx;
  441. { create an index with the first and last token for every possible token
  442. length, so a search only will be done in that small part }
  443. var
  444. t : ttoken;
  445. i : longint;
  446. c : char;
  447. begin
  448. fillchar(tokenidx^,sizeof(tokenidx^),0);
  449. for t:=low(ttoken) to high(ttoken) do
  450. begin
  451. if not arraytokeninfo[t].special then
  452. begin
  453. i:=length(arraytokeninfo[t].str);
  454. c:=arraytokeninfo[t].str[1];
  455. if ord(tokenidx^[i,c].first)=0 then
  456. tokenidx^[i,c].first:=t;
  457. tokenidx^[i,c].last:=t;
  458. end;
  459. end;
  460. end;
  461. procedure inittokens;
  462. begin
  463. tokeninfo:=@arraytokeninfo;
  464. new(tokenidx);
  465. create_tokenidx;
  466. end;
  467. procedure donetokens;
  468. begin
  469. tokeninfo:=nil;
  470. dispose(tokenidx);
  471. end;
  472. end.
  473. {
  474. $Log$
  475. Revision 1.13 2001-08-01 15:07:29 jonas
  476. + "compilerproc" directive support, which turns both the public and mangled
  477. name to lowercase(declaration_name). This prevents a normal user from
  478. accessing the routine, but they can still be easily looked up within
  479. the compiler. This is used for helper procedures and should facilitate
  480. the writing of more processor independent code in the code generator
  481. itself (mostly written by Peter)
  482. + new "createintern" constructor for tcal nodes to create a call to
  483. helper exported using the "compilerproc" directive
  484. + support for high(dynamic_array) using the the above new things
  485. + definition of 'HASCOMPILERPROC' symbol (to be able to check in the
  486. compiler and rtl whether the "compilerproc" directive is supported)
  487. Revision 1.12 2001/07/30 20:59:28 peter
  488. * m68k updates from v10 merged
  489. Revision 1.11 2001/06/03 21:57:38 peter
  490. + hint directive parsing support
  491. Revision 1.10 2001/05/06 17:12:43 jonas
  492. - commented out an unused field in tokenrec
  493. Revision 1.9 2001/05/04 15:52:04 florian
  494. * some Delphi incompatibilities fixed:
  495. - out, dispose and new can be used as idenfiers now
  496. - const p = apointerype(nil); is supported now
  497. + support for const p = apointertype(pointer(1234)); added
  498. Revision 1.8 2001/03/22 22:35:43 florian
  499. + support for type a = (a=1); in Delphi mode added
  500. + procedure p(); in Delphi mode supported
  501. + on isn't keyword anymore, it can be used as
  502. id etc. now
  503. Revision 1.7 2000/11/29 00:30:42 florian
  504. * unused units removed from uses clause
  505. * some changes for widestrings
  506. Revision 1.6 2000/11/09 17:46:56 florian
  507. * System.TypeInfo fixed
  508. + System.Finalize implemented
  509. + some new keywords for interface support added
  510. Revision 1.5 2000/10/14 10:14:56 peter
  511. * moehrendorf oct 2000 rewrite
  512. Revision 1.4 2000/09/24 15:06:32 peter
  513. * use defines.inc
  514. Revision 1.3 2000/07/13 12:08:28 michael
  515. + patched to 1.1.0 with former 1.09patch from peter
  516. Revision 1.2 2000/07/13 11:32:52 michael
  517. + removed logs
  518. }