parser.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. This unit does the parsing process
  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 parser;
  19. {$i defines.inc}
  20. interface
  21. {$ifdef PREPROCWRITE}
  22. procedure preprocess(const filename:string);
  23. {$endif PREPROCWRITE}
  24. procedure compile(const filename:string);
  25. procedure initparser;
  26. procedure doneparser;
  27. implementation
  28. uses
  29. cutils,cclasses,
  30. globtype,version,tokens,systems,globals,verbose,
  31. symbase,symtable,symdef,symsym,fmodule,fppu,aasm,
  32. cgbase,
  33. script,gendef,
  34. {$ifdef BrowserLog}
  35. browlog,
  36. {$endif BrowserLog}
  37. {$ifdef UseExcept}
  38. tpexcept,
  39. {$endif UseExcept}
  40. {$ifdef GDB}
  41. gdb,
  42. {$endif GDB}
  43. comphook,
  44. scanner,scandir,
  45. pbase,ptype,pmodules,cresstr;
  46. procedure initparser;
  47. begin
  48. { ^M means a string or a char, because we don't parse a }
  49. { type declaration }
  50. ignore_equal:=false;
  51. { we didn't parse a object or class declaration }
  52. { and no function header }
  53. testcurobject:=0;
  54. { Symtable }
  55. aktprocsym:=nil;
  56. aktprocdef:=nil;
  57. current_module:=nil;
  58. compiled_module:=nil;
  59. procinfo:=nil;
  60. loaded_units:=TLinkedList.Create;
  61. usedunits:=TLinkedList.Create;
  62. { global switches }
  63. aktglobalswitches:=initglobalswitches;
  64. { initialize scanner }
  65. InitScanner;
  66. InitScannerDirectives;
  67. { scanner }
  68. c:=#0;
  69. pattern:='';
  70. orgpattern:='';
  71. current_scanner:=nil;
  72. { memory sizes }
  73. if heapsize=0 then
  74. heapsize:=target_info.heapsize;
  75. if maxheapsize=0 then
  76. maxheapsize:=target_info.maxheapsize;
  77. if stacksize=0 then
  78. stacksize:=target_info.stacksize;
  79. { open assembler response }
  80. GenerateAsmRes(outputexedir+'ppas');
  81. { open deffile }
  82. DefFile:=TDefFile.Create(outputexedir+inputfile+target_info.defext);
  83. { list of generated .o files, so the linker can remove them }
  84. SmartLinkOFiles:=TStringList.Create;
  85. end;
  86. procedure doneparser;
  87. begin
  88. { unload units }
  89. loaded_units.free;
  90. usedunits.free;
  91. { if there was an error in the scanner, the scanner is
  92. still assinged }
  93. if assigned(current_scanner) then
  94. begin
  95. current_scanner.free;
  96. current_scanner:=nil;
  97. end;
  98. { close scanner }
  99. DoneScanner;
  100. { close ppas,deffile }
  101. asmres.free;
  102. deffile.free;
  103. { free list of .o files }
  104. SmartLinkOFiles.Free;
  105. end;
  106. procedure default_macros;
  107. var
  108. hp : tstringlistitem;
  109. begin
  110. { commandline }
  111. hp:=tstringlistitem(initdefines.first);
  112. while assigned(hp) do
  113. begin
  114. current_scanner.def_macro(hp.str);
  115. hp:=tstringlistitem(hp.next);
  116. end;
  117. { set macros for version checking }
  118. current_scanner.set_macro('FPC_VERSION',version_nr);
  119. current_scanner.set_macro('FPC_RELEASE',release_nr);
  120. current_scanner.set_macro('FPC_PATCH',patch_nr);
  121. end;
  122. {$ifdef PREPROCWRITE}
  123. procedure preprocess(const filename:string);
  124. var
  125. i : longint;
  126. begin
  127. new(preprocfile,init('pre'));
  128. { default macros }
  129. current_scanner^.macros:=new(pdictionary,init);
  130. default_macros;
  131. { initialize a module }
  132. current_module:=new(pmodule,init(filename,false));
  133. main_module:=current_module;
  134. { startup scanner, and save in current_module }
  135. current_scanner:=new(pscannerfile,Init(filename));
  136. current_module.scanner:=current_scanner;
  137. { loop until EOF is found }
  138. repeat
  139. current_scanner^.readtoken;
  140. preprocfile^.AddSpace;
  141. case token of
  142. _ID :
  143. begin
  144. preprocfile^.Add(orgpattern);
  145. end;
  146. _REALNUMBER,
  147. _INTCONST :
  148. preprocfile^.Add(pattern);
  149. _CSTRING :
  150. begin
  151. i:=0;
  152. while (i<length(pattern)) do
  153. begin
  154. inc(i);
  155. if pattern[i]='''' then
  156. begin
  157. insert('''',pattern,i);
  158. inc(i);
  159. end;
  160. end;
  161. preprocfile^.Add(''''+pattern+'''');
  162. end;
  163. _CCHAR :
  164. begin
  165. case pattern[1] of
  166. #39 :
  167. pattern:='''''''';
  168. #0..#31,
  169. #128..#255 :
  170. begin
  171. str(ord(pattern[1]),pattern);
  172. pattern:='#'+pattern;
  173. end;
  174. else
  175. pattern:=''''+pattern[1]+'''';
  176. end;
  177. preprocfile^.Add(pattern);
  178. end;
  179. _EOF :
  180. break;
  181. else
  182. preprocfile^.Add(tokeninfo^[token].str)
  183. end;
  184. until false;
  185. { free scanner }
  186. dispose(current_scanner,done);
  187. current_scanner:=nil;
  188. { close }
  189. dispose(preprocfile,done);
  190. end;
  191. {$endif PREPROCWRITE}
  192. procedure compile(const filename:string);
  193. var
  194. { scanner }
  195. oldidtoken,
  196. oldtoken : ttoken;
  197. oldtokenpos : tfileposinfo;
  198. oldc : char;
  199. oldpattern,
  200. oldorgpattern : string;
  201. old_block_type : tblock_type;
  202. oldcurrent_scanner,prev_scanner,
  203. scanner : tscannerfile;
  204. { symtable }
  205. oldrefsymtable,
  206. olddefaultsymtablestack,
  207. oldsymtablestack : tsymtable;
  208. oldaktprocsym : tprocsym;
  209. oldaktprocdef : tprocdef;
  210. oldoverloaded_operators : toverloaded_operators;
  211. { cg }
  212. oldnextlabelnr : longint;
  213. oldparse_only : boolean;
  214. { asmlists }
  215. oldimports,
  216. oldexports,
  217. oldresource,
  218. oldrttilist,
  219. oldresourcestringlist,
  220. oldbsssegment,
  221. olddatasegment,
  222. oldcodesegment,
  223. oldexprasmlist,
  224. olddebuglist,
  225. oldwithdebuglist,
  226. oldconsts : taasmoutput;
  227. oldasmsymbollist : tdictionary;
  228. { resourcestrings }
  229. OldResourceStrings : tResourceStrings;
  230. { akt.. things }
  231. oldaktlocalswitches : tlocalswitches;
  232. oldaktmoduleswitches : tmoduleswitches;
  233. oldaktfilepos : tfileposinfo;
  234. oldaktpackenum,oldaktmaxfpuregisters : longint;
  235. oldaktalignment : talignmentinfo;
  236. oldaktoutputformat : tasm;
  237. oldaktspecificoptprocessor,
  238. oldaktoptprocessor : tprocessors;
  239. oldaktasmmode : tasmmode;
  240. oldaktinterfacetype: tinterfacetypes;
  241. oldaktmodeswitches : tmodeswitches;
  242. old_compiled_module : tmodule;
  243. oldaktdefproccall : tproccalloption;
  244. { will only be increased once we start parsing blocks in the }
  245. { implementation, so doesn't need to be saved/restored (JM) }
  246. { oldexceptblockcounter : integer; }
  247. oldstatement_level : integer;
  248. prev_name : pstring;
  249. {$ifdef USEEXCEPT}
  250. {$ifndef Delphi}
  251. recoverpos : jmp_buf;
  252. oldrecoverpos : pjmp_buf;
  253. {$endif Delphi}
  254. {$endif useexcept}
  255. {$ifdef newcg}
  256. oldcg : pcg;
  257. {$endif newcg}
  258. {$ifdef GDB}
  259. store_dbx : plongint;
  260. {$endif GDB}
  261. begin
  262. inc(compile_level);
  263. prev_name:=stringdup(parser_current_file);
  264. parser_current_file:=filename;
  265. old_compiled_module:=compiled_module;
  266. { save symtable state }
  267. oldsymtablestack:=symtablestack;
  268. olddefaultsymtablestack:=defaultsymtablestack;
  269. oldrefsymtable:=refsymtable;
  270. oldaktprocsym:=aktprocsym;
  271. oldaktprocdef:=aktprocdef;
  272. oldaktdefproccall:=aktdefproccall;
  273. move(overloaded_operators,oldoverloaded_operators,sizeof(toverloaded_operators));
  274. { save scanner state }
  275. oldc:=c;
  276. oldpattern:=pattern;
  277. oldorgpattern:=orgpattern;
  278. oldtoken:=token;
  279. oldidtoken:=idtoken;
  280. old_block_type:=block_type;
  281. oldtokenpos:=akttokenpos;
  282. oldcurrent_scanner:=current_scanner;
  283. { save cg }
  284. oldnextlabelnr:=nextlabelnr;
  285. oldparse_only:=parse_only;
  286. { save assembler lists }
  287. olddatasegment:=datasegment;
  288. oldbsssegment:=bsssegment;
  289. oldcodesegment:=codesegment;
  290. olddebuglist:=debuglist;
  291. oldwithdebuglist:=withdebuglist;
  292. oldconsts:=consts;
  293. oldrttilist:=rttilist;
  294. oldexprasmlist:=exprasmlist;
  295. oldimports:=importssection;
  296. oldexports:=exportssection;
  297. oldresource:=resourcesection;
  298. oldresourcestringlist:=resourcestringlist;
  299. oldasmsymbollist:=asmsymbollist;
  300. OldResourceStrings:=ResourceStrings;
  301. { save akt... state }
  302. { handle the postponed case first }
  303. if localswitcheschanged then
  304. begin
  305. aktlocalswitches:=nextaktlocalswitches;
  306. localswitcheschanged:=false;
  307. end;
  308. oldaktlocalswitches:=aktlocalswitches;
  309. oldaktmoduleswitches:=aktmoduleswitches;
  310. oldaktalignment:=aktalignment;
  311. oldaktpackenum:=aktpackenum;
  312. oldaktmaxfpuregisters:=aktmaxfpuregisters;
  313. oldaktoutputformat:=aktoutputformat;
  314. oldaktoptprocessor:=aktoptprocessor;
  315. oldaktspecificoptprocessor:=aktspecificoptprocessor;
  316. oldaktasmmode:=aktasmmode;
  317. oldaktinterfacetype:=aktinterfacetype;
  318. oldaktfilepos:=aktfilepos;
  319. oldaktmodeswitches:=aktmodeswitches;
  320. oldstatement_level:=statement_level;
  321. { oldexceptblockcounter:=exceptblockcounter; }
  322. {$ifdef newcg}
  323. oldcg:=cg;
  324. {$endif newcg}
  325. {$ifdef GDB}
  326. store_dbx:=dbx_counter;
  327. dbx_counter:=nil;
  328. {$endif GDB}
  329. { show info }
  330. Message1(parser_i_compiling,filename);
  331. { reset symtable }
  332. symtablestack:=nil;
  333. defaultsymtablestack:=nil;
  334. systemunit:=nil;
  335. refsymtable:=nil;
  336. aktprocsym:=nil;
  337. aktdefproccall:=initdefproccall;
  338. registerdef:=true;
  339. statement_level:=0;
  340. aktexceptblock:=0;
  341. exceptblockcounter:=0;
  342. aktmaxfpuregisters:=-1;
  343. fillchar(overloaded_operators,sizeof(toverloaded_operators),0);
  344. { reset the unit or create a new program }
  345. if assigned(current_module) then
  346. begin
  347. {current_module.reset this is wrong !! }
  348. scanner:=tscannerfile(current_module.scanner);
  349. current_module.reset;
  350. tscannerfile(current_module.scanner):=scanner;
  351. end
  352. else
  353. begin
  354. current_module:=tppumodule.create(filename,'',false);
  355. main_module:=current_module;
  356. end;
  357. { a unit compiled at command line must be inside the loaded_unit list }
  358. if (compile_level=1) then
  359. loaded_units.insert(current_module);
  360. { Set the module to use for verbose }
  361. SetCompileModule(current_module);
  362. compiled_module:=current_module;
  363. current_module.in_compile:=true;
  364. { Load current state from the init values }
  365. aktlocalswitches:=initlocalswitches;
  366. aktmoduleswitches:=initmoduleswitches;
  367. aktmodeswitches:=initmodeswitches;
  368. {$IFDEF Testvarsets}
  369. aktsetalloc:=initsetalloc;
  370. {$ENDIF}
  371. aktalignment:=initalignment;
  372. aktpackenum:=initpackenum;
  373. aktoutputformat:=initoutputformat;
  374. set_target_asm(aktoutputformat);
  375. aktoptprocessor:=initoptprocessor;
  376. aktspecificoptprocessor:=initspecificoptprocessor;
  377. aktasmmode:=initasmmode;
  378. aktinterfacetype:=initinterfacetype;
  379. { startup scanner, and save in current_module }
  380. current_scanner:=tscannerfile.Create(filename);
  381. { macros }
  382. default_macros;
  383. { read the first token }
  384. current_scanner.readtoken;
  385. prev_scanner:=tscannerfile(current_module.scanner);
  386. current_module.scanner:=current_scanner;
  387. { init code generator for a new module }
  388. codegen_newmodule;
  389. {$ifdef newcg}
  390. {$ifdef i386}
  391. cg:=new(pcg386,init);
  392. {$endif i386}
  393. {$ifdef alpha}
  394. cg:=new(pcgalpha,init);
  395. {$endif alpha}
  396. {$ifdef powerpc}
  397. cg:=new(pcgppc,init);
  398. {$endif powerpc}
  399. {$endif newcg}
  400. { If the compile level > 1 we get a nice "unit expected" error
  401. message if we are trying to use a program as unit.}
  402. {$ifdef USEEXCEPT}
  403. if setjmp(recoverpos)=0 then
  404. begin
  405. oldrecoverpos:=recoverpospointer;
  406. recoverpospointer:=@recoverpos;
  407. {$endif USEEXCEPT}
  408. if (token=_UNIT) or (compile_level>1) then
  409. begin
  410. current_module.is_unit:=true;
  411. proc_unit;
  412. end
  413. else
  414. proc_program(token=_LIBRARY);
  415. {$ifdef USEEXCEPT}
  416. recoverpospointer:=oldrecoverpos;
  417. end
  418. else
  419. begin
  420. recoverpospointer:=oldrecoverpos;
  421. longjump_used:=true;
  422. end;
  423. {$endif USEEXCEPT}
  424. { clear memory }
  425. {$ifdef Splitheap}
  426. if testsplit then
  427. begin
  428. { temp heap should be empty after that !!!}
  429. codegen_donemodule;
  430. Releasetempheap;
  431. end;
  432. {$endif Splitheap}
  433. { restore old state, close trees, > 0.99.5 has heapblocks, so
  434. it's the default to release the trees }
  435. codegen_donemodule;
  436. {$ifdef newcg}
  437. dispose(cg,done);
  438. {$endif newcg}
  439. { free ppu }
  440. if assigned(tppumodule(current_module).ppufile) then
  441. begin
  442. tppumodule(current_module).ppufile.free;
  443. tppumodule(current_module).ppufile:=nil;
  444. end;
  445. { free scanner }
  446. current_scanner.free;
  447. current_scanner:=nil;
  448. { restore previous scanner !! }
  449. current_module.scanner:=prev_scanner;
  450. if assigned(prev_scanner) then
  451. prev_scanner.invalid:=true;
  452. if (compile_level>1) then
  453. begin
  454. {$ifdef newcg}
  455. cg:=oldcg;
  456. {$endif newcg}
  457. {$ifdef GDB}
  458. dbx_counter:=store_dbx;
  459. {$endif GDB}
  460. { restore scanner }
  461. c:=oldc;
  462. pattern:=oldpattern;
  463. orgpattern:=oldorgpattern;
  464. token:=oldtoken;
  465. idtoken:=oldidtoken;
  466. akttokenpos:=oldtokenpos;
  467. block_type:=old_block_type;
  468. current_scanner:=oldcurrent_scanner;
  469. { restore cg }
  470. nextlabelnr:=oldnextlabelnr;
  471. parse_only:=oldparse_only;
  472. { restore asmlists }
  473. exprasmlist:=oldexprasmlist;
  474. datasegment:=olddatasegment;
  475. bsssegment:=oldbsssegment;
  476. codesegment:=oldcodesegment;
  477. consts:=oldconsts;
  478. debuglist:=olddebuglist;
  479. withdebuglist:=oldwithdebuglist;
  480. importssection:=oldimports;
  481. exportssection:=oldexports;
  482. resourcesection:=oldresource;
  483. rttilist:=oldrttilist;
  484. resourcestringlist:=oldresourcestringlist;
  485. asmsymbollist:=oldasmsymbollist;
  486. ResourceStrings:=OldResourceStrings;
  487. { restore symtable state }
  488. refsymtable:=oldrefsymtable;
  489. symtablestack:=oldsymtablestack;
  490. defaultsymtablestack:=olddefaultsymtablestack;
  491. aktdefproccall:=oldaktdefproccall;
  492. aktprocsym:=oldaktprocsym;
  493. aktprocdef:=oldaktprocdef;
  494. move(oldoverloaded_operators,overloaded_operators,sizeof(toverloaded_operators));
  495. aktlocalswitches:=oldaktlocalswitches;
  496. aktmoduleswitches:=oldaktmoduleswitches;
  497. aktalignment:=oldaktalignment;
  498. aktpackenum:=oldaktpackenum;
  499. aktmaxfpuregisters:=oldaktmaxfpuregisters;
  500. aktoutputformat:=oldaktoutputformat;
  501. set_target_asm(aktoutputformat);
  502. aktoptprocessor:=oldaktoptprocessor;
  503. aktspecificoptprocessor:=oldaktspecificoptprocessor;
  504. aktasmmode:=oldaktasmmode;
  505. aktinterfacetype:=oldaktinterfacetype;
  506. aktfilepos:=oldaktfilepos;
  507. aktmodeswitches:=oldaktmodeswitches;
  508. statement_level:=oldstatement_level;
  509. aktexceptblock:=0;
  510. exceptblockcounter:=0;
  511. end;
  512. { Shut down things when the last file is compiled }
  513. if (compile_level=1) then
  514. begin
  515. { Close script }
  516. if (not AsmRes.Empty) then
  517. begin
  518. Message1(exec_i_closing_script,AsmRes.Fn);
  519. AsmRes.WriteToDisk;
  520. end;
  521. {$ifdef USEEXCEPT}
  522. if not longjump_used then
  523. {$endif USEEXCEPT}
  524. { do not create browsers on errors !! }
  525. if status.errorcount=0 then
  526. begin
  527. {$ifdef BrowserLog}
  528. { Write Browser Log }
  529. if (cs_browser_log in aktglobalswitches) and
  530. (cs_browser in aktmoduleswitches) then
  531. begin
  532. if browserlog.elements_to_list.empty then
  533. begin
  534. Message1(parser_i_writing_browser_log,browserlog.Fname);
  535. WriteBrowserLog;
  536. end
  537. else
  538. browserlog.list_elements;
  539. end;
  540. {$endif BrowserLog}
  541. { Write Browser Collections }
  542. do_extractsymbolinfo{$ifdef FPC}(){$endif};
  543. end;
  544. if current_module.in_second_compile then
  545. begin
  546. current_module.in_second_compile:=false;
  547. current_module.in_compile:=true;
  548. end
  549. else
  550. current_module.in_compile:=false;
  551. (* Obsolete code aktprocsym
  552. is disposed by the localsymtable disposal (PM)
  553. { Free last aktprocsym }
  554. if assigned(aktprocsym) and (aktprocsym.owner=nil) then
  555. begin
  556. { init parts are not needed in units !! }
  557. if current_module.is_unit then
  558. aktprocdef.forwarddef:=false;
  559. dispose(aktprocsym,done);
  560. end; *)
  561. end;
  562. dec(compile_level);
  563. parser_current_file:=prev_name^;
  564. stringdispose(prev_name);
  565. compiled_module:=old_compiled_module;
  566. {$ifdef USEEXCEPT}
  567. if longjump_used then
  568. longjmp(recoverpospointer^,1);
  569. {$endif USEEXCEPT}
  570. end;
  571. end.
  572. {
  573. $Log$
  574. Revision 1.28 2002-04-19 15:46:02 peter
  575. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  576. in most cases and not written to the ppu
  577. * add mangeledname_prefix() routine to generate the prefix of
  578. manglednames depending on the current procedure, object and module
  579. * removed static procprefix since the mangledname is now build only
  580. on demand from tprocdef.mangledname
  581. Revision 1.27 2002/01/29 19:43:11 peter
  582. * update target_asm according to outputformat
  583. Revision 1.26 2001/11/02 22:58:02 peter
  584. * procsym definition rewrite
  585. Revision 1.25 2001/10/25 21:22:35 peter
  586. * calling convention rewrite
  587. Revision 1.24 2001/10/23 21:49:42 peter
  588. * $calling directive and -Cc commandline patch added
  589. from Pavel Ozerski
  590. Revision 1.23 2001/10/16 15:10:35 jonas
  591. * fixed goto/label/try bugs
  592. Revision 1.22 2001/08/26 13:36:43 florian
  593. * some cg reorganisation
  594. * some PPC updates
  595. Revision 1.21 2001/07/30 20:59:27 peter
  596. * m68k updates from v10 merged
  597. Revision 1.20 2001/07/01 20:16:16 peter
  598. * alignmentinfo record added
  599. * -Oa argument supports more alignment settings that can be specified
  600. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  601. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  602. required alignment and the maximum usefull alignment. The final
  603. alignment will be choosen per variable size dependent on these
  604. settings
  605. Revision 1.19 2001/05/19 23:05:19 peter
  606. * support uses <unit> in <file> construction
  607. Revision 1.18 2001/05/06 14:49:17 peter
  608. * ppu object to class rewrite
  609. * move ppu read and write stuff to fppu
  610. Revision 1.17 2001/04/18 22:01:54 peter
  611. * registration of targets and assemblers
  612. Revision 1.16 2001/04/15 09:48:30 peter
  613. * fixed crash in labelnode
  614. * easier detection of goto and label in try blocks
  615. Revision 1.15 2001/04/13 18:08:37 peter
  616. * scanner object to class
  617. Revision 1.14 2001/04/13 01:22:10 peter
  618. * symtable change to classes
  619. * range check generation and errors fixed, make cycle DEBUG=1 works
  620. * memory leaks fixed
  621. Revision 1.13 2000/12/25 00:07:27 peter
  622. + new tlinkedlist class (merge of old tstringqueue,tcontainer and
  623. tlinkedlist objects)
  624. Revision 1.12 2000/12/24 12:24:38 peter
  625. * moved preprocessfile into a conditional
  626. Revision 1.11 2000/11/29 00:30:34 florian
  627. * unused units removed from uses clause
  628. * some changes for widestrings
  629. Revision 1.10 2000/11/12 22:17:46 peter
  630. * some realname updates for messages
  631. Revision 1.9 2000/11/04 14:25:20 florian
  632. + merged Attila's changes for interfaces, not tested yet
  633. Revision 1.8 2000/10/31 22:02:49 peter
  634. * symtable splitted, no real code changes
  635. Revision 1.7 2000/10/14 10:14:51 peter
  636. * moehrendorf oct 2000 rewrite
  637. Revision 1.6 2000/10/01 19:48:25 peter
  638. * lot of compile updates for cg11
  639. Revision 1.5 2000/09/24 15:06:20 peter
  640. * use defines.inc
  641. Revision 1.4 2000/08/27 16:11:51 peter
  642. * moved some util functions from globals,cobjects to cutils
  643. * splitted files into finput,fmodule
  644. Revision 1.3 2000/08/12 15:34:22 peter
  645. + usedasmsymbollist to check and reset only the used symbols (merged)
  646. Revision 1.2 2000/07/13 11:32:44 michael
  647. + removed logs
  648. }