tokendat.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Daniel Mantione, Peter Vreman
  4. Members of the Free Pascal development team
  5. This little program generates a file of tokendata
  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. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. {$ifdef TP}
  20. program tokendat;
  21. uses tokens,globtype;
  22. {$define IncludeTokens}
  23. {$define IncludeCreateTokenIndex}
  24. {$endif TP}
  25. {$ifdef IncludeTokens}
  26. const
  27. arraytokeninfo:array[ttoken] of tokenrec=(
  28. (str:'' ;special:true ;keyword:m_none),
  29. { Operators which can be overloaded }
  30. (str:'+' ;special:true ;keyword:m_none),
  31. (str:'-' ;special:true ;keyword:m_none),
  32. (str:'*' ;special:true ;keyword:m_none),
  33. (str:'/' ;special:true ;keyword:m_none),
  34. (str:'=' ;special:true ;keyword:m_none),
  35. (str:'>' ;special:true ;keyword:m_none),
  36. (str:'<' ;special:true ;keyword:m_none),
  37. (str:'>=' ;special:true ;keyword:m_none),
  38. (str:'<=' ;special:true ;keyword:m_none),
  39. (str:'><' ;special:true ;keyword:m_none),
  40. (str:'**' ;special:true ;keyword:m_none),
  41. (str:'is' ;special:true ;keyword:m_none),
  42. (str:'as' ;special:true ;keyword:m_none),
  43. (str:'in' ;special:true ;keyword:m_none),
  44. (str:':=' ;special:true ;keyword:m_none),
  45. { Special chars }
  46. (str:'^' ;special:true ;keyword:m_none),
  47. (str:'<>' ;special:true ;keyword:m_none),
  48. (str:'[' ;special:true ;keyword:m_none),
  49. (str:']' ;special:true ;keyword:m_none),
  50. (str:'.' ;special:true ;keyword:m_none),
  51. (str:',' ;special:true ;keyword:m_none),
  52. (str:'(' ;special:true ;keyword:m_none),
  53. (str:')' ;special:true ;keyword:m_none),
  54. (str:':' ;special:true ;keyword:m_none),
  55. (str:';' ;special:true ;keyword:m_none),
  56. (str:'@' ;special:true ;keyword:m_none),
  57. (str:'..' ;special:true ;keyword:m_none),
  58. (str:'@@' ;special:true ;keyword:m_none),
  59. (str:'end of file' ;special:true ;keyword:m_none),
  60. (str:'identifier' ;special:true ;keyword:m_none),
  61. (str:'non identifier';special:true ;keyword:m_none),
  62. (str:'const real' ;special:true ;keyword:m_none),
  63. (str:'ordinal const' ;special:true ;keyword:m_none),
  64. (str:'const string' ;special:true ;keyword:m_none),
  65. (str:'const char' ;special:true ;keyword:m_none),
  66. { C like operators }
  67. (str:'+=' ;special:true ;keyword:m_none),
  68. (str:'-=' ;special:true ;keyword:m_none),
  69. (str:'&=' ;special:true ;keyword:m_none),
  70. (str:'|=' ;special:true ;keyword:m_none),
  71. (str:'*=' ;special:true ;keyword:m_none),
  72. (str:'/=' ;special:true ;keyword:m_none),
  73. (str:'' ;special:true ;keyword:m_none),
  74. (str:'' ;special:true ;keyword:m_none),
  75. (str:'' ;special:true ;keyword:m_none),
  76. (str:'' ;special:true ;keyword:m_none),
  77. { Normal words }
  78. (str:'AS' ;special:false;keyword:m_class),
  79. (str:'AT' ;special:false;keyword:m_none),
  80. (str:'DO' ;special:false;keyword:m_all),
  81. (str:'IF' ;special:false;keyword:m_all),
  82. (str:'IN' ;special:false;keyword:m_all),
  83. (str:'IS' ;special:false;keyword:m_class),
  84. (str:'OF' ;special:false;keyword:m_all),
  85. (str:'ON' ;special:false;keyword:m_class),
  86. (str:'OR' ;special:false;keyword:m_all),
  87. (str:'TO' ;special:false;keyword:m_all),
  88. (str:'AND' ;special:false;keyword:m_all),
  89. (str:'ASM' ;special:false;keyword:m_all),
  90. (str:'DIV' ;special:false;keyword:m_all),
  91. (str:'END' ;special:false;keyword:m_all),
  92. (str:'FAR' ;special:false;keyword:m_none),
  93. (str:'FOR' ;special:false;keyword:m_all),
  94. (str:'MOD' ;special:false;keyword:m_all),
  95. (str:'NEW' ;special:false;keyword:m_all),
  96. (str:'NIL' ;special:false;keyword:m_all),
  97. (str:'NOT' ;special:false;keyword:m_all),
  98. (str:'SET' ;special:false;keyword:m_all),
  99. (str:'SHL' ;special:false;keyword:m_all),
  100. (str:'SHR' ;special:false;keyword:m_all),
  101. (str:'TRY' ;special:false;keyword:m_class),
  102. (str:'VAR' ;special:false;keyword:m_all),
  103. (str:'XOR' ;special:false;keyword:m_all),
  104. (str:'CASE' ;special:false;keyword:m_all),
  105. (str:'CVAR' ;special:false;keyword:m_none),
  106. (str:'ELSE' ;special:false;keyword:m_all),
  107. (str:'EXIT' ;special:false;keyword:m_all),
  108. (str:'FAIL' ;special:false;keyword:m_none), { only set within constructors PM }
  109. (str:'FILE' ;special:false;keyword:m_all),
  110. (str:'GOTO' ;special:false;keyword:m_all),
  111. (str:'NAME' ;special:false;keyword:m_none),
  112. (str:'NEAR' ;special:false;keyword:m_none),
  113. (str:'READ' ;special:false;keyword:m_none),
  114. (str:'SELF' ;special:false;keyword:m_none), {set inside methods only PM }
  115. (str:'THEN' ;special:false;keyword:m_all),
  116. (str:'TRUE' ;special:false;keyword:m_all),
  117. (str:'TYPE' ;special:false;keyword:m_all),
  118. (str:'UNIT' ;special:false;keyword:m_all),
  119. (str:'USES' ;special:false;keyword:m_all),
  120. (str:'WITH' ;special:false;keyword:m_all),
  121. (str:'ALIAS' ;special:false;keyword:m_none),
  122. (str:'ARRAY' ;special:false;keyword:m_all),
  123. (str:'BEGIN' ;special:false;keyword:m_all),
  124. (str:'BREAK' ;special:false;keyword:m_none),
  125. (str:'CDECL' ;special:false;keyword:m_none),
  126. (str:'CLASS' ;special:false;keyword:m_class),
  127. (str:'CONST' ;special:false;keyword:m_all),
  128. (str:'FALSE' ;special:false;keyword:m_all),
  129. (str:'INDEX' ;special:false;keyword:m_none),
  130. (str:'LABEL' ;special:false;keyword:m_all),
  131. (str:'RAISE' ;special:false;keyword:m_class),
  132. (str:'UNTIL' ;special:false;keyword:m_all),
  133. (str:'WHILE' ;special:false;keyword:m_all),
  134. (str:'WRITE' ;special:false;keyword:m_none),
  135. (str:'DOWNTO' ;special:false;keyword:m_all),
  136. (str:'EXCEPT' ;special:false;keyword:m_class),
  137. (str:'EXPORT' ;special:false;keyword:m_none),
  138. (str:'INLINE' ;special:false;keyword:m_none),
  139. (str:'OBJECT' ;special:false;keyword:m_all),
  140. (str:'PACKED' ;special:false;keyword:m_all),
  141. (str:'PASCAL' ;special:false;keyword:m_none),
  142. (str:'PUBLIC' ;special:false;keyword:m_none),
  143. (str:'RECORD' ;special:false;keyword:m_all),
  144. (str:'REPEAT' ;special:false;keyword:m_all),
  145. (str:'RESULT' ;special:false;keyword:m_none),
  146. (str:'STATIC' ;special:false;keyword:m_none),
  147. (str:'STORED' ;special:false;keyword:m_none),
  148. (str:'STRING' ;special:false;keyword:m_all),
  149. (str:'SYSTEM' ;special:false;keyword:m_none),
  150. (str:'ASMNAME' ;special:false;keyword:m_none),
  151. (str:'DEFAULT' ;special:false;keyword:m_none),
  152. (str:'DISPOSE' ;special:false;keyword:m_all),
  153. (str:'DYNAMIC' ;special:false;keyword:m_none),
  154. (str:'EXPORTS' ;special:false;keyword:m_all),
  155. (str:'FINALLY' ;special:false;keyword:m_class),
  156. (str:'FORWARD' ;special:false;keyword:m_none),
  157. (str:'IOCHECK' ;special:false;keyword:m_none),
  158. (str:'LIBRARY' ;special:false;keyword:m_all),
  159. (str:'MESSAGE' ;special:false;keyword:m_none),
  160. (str:'PRIVATE' ;special:false;keyword:m_none),
  161. (str:'PROGRAM' ;special:false;keyword:m_all),
  162. (str:'STDCALL' ;special:false;keyword:m_none),
  163. (str:'SYSCALL' ;special:false;keyword:m_none),
  164. (str:'VIRTUAL' ;special:false;keyword:m_none),
  165. (str:'ABSOLUTE' ;special:false;keyword:m_none),
  166. (str:'ABSTRACT' ;special:false;keyword:m_none),
  167. (str:'CONTINUE' ;special:false;keyword:m_none),
  168. (str:'EXTERNAL' ;special:false;keyword:m_none),
  169. (str:'FUNCTION' ;special:false;keyword:m_all),
  170. (str:'OPERATOR' ;special:false;keyword:m_fpc),
  171. (str:'OVERRIDE' ;special:false;keyword:m_none),
  172. (str:'POPSTACK' ;special:false;keyword:m_none),
  173. (str:'PROPERTY' ;special:false;keyword:m_class),
  174. (str:'REGISTER' ;special:false;keyword:m_none),
  175. (str:'RESIDENT' ;special:false;keyword:m_none),
  176. (str:'SAFECALL' ;special:false;keyword:m_none),
  177. (str:'ASSEMBLER' ;special:false;keyword:m_none),
  178. (str:'INHERITED' ;special:false;keyword:m_all),
  179. (str:'INTERFACE' ;special:false;keyword:m_all),
  180. (str:'INTERRUPT' ;special:false;keyword:m_none),
  181. (str:'NODEFAULT' ;special:false;keyword:m_none),
  182. (str:'OTHERWISE' ;special:false;keyword:m_all),
  183. (str:'PROCEDURE' ;special:false;keyword:m_all),
  184. (str:'PROTECTED' ;special:false;keyword:m_none),
  185. (str:'PUBLISHED' ;special:false;keyword:m_none),
  186. (str:'THREADVAR' ;special:false;keyword:m_class),
  187. (str:'DESTRUCTOR' ;special:false;keyword:m_all),
  188. (str:'INTERNPROC' ;special:false;keyword:m_none),
  189. (str:'OPENSTRING' ;special:false;keyword:m_none),
  190. (str:'CONSTRUCTOR' ;special:false;keyword:m_all),
  191. (str:'INTERNCONST' ;special:false;keyword:m_none),
  192. (str:'SHORTSTRING' ;special:false;keyword:m_none),
  193. (str:'FINALIZATION' ;special:false;keyword:m_initfinal),
  194. (str:'SAVEREGISTERS' ;special:false;keyword:m_none),
  195. (str:'IMPLEMENTATION';special:false;keyword:m_all),
  196. (str:'INITIALIZATION';special:false;keyword:m_initfinal),
  197. (str:'RESOURCESTRING';special:false;keyword:m_class)
  198. );
  199. {$endif IncludeTokens}
  200. {Header is designed both to identify the file and to display a nice
  201. message when you use the type command on it.
  202. Explanation:
  203. #8 String length is also displayed. A backspace erases it.
  204. #13#10 Needed to display dos prompt on next line.
  205. #26 End of file. Causes type to stop reading the file.
  206. }
  207. {$ifdef IncludeCreateTokenIndex}
  208. procedure create_tokenidx;
  209. { create an index with the first and last token for every possible token
  210. length, so a search only will be done in that small part }
  211. var t : ttoken;
  212. begin
  213. fillchar(tokenidx^,sizeof(tokenidx^),0);
  214. for t:=low(ttoken) to high(ttoken) do
  215. begin
  216. if not arraytokeninfo[t].special then
  217. begin
  218. if ord(tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first)=0 then
  219. tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first:=t;
  220. tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].last:=t;
  221. end;
  222. end;
  223. end;
  224. {$endif IncludeCreateTokenIndex}
  225. {$ifdef TP}
  226. const headerstr:string[length(tokheader)]=tokheader;
  227. var f:file;
  228. a:longint;
  229. begin
  230. new(tokenidx);
  231. create_tokenidx;
  232. assign(f,'tokens.dat');
  233. rewrite(f,1);
  234. {Write header...}
  235. blockwrite(f,headerstr,sizeof(headerstr));
  236. {Write size of tokeninfo.}
  237. a:=sizeof(tokeninfo);
  238. blockwrite(f,a,sizeof(a));
  239. {Write tokeninfo.}
  240. blockwrite(f,tokeninfo,sizeof(tokeninfo));
  241. {Write tokenindex.}
  242. blockwrite(f,tokenidx^,sizeof(tokenidx^));
  243. close(f);
  244. dispose(tokenidx);
  245. end.
  246. {$endif TP}