TFAOParser.Mod 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. MODULE TFAOParser; (** AUTHOR "tf"; PURPOSE "Parser for AO --> CI"; *)
  2. IMPORT
  3. S := BimboScanner, TS := TFTypeSys, Texts, TextUtilities, Files, Strings, KernelLog, Streams, TFDumpTS, Commands, Kernel, TFCheck;
  4. TYPE
  5. Parser*= OBJECT
  6. VAR s : S.Scanner;
  7. m* : TS.Module;
  8. pos : LONGINT;
  9. comments : TS.Comments;
  10. lastStatement : TS.Statement;
  11. (* add the comment to the currents tructure *)
  12. PROCEDURE CommentToStructure;
  13. VAR str : Strings.String;
  14. comment : TS.Comment;
  15. BEGIN
  16. ASSERT(s.commentStr # NIL);
  17. str := s.commentStr.GetString();
  18. IF str # NIL THEN
  19. comment := TS.AddComment(comments, str^);
  20. StorePos(comment.pos)
  21. END
  22. END CommentToStructure;
  23. PROCEDURE Next;
  24. VAR lpos : LONGINT;
  25. BEGIN
  26. s.Next;
  27. lpos := s.pos;
  28. WHILE (s.sym = S.comment) OR (s.sym = S.newLine) DO
  29. IF (s.sym = S.comment) THEN CommentToStructure
  30. ELSIF s.sym = S.newLine THEN
  31. IF (comments # NIL) & (lastStatement # NIL) THEN lastStatement.postComment := comments; comments := NIL END;
  32. lastStatement := NIL;
  33. END;
  34. s.Next
  35. END;
  36. lpos := s.pos;
  37. ASSERT((s.sym = S.eof) OR (s.pos > pos)); (* Assert progress *)
  38. pos := s.pos;
  39. END Next;
  40. PROCEDURE StorePos(VAR pos : TS.Position);
  41. BEGIN
  42. pos.valid := TRUE;
  43. pos.a := s.lastpos; pos.b := s.curpos - 1
  44. END StorePos;
  45. PROCEDURE Error(CONST str : ARRAY OF CHAR);
  46. BEGIN
  47. KernelLog.Ln;
  48. KernelLog.String("pos= "); KernelLog.Int(s.pos, 0); KernelLog.String(" "); KernelLog.String(str);
  49. KernelLog.Ln;
  50. (* HALT(123456); *)
  51. END Error;
  52. PROCEDURE Warn(CONST str : ARRAY OF CHAR);
  53. BEGIN
  54. KernelLog.Ln;
  55. KernelLog.String("pos= "); KernelLog.Int(s.pos, 0); KernelLog.String(" "); KernelLog.String(str);
  56. KernelLog.Ln;
  57. END Warn;
  58. PROCEDURE Eat(sym : LONGINT);
  59. VAR t, str : ARRAY 32 OF CHAR;
  60. BEGIN
  61. IF s.sym = sym THEN Next;
  62. ELSE
  63. str := "sym = "; Strings.IntToStr(sym, t); Strings.Append(str, t); Strings.Append(str, " expected");
  64. Error(str)
  65. END
  66. END Eat;
  67. PROCEDURE ImportList;
  68. VAR
  69. imp : TS.Import;
  70. BEGIN
  71. Next;
  72. WHILE s.sym = S.ident DO
  73. NEW(imp);
  74. imp.name := Strings.NewString(s.str);
  75. StorePos(imp.pos);
  76. Next;
  77. IF s.sym = S.in THEN (* ignore package *)
  78. Next;
  79. imp.package := Strings.NewString(s.str);
  80. Eat(S.ident);
  81. imp.import := imp.name
  82. ELSIF s.sym = S.becomes THEN
  83. Next;
  84. IF s.sym = S.ident THEN
  85. imp.import := Strings.NewString(s.str);
  86. Next;
  87. IF s.sym = S.in THEN (* ignore package *)
  88. Next;
  89. imp.package := Strings.NewString(s.str);
  90. Eat(S.ident)
  91. END
  92. ELSE
  93. Error("Name of imported module expected")
  94. END;
  95. ELSE
  96. imp.import := imp.name
  97. END;
  98. m.scope.elements.Add(imp);
  99. IF s.sym = S.comma THEN Next END;
  100. END;
  101. Eat(S.semicolon);
  102. END ImportList;
  103. PROCEDURE ProcedureType(scope : TS.Scope) : TS.ProcedureType;
  104. VAR proc : TS.ProcedureType;
  105. BEGIN
  106. NEW(proc);
  107. SysFlag;
  108. IF s.sym = S.lbrace THEN
  109. Next;
  110. IF s.sym # S.ident THEN
  111. (* Error *)
  112. ELSIF s.str = "DELEGATE" THEN
  113. proc.delegate := TRUE;
  114. END;
  115. Next;
  116. Eat(S.rbrace);
  117. END;
  118. IF s.sym = S.lparen THEN
  119. proc.signature := ProcSignature(scope);
  120. END;
  121. RETURN proc
  122. END ProcedureType;
  123. (* *)
  124. PROCEDURE Type(scope : TS.Scope; CONST name : ARRAY OF CHAR) : TS.Type;
  125. VAR type : TS.Type; ident : TS.Ident; str : ARRAY 8 OF CHAR;
  126. BEGIN
  127. NEW(type);
  128. type.container := scope;
  129. CASE s.sym OF
  130. | S.array: Next; type.kind := TS.TArray; NEW(type.array); Array(type.array, scope);
  131. | S.record: Next; type.kind := TS.TRecord; NEW(type.record); Record(type.record, scope);
  132. | S.pointer: Next; type.kind := TS.TPointer; NEW(type.pointer); type.pointer := Pointer(scope);
  133. | S.object: Next; type.kind := TS.TObject; type.object := Object(name);
  134. (* Handle the ANY case *)
  135. IF type.object = NIL THEN
  136. type.kind := TS.TAlias;
  137. NEW(ident); str := "OBJECT"; ident.name := TS.s.AddString(str); type.qualident := ident
  138. END;
  139. | S.procedure: Next; type.kind := TS.TProcedure; type.procedure := ProcedureType(scope);
  140. | S.ident: type.kind := TS.TAlias; type.qualident := Designator();
  141. ELSE
  142. (* Error *)
  143. Error("Illegal Type");
  144. Next (* ??? *)
  145. END;
  146. RETURN type
  147. END Type;
  148. PROCEDURE Pointer(scope : TS.Scope) : TS.Pointer;
  149. VAR p : TS.Pointer;
  150. BEGIN
  151. SysFlag;
  152. Eat(S.to);
  153. NEW(p);
  154. p.type := Type(scope, "");
  155. RETURN p
  156. END Pointer;
  157. PROCEDURE DeclSeq(declarations: TS.Scope);
  158. VAR
  159. ol : TS.ObjectList;
  160. i, j : LONGINT;
  161. PROCEDURE CheckEndOrSemicolon;
  162. BEGIN
  163. IF s.sym # S.end THEN
  164. REPEAT Eat(S.semicolon) UNTIL s.sym # S.semicolon
  165. END
  166. END CheckEndOrSemicolon;
  167. BEGIN
  168. LOOP
  169. CASE s.sym OF
  170. | S.const:
  171. Next;
  172. WHILE s.sym = S.ident DO
  173. declarations.Add(ConstDecl());
  174. CheckEndOrSemicolon()
  175. END;
  176. | S.type:
  177. Next;
  178. WHILE s.sym = S.ident DO
  179. declarations.Add(TypeDecl(declarations));
  180. CheckEndOrSemicolon();
  181. END;
  182. | S.var:
  183. Next;
  184. WHILE s.sym = S.ident DO
  185. ol := VarDecl(declarations);
  186. FOR i := 0 TO ol.nofObjs - 1 DO
  187. ol.objs[i](TS.Var).varNr := i;
  188. declarations.Add(ol.objs[i](TS.Var))
  189. END;
  190. CheckEndOrSemicolon();
  191. END;
  192. | S.procedure:
  193. WHILE s.sym = S.procedure DO
  194. Next;
  195. declarations.Add(ProcDecl(declarations));
  196. CheckEndOrSemicolon();
  197. END;
  198. ELSE
  199. EXIT;
  200. END;
  201. END;
  202. j := 0;
  203. FOR i := 0 TO declarations.elements.nofObjs - 1 DO
  204. IF declarations.elements.objs[i] IS TS.Var THEN
  205. declarations.elements.objs[i](TS.Var).varNr := j;
  206. INC(j)
  207. END
  208. END
  209. END DeclSeq;
  210. PROCEDURE ConstDecl() : TS.Const;
  211. VAR c : TS.Const;
  212. BEGIN
  213. IF s.sym # S.ident THEN Error("Ident expect") END;
  214. NEW(c); c.name := Strings.NewString(s.str);
  215. StorePos(c.pos);
  216. Next;
  217. c.exportState := VisibilityModifier();
  218. Eat(S.eql);
  219. c.expression := Expression();
  220. RETURN c
  221. END ConstDecl;
  222. PROCEDURE TypeDecl(scope : TS.Scope) : TS.TypeDecl;
  223. VAR t : TS.TypeDecl;
  224. BEGIN
  225. IF s.sym # S.ident THEN Error("Ident expect") END;
  226. NEW(t); StorePos(t.pos); t.name := Strings.NewString(s.str);
  227. Next;
  228. t.exportState := VisibilityModifier();
  229. Eat(S.eql);
  230. t.type := Type(scope, t.name^);
  231. RETURN t
  232. END TypeDecl;
  233. PROCEDURE VarDecl(scope : TS.Scope) : TS.ObjectList;
  234. VAR
  235. ol : TS.ObjectList;
  236. v : TS.Var;
  237. t : TS.Type;
  238. i : LONGINT;
  239. BEGIN
  240. NEW(ol);
  241. IF s.sym # S.ident THEN Error("Ident expect") END;
  242. NEW(v); StorePos(v.pos); v.name := Strings.NewString(s.str); ol.Add(v);
  243. Next;
  244. v.exportState := VisibilityModifier();
  245. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  246. SysFlag;
  247. WHILE s.sym = S.comma DO
  248. Next;
  249. IF s.sym # S.ident THEN Error("Ident expect") END;
  250. NEW(v); StorePos(v.pos); v.name := Strings.NewString(s.str); ol.Add(v);
  251. Next;
  252. v.exportState := VisibilityModifier();
  253. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  254. SysFlag;
  255. END;
  256. Eat(S.colon);
  257. t := Type(scope, v.name^);
  258. FOR i := 0 TO ol.nofObjs - 1 DO ol.objs[i](TS.Var).type := t END;
  259. RETURN ol
  260. END VarDecl;
  261. PROCEDURE Object(CONST name : ARRAY OF CHAR) : TS.Class;
  262. VAR
  263. pos: LONGINT;
  264. qualident: TS.Designator;
  265. class : TS.Class;
  266. body : TS.Statement;
  267. BEGIN
  268. NEW(class);
  269. NEW(class.scope);
  270. class.name := Strings.NewString(name);
  271. class.container := m.scope;
  272. class.scope.parent := m.scope;
  273. class.scope.owner := class;
  274. IF (s.sym = S.semicolon) OR (s.sym = S.rparen) THEN RETURN NIL END;
  275. SysFlag;
  276. IF s.sym = S.lparen THEN
  277. Next;
  278. class.scope.superQualident := Designator();
  279. Eat(S.rparen);
  280. END;
  281. IF (s.sym = S.semicolon) THEN Eat(S.semicolon); Warn("Superfluous Semicolon") END;
  282. IF s.sym = S.implements THEN
  283. Next;
  284. qualident := Designator();
  285. WHILE s.sym = S.comma DO
  286. Next;
  287. qualident := Designator();
  288. END;
  289. END;
  290. IF (s.sym # S.begin) & (s.sym # S.end) & (s.sym # S.eof) THEN
  291. (* (* avoid endless-loop *)
  292. IF pos = s.errpos THEN Next END; *)
  293. pos := s.errpos;
  294. DeclSeq(class.scope)
  295. END;
  296. IF s.sym = S.begin THEN
  297. Next;
  298. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  299. body := StatementSequence();
  300. class.scope.ownerBody := body
  301. END;
  302. Eat(S.end);
  303. StorePos(class.altPos);
  304. IF s.sym = S.ident THEN
  305. IF s.str # name THEN Error("object name does not match") END;
  306. Next
  307. END;
  308. RETURN class
  309. END Object;
  310. PROCEDURE BlockAttributes;
  311. VAR q : TS.Designator;
  312. BEGIN
  313. Next;
  314. IF s.sym # S.rbrace THEN
  315. q := Designator();
  316. WHILE s.sym = S.comma DO
  317. Next;
  318. q := Designator()
  319. END
  320. END;
  321. END BlockAttributes;
  322. PROCEDURE Set(): TS.Set;
  323. VAR set : TS.Set;
  324. cr, f: TS.SetRange;
  325. BEGIN
  326. NEW(set);
  327. IF s.sym # S.rbrace THEN
  328. REPEAT
  329. IF s.sym= S.comma THEN Next END;
  330. IF f = NIL THEN NEW(f); cr := f ELSE NEW(cr.next); cr := cr.next END;
  331. cr.a := Expression();
  332. IF s.sym = S.upto THEN
  333. Next; cr.b := Expression();
  334. END;
  335. UNTIL s.sym # S.comma;
  336. set.setRanges := f
  337. ELSE
  338. (* empty set *)
  339. END;
  340. RETURN set
  341. END Set;
  342. PROCEDURE Factor():TS.Expression;
  343. VAR sym, pos : LONGINT;
  344. ex : TS.Expression;
  345. BEGIN
  346. sym := s.sym; pos := s.pos;
  347. CASE s.sym OF
  348. |S.number : ex := TS.PrimitiveExpressionInt(s.intval); Next;
  349. |S.string: ex := TS.PrimitiveExpressionString(s.str); Next;
  350. |S.nil : ex := TS.PrimitiveExpressionNIL(); Next
  351. |S.true: ex := TS.PrimitiveExpressionBool(TRUE); Next
  352. |S.false: ex := TS.PrimitiveExpressionBool(FALSE); Next
  353. |S.lbrace: Next; ex := TS.PrimitiveExpressionSet(Set()); Eat(S.rbrace);
  354. |S.lparen: Next; ex := Expression(); Eat(S.rparen)
  355. |S.not: Next; ex := TS.UnaryExpression(TS.OpInvert, Factor());
  356. |S.ident: ex := TS.CreateDesignatorExpression(Designator());
  357. ELSE
  358. Error("Unexpected Symbol");
  359. END;
  360. (* ASSERT(ex # NIL); *)
  361. RETURN ex
  362. END Factor;
  363. PROCEDURE Term() : TS.Expression;
  364. VAR exa, exb : TS.Expression;
  365. op : LONGINT;
  366. pos : LONGINT;
  367. BEGIN
  368. pos := s.pos;
  369. exa := Factor();
  370. WHILE (s.sym >= S.times) & (s.sym <= S.and) DO
  371. CASE s.sym OF
  372. |S.times : op := TS.OpMul;
  373. |S.slash : op := TS.OpDiv;
  374. |S.div : op := TS.OpIntDiv;
  375. |S.mod : op := TS.OpMod;
  376. |S.and : op := TS.OpAnd;
  377. END;
  378. Next;
  379. exb := Factor();
  380. exa := TS.BinaryExpression(op, exa, exb);
  381. END;
  382. (* ASSERT(exa # NIL); *)
  383. RETURN exa;
  384. END Term;
  385. PROCEDURE SimpleExpression() : TS.Expression;
  386. VAR exa, exb : TS.Expression;
  387. op : LONGINT;
  388. neg : BOOLEAN;
  389. BEGIN
  390. neg := (s.sym = S.minus);
  391. IF (s.sym = S.plus) OR (s.sym = S.minus) THEN Next END;
  392. exa := Term();
  393. IF neg THEN exa := TS.UnaryExpression(TS.OpNegate, exa) END;
  394. WHILE (s.sym >= S.plus) & (s.sym <= S.or) DO
  395. CASE s.sym OF
  396. |S.plus : op := TS.OpAdd;
  397. |S.minus : op := TS.OpSub;
  398. |S.or : op := TS.OpOr;
  399. END;
  400. Next;
  401. exb := Term();
  402. exa := TS.BinaryExpression(op, exa, exb)
  403. END;
  404. (*ASSERT(exa # NIL); *)
  405. RETURN exa
  406. END SimpleExpression;
  407. PROCEDURE Expression () : TS.Expression;
  408. VAR exa, exb : TS.Expression;
  409. op : LONGINT;
  410. BEGIN
  411. exa := SimpleExpression();
  412. IF (s.sym >= S.eql) & (s.sym <= S.is) THEN
  413. CASE s.sym OF
  414. |S.eql : op := TS.OpEql;
  415. |S.neq : op := TS.OpNeq;
  416. |S.lss : op := TS.OpLss;
  417. |S.leq : op := TS.OpLeq;
  418. |S.gtr : op := TS.OpGtr;
  419. |S.geq : op := TS.OpGeq;
  420. |S.in : op := TS.OpIn;
  421. |S.is : op := TS.OpIs;
  422. END;
  423. Next;
  424. exb := SimpleExpression();
  425. exa := TS.BinaryExpression(op, exa, exb)
  426. END;
  427. (* ASSERT(exa # NIL); *)
  428. RETURN exa
  429. END Expression;
  430. PROCEDURE ExpressionList():TS.ExpressionList;
  431. VAR f, c : TS.ExpressionList;
  432. BEGIN
  433. NEW(f);
  434. f.expression := Expression();
  435. c := f;
  436. WHILE (s.sym = S.comma) DO
  437. Next;
  438. NEW(c.next);
  439. c := c.next;
  440. c.expression := Expression()
  441. END;
  442. RETURN f
  443. END ExpressionList;
  444. PROCEDURE Designator () : TS.Designator;
  445. VAR f, c : TS.Designator;
  446. parameters : TS.ActualParameters;
  447. index : TS.Index;
  448. newIdent : TS.Ident;
  449. deref : TS.Dereference;
  450. BEGIN
  451. NEW(newIdent); StorePos(newIdent.pos);
  452. newIdent.name := TS.s.AddString(s.str); (* Strings.NewString(s.str); *)
  453. f := newIdent; c := f;
  454. Next;
  455. WHILE (s.sym = S.lbrak) OR (s.sym = S.period) OR (s.sym = S.lparen) OR (s.sym = S.lparen) OR (s.sym = S.arrow) DO
  456. CASE s.sym OF
  457. | S.lbrak : Next; NEW(index); index.expressionList := ExpressionList(); c.next := index; c := c.next; Eat(S.rbrak);
  458. | S.period : Next; NEW(newIdent); StorePos(newIdent.pos);
  459. newIdent.name := TS.s.AddString(s.str); (*Strings.NewString(s.str);*) c.next := newIdent; c := c.next; Next;
  460. | S.arrow: NEW(deref); c.next := deref; c := c.next; Next;
  461. | S.lparen : Next; NEW(parameters);
  462. IF s.sym # S.rparen THEN parameters.expressionList := ExpressionList() ELSE parameters.expressionList := NIL END;
  463. c.next := parameters; c := c.next;
  464. Eat(S.rparen);
  465. END
  466. END;
  467. RETURN f
  468. END Designator;
  469. PROCEDURE IFStatement() : TS.IFStatement;
  470. VAR f, c, if : TS.IFStatement;
  471. BEGIN
  472. f := NIL;
  473. REPEAT
  474. Next;
  475. NEW(if);
  476. IF f = NIL THEN f := if; c := f ELSE c.else := if; c := if END;
  477. if.expression := Expression();
  478. Eat(S.then);
  479. if.then := StatementSequence()
  480. UNTIL s.sym # S.elsif;
  481. IF s.sym = S.else THEN
  482. Next;
  483. c.else := StatementSequence()
  484. END;
  485. Eat(S.end);
  486. IF s.sym = S.semicolon THEN Next END;
  487. RETURN f
  488. END IFStatement;
  489. PROCEDURE Case() : TS.Case;
  490. VAR
  491. case : TS.Case;
  492. f, cr : TS.CaseRange;
  493. BEGIN
  494. NEW(case);
  495. REPEAT
  496. IF s.sym= S.comma THEN Next END;
  497. IF f = NIL THEN NEW(f); cr := f ELSE NEW(cr.next); cr := cr.next END;
  498. cr.a := Expression();
  499. IF s.sym = S.upto THEN
  500. Next; cr.b := Expression();
  501. END;
  502. UNTIL s.sym # S.comma;
  503. Eat(S.colon);
  504. case.caseRanges := f;
  505. case.statements := StatementSequence();
  506. RETURN case
  507. END Case;
  508. PROCEDURE StatementSequence() : TS.Statement;
  509. VAR ex, fromEx, toEx, byEx : TS.Expression;
  510. f, n, sequence : TS.Statement;
  511. designator, designator2 : TS.Designator;
  512. fcase, ccase : TS.Case;
  513. PROCEDURE Add(new : TS.Statement);
  514. BEGIN
  515. IF comments # NIL THEN new.preComment := comments; comments := NIL END;
  516. lastStatement := new;
  517. IF f = NIL THEN f := new; n := new;
  518. ELSE n.next := new; n := new
  519. END
  520. END Add;
  521. BEGIN
  522. WHILE (s.sym # S.end) & (s.sym # S.else) & (s.sym # S.elsif) & (s.sym # S.until) & (s.sym # S.bar) & (s.sym # S.eof) DO
  523. CASE s.sym OF
  524. |S.ident :
  525. designator := Designator();
  526. IF s.sym = S.becomes THEN Next; ex := Expression();
  527. Add(TS.CreateAssignment(designator, ex))
  528. ELSE
  529. Add( TS.CreateProcedureCall(designator))
  530. END
  531. |S.if :
  532. Add(IFStatement())
  533. |S.while :
  534. Next;
  535. ex := Expression();
  536. Eat(S.do);
  537. Add(TS.CreateWhile(ex, StatementSequence()));
  538. Eat(S.end);
  539. |S.repeat :
  540. Next;
  541. sequence := StatementSequence();
  542. Eat(S.until);
  543. Add(TS.CreateRepeat(Expression(), sequence))
  544. |S.for :
  545. Next;
  546. designator := Designator();
  547. Eat(S.becomes);
  548. fromEx := Expression(); Eat(S.to); toEx := Expression();
  549. IF s.sym = S.by THEN
  550. Next;
  551. byEx := Expression()
  552. ELSE byEx := NIL;
  553. END;
  554. Eat(S.do);
  555. sequence := StatementSequence();
  556. Add(TS.CreateFor(designator, fromEx, toEx, byEx, sequence));
  557. Eat(S.end)
  558. |S.loop :
  559. Next;
  560. Add(TS.CreateLoop(StatementSequence()));
  561. Eat(S.end);
  562. |S.exit :
  563. Next;
  564. Add(TS.CreateExit())
  565. |S.return :
  566. Next;
  567. IF s.sym < S.semicolon THEN ex := Expression() ELSE ex := NIL END;
  568. Add(TS.CreateReturn(ex))
  569. |S.case :
  570. Next;
  571. fcase := NIL; ccase := NIL;
  572. ex := Expression();
  573. Eat(S.of);
  574. WHILE s.sym <= S.bar DO
  575. IF s.sym = S.bar THEN Next END;
  576. IF s.sym # S.else THEN
  577. IF fcase = NIL THEN fcase := Case(); ccase := fcase
  578. ELSE ccase.next := Case(); ccase := ccase.next
  579. END
  580. ELSE
  581. Warn("Illegal '|' before 'ELSE'")
  582. END
  583. END;
  584. sequence := NIL;
  585. IF s.sym = S.else THEN
  586. Next;
  587. sequence := StatementSequence();
  588. END;
  589. Add(TS.CreateCase(ex, fcase, sequence));
  590. Eat(S.end)
  591. |S.finally : Next;
  592. |S.begin : Add(StatementBlock()); Eat(S.end);
  593. |S.with : Next; designator := Designator(); Eat(S.colon); designator2 := Designator(); Eat(S.do);
  594. sequence := StatementSequence(); Eat(S.end);
  595. Add(TS.CreateWith(designator, designator2, sequence))
  596. |S.passivate : Next; Eat(S.lparen); ex := Expression(); Eat(S.rparen); Add(TS.CreateAwait(ex))
  597. |S.semicolon : Next; Warn("Superfluous Semicolon")
  598. ELSE
  599. (* not yet handled *)
  600. KernelLog.String("s.pos= "); KernelLog.Int(s.pos, 0); KernelLog.Ln;
  601. KernelLog.String("s.sym= "); KernelLog.Int(s.sym, 0); KernelLog.Ln;
  602. (* synchronize to end of current statement sequence *)
  603. WHILE (s.sym # S.eof) & (s.sym # S.end) & (s.sym # S.else) & (s.sym # S.elsif) & (s.sym # S.until) & (s.sym # S.bar) DO Next END;
  604. END;
  605. IF s.sym = S.semicolon THEN Next END;
  606. END;
  607. Add(TS.NewEmptyStatement());
  608. ASSERT(f # NIL);
  609. RETURN f
  610. END StatementSequence;
  611. PROCEDURE StatementBlock() : TS.StatementBlock;
  612. VAR block : TS.StatementBlock;
  613. BEGIN
  614. Eat(S.begin);
  615. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  616. NEW(block);
  617. block.statements := StatementSequence();
  618. RETURN block
  619. END StatementBlock;
  620. PROCEDURE Body() : TS.StatementBlock;
  621. VAR b : TS.StatementBlock;
  622. BEGIN
  623. IF s.sym = S.begin THEN
  624. b := StatementBlock();
  625. ELSIF s.sym = S.code THEN
  626. (* skip assembler *)
  627. WHILE (s.sym # S.eof) & (s.sym # S.end) DO Next END;
  628. END;
  629. RETURN b
  630. END Body;
  631. PROCEDURE SysFlag;
  632. BEGIN
  633. (* System flag *)
  634. IF s.sym = S.lbrak THEN
  635. Next;
  636. Eat(S.ident);
  637. Eat(S.rbrak);
  638. END;
  639. END SysFlag;
  640. PROCEDURE VisibilityModifier() : SET;
  641. VAR state : SET;
  642. BEGIN
  643. state := {};
  644. IF (s.sym = S.times) OR (s.sym = S.minus) THEN
  645. IF (s.sym = S.times) THEN INCL(state, TS.ExportReadWrite) END;
  646. IF (s.sym = S.minus) THEN INCL(state, TS.ExportReadOnly) END;
  647. Next
  648. END;
  649. RETURN state
  650. END VisibilityModifier;
  651. PROCEDURE Array(array: TS.Array; scope : TS.Scope);
  652. BEGIN
  653. (* SysFlag; *)
  654. IF s.sym = S.lbrak THEN (* skip over open array *)
  655. REPEAT
  656. Next;
  657. IF s.sym = S.times THEN Eat(S.times)
  658. ELSIF s.sym = S.question THEN Eat(S.question)
  659. ELSE Error("* or ? expected")
  660. END;
  661. UNTIL s.sym # S.comma;
  662. Eat(S.rbrak);
  663. IF s.sym = S.of THEN
  664. Next;
  665. array.base := Type(scope, "");
  666. END
  667. ELSE
  668. IF s.sym = S.of THEN
  669. array.open := TRUE;
  670. Next;
  671. array.base := Type(scope, "")
  672. ELSE
  673. array.expression := Expression();
  674. IF s.sym = S.of THEN
  675. Next;
  676. array.base := Type(scope, "");
  677. ELSIF s.sym = S.comma THEN
  678. NEW(array.base);
  679. array.base.kind := TS.TArray;
  680. NEW(array.base.array);
  681. Next;
  682. Array(array.base.array, scope)
  683. ELSE
  684. Error("Illegal Array Definition")
  685. END
  686. END
  687. END
  688. END Array;
  689. PROCEDURE Record(record: TS.Record; scope : TS.Scope);
  690. VAR i : LONGINT;
  691. debug : TS.NamedObject;
  692. BEGIN
  693. SysFlag;
  694. NEW(record.scope);
  695. record.scope.parent := scope;
  696. NEW(debug); debug.name := Strings.NewString("RECORD");
  697. record.scope.owner := debug;
  698. IF s.sym = S.lparen THEN
  699. Next;
  700. record.scope.superQualident := Designator();
  701. Eat(S.rparen);
  702. END;
  703. WHILE s.sym = S.semicolon DO Next END;
  704. IF s.sym = S.ident THEN
  705. record.scope.elements := FieldList(record.scope);
  706. FOR i := 0 TO record.scope.elements.nofObjs - 1 DO
  707. record.scope.elements.objs[i].container := record.scope
  708. END;
  709. END;
  710. Eat(S.end);
  711. END Record;
  712. PROCEDURE FieldList(scope : TS.Scope) : TS.ObjectList;
  713. VAR fieldList, t : TS.ObjectList; i : LONGINT;
  714. BEGIN
  715. NEW(fieldList);
  716. t := FieldDecl(scope);
  717. FOR i := 0 TO t.nofObjs - 1 DO fieldList.Add(t.objs[i]) END;
  718. WHILE s.sym = S.semicolon DO
  719. Next;
  720. t := FieldDecl(scope);
  721. FOR i := 0 TO t.nofObjs - 1 DO fieldList.Add(t.objs[i]) END;
  722. END;
  723. RETURN fieldList
  724. END FieldList;
  725. PROCEDURE FieldDecl(scope : TS.Scope) : TS.ObjectList;
  726. VAR
  727. var : TS.Var;
  728. t : TS.Type;
  729. i : LONGINT;
  730. ol : TS.ObjectList;
  731. BEGIN
  732. NEW(ol);
  733. IF s.sym = S.ident THEN
  734. NEW(var);
  735. var.name := Strings.NewString(s.str);
  736. StorePos(var.pos); ol.Add(var);
  737. Next;
  738. var.exportState := VisibilityModifier();
  739. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  740. SysFlag;
  741. WHILE s.sym = S.comma DO
  742. Next;
  743. NEW(var);
  744. var.name := Strings.NewString(s.str);
  745. StorePos(var.pos); ol.Add(var);
  746. Next;
  747. var.exportState := VisibilityModifier();
  748. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  749. SysFlag
  750. END;
  751. Eat(S.colon);
  752. t := Type(scope, var.name^);
  753. (* only now the type is known *)
  754. FOR i := 0 TO ol.nofObjs - 1 DO
  755. ol.objs[i](TS.Var).type := t
  756. END
  757. END;
  758. RETURN ol
  759. END FieldDecl;
  760. (* *)
  761. PROCEDURE FPSection(scope : TS.Scope) : TS.ObjectList;
  762. VAR
  763. var : TS.Var;
  764. t : TS.Type;
  765. i : LONGINT;
  766. ol : TS.ObjectList;
  767. isConst : BOOLEAN;
  768. isVar : BOOLEAN;
  769. BEGIN
  770. NEW(ol);
  771. isConst := FALSE; isVar := FALSE;
  772. IF s.sym = S.var THEN
  773. (* VAR parameter section *)
  774. isVar := TRUE;
  775. Next
  776. ELSIF s.sym = S.const THEN
  777. (* CONST parameter section *)
  778. isConst := TRUE;
  779. Next
  780. END;
  781. IF s.sym = S.ident THEN
  782. NEW(var);
  783. StorePos(var.pos);
  784. var.name := Strings.NewString(s.str);
  785. IF isConst THEN INCL(var.parameterType, TS.IsConstParam)
  786. ELSIF isVar THEN INCL(var.parameterType, TS.IsVarParam)
  787. END;
  788. ol.Add(var);
  789. Next;
  790. WHILE s.sym = S.comma DO
  791. Next;
  792. NEW(var);
  793. StorePos(var.pos);
  794. var.name := Strings.NewString(s.str);
  795. ol.Add(var);
  796. Next
  797. END;
  798. Eat(S.colon);
  799. t := Type(scope, "");
  800. (* only now the type is known *)
  801. FOR i := 0 TO ol.nofObjs - 1 DO
  802. ol.objs[i](TS.Var).type := t
  803. END
  804. END;
  805. RETURN ol
  806. END FPSection;
  807. PROCEDURE ProcSignature(scope : TS.Scope) : TS.ProcedureSignature;
  808. VAR ps : TS.ProcedureSignature;
  809. ol : TS.ObjectList;
  810. i : LONGINT;
  811. BEGIN
  812. NEW(ps);
  813. Next;
  814. IF (s.sym = S.var) OR (s.sym = S.const) OR (s.sym = S.ident) THEN
  815. ps.params := FPSection(scope);
  816. WHILE s.sym = S.semicolon DO
  817. Next; (* avoids endless loop *)
  818. ol := FPSection(scope);
  819. FOR i := 0 TO ol.nofObjs - 1 DO ps.params.Add(ol.objs[i]) END;
  820. END;
  821. FOR i := 0 TO ps.params.nofObjs - 1 DO
  822. ps.params.objs[i](TS.Var).varNr := i;
  823. INCL(ps.params.objs[i](TS.Var).parameterType, TS.IsParam)
  824. END
  825. END;
  826. Eat(S.rparen);
  827. IF s.sym = S.colon THEN
  828. Next;
  829. ps.return := Type(scope, "")
  830. END;
  831. RETURN ps
  832. END ProcSignature;
  833. PROCEDURE ProcDecl(currentScope : TS.Scope) : TS.ProcDecl;
  834. VAR pd : TS.ProcDecl; forward : BOOLEAN;
  835. name : ARRAY 64 OF CHAR;
  836. i : LONGINT;
  837. BEGIN
  838. NEW(pd);
  839. IF comments # NIL THEN pd.preComment := comments; comments := NIL END;
  840. forward := FALSE;
  841. SysFlag;
  842. CASE s.sym OF
  843. | S.minus: (*inline := TRUE;*) Next
  844. | S.and: (* constructor := TRUE;*) Next
  845. | S.times: (* ignore *) Next
  846. | S.arrow: forward := TRUE; Next
  847. | S.string: (*operator := TRUE;*)
  848. | S.number: (*IF s.numtyp = S.char THEN (* operator := TRUE *)END;*)
  849. ELSE
  850. END;
  851. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  852. (* procedure name *)
  853. pd.name := Strings.NewString(s.str);
  854. StorePos(pd.pos);
  855. COPY(pd.name^, name);
  856. IF pd.name^="" THEN HALT(9999) END;
  857. Next;
  858. (* visibility modifier *)
  859. pd.exportState := VisibilityModifier();
  860. NEW(pd.scope) ;
  861. pd.scope.parent := currentScope;
  862. pd.scope.owner := pd;
  863. IF s.sym = S.lparen THEN
  864. pd.signature := ProcSignature(currentScope);
  865. (* update container *)
  866. IF pd.signature.params # NIL THEN
  867. FOR i := 0 TO pd.signature.params.nofObjs - 1 DO pd.signature.params.objs[i].container := pd.scope END;
  868. END;
  869. pd.scope.params := pd.signature.params
  870. END;
  871. IF ~forward THEN
  872. Eat(S.semicolon);
  873. IF (s.sym = S.const) OR (s.sym = S.var) OR (s.sym = S.type) OR (s.sym = S.procedure) THEN
  874. DeclSeq(pd.scope)
  875. END;
  876. pd.scope.ownerBody := Body();
  877. Eat(S.end);
  878. StorePos(pd.altPos);
  879. IF s.str # pd.name^ THEN
  880. Error("Procedure-name does not match")
  881. END;
  882. Next;
  883. END;
  884. (* KernelLog.String("P:"); KernelLog.String(s.str); KernelLog.Ln; *)
  885. RETURN pd
  886. END ProcDecl;
  887. PROCEDURE Definition;
  888. VAR ps : TS.ProcedureSignature; q : TS.Designator;
  889. BEGIN
  890. IF s.sym = S.definition THEN
  891. Next;
  892. IF s.sym = S.ident THEN
  893. Next
  894. ELSE Error("Definition name expected")
  895. END;
  896. WHILE s.sym = S.semicolon DO Next END;
  897. IF s.sym = S.refines THEN Next;
  898. q := Designator()
  899. END;
  900. WHILE s.sym = S.procedure DO
  901. Next;
  902. ps := ProcSignature(m.scope);
  903. Eat(S.semicolon);
  904. END;
  905. Eat(S.end);
  906. Eat(S.ident);
  907. WHILE s.sym = S.semicolon DO Next END;
  908. END;
  909. END Definition;
  910. PROCEDURE Module;
  911. VAR body : TS.Statement;
  912. BEGIN
  913. IF s.sym = S.module THEN
  914. Next;
  915. (* read module name *)
  916. IF s.sym = S.ident THEN
  917. NEW(m);
  918. (* attach pre-comments *)
  919. IF comments # NIL THEN
  920. m.preComment := comments; comments := NIL
  921. END;
  922. NEW(m.scope);
  923. m.scope.parent := Universe;
  924. m.scope.owner := m;
  925. StorePos(m.pos);
  926. m.name := Strings.NewString(s.str);
  927. (* skip module options *)
  928. Next;
  929. IF s.sym = S.lbrace THEN
  930. WHILE (s.sym # S.semicolon) & (s.sym # S.eof) DO Next END;
  931. END;
  932. (* read (and ignore) package *)
  933. IF s.sym = S.in THEN
  934. Next;
  935. m.package := Strings.NewString(s.str);
  936. Eat(S.ident)
  937. END;
  938. Eat(S.semicolon);
  939. IF s.sym = S.import THEN
  940. (* attach pre-comments *)
  941. IF comments # NIL THEN
  942. m.postComment := comments; comments := NIL
  943. END;
  944. ImportList
  945. END;
  946. WHILE s.sym = S.definition DO Definition END;
  947. IF (s.sym = S.const) OR (s.sym = S.type) OR (s.sym = S.var) OR (s.sym = S.procedure) THEN
  948. DeclSeq(m.scope)
  949. END;
  950. IF s.sym = S.begin THEN
  951. Next;
  952. IF s.sym = S.lbrace THEN BlockAttributes; Eat(S.rbrace) END;
  953. body := StatementSequence();
  954. m.scope.ownerBody := body;
  955. END;
  956. Eat(S.end);
  957. StorePos(m.altPos);
  958. IF (s.sym = S.ident) & (s.str = m.name^) THEN
  959. (* correct *)
  960. Next;
  961. ELSE
  962. (* maybe missing END or wrong module name *)
  963. Error("END missing or wrong module name")
  964. END;
  965. Eat(S.period);
  966. ELSE
  967. Error("name expected");
  968. END;
  969. END;
  970. END Module;
  971. PROCEDURE Parse*(s : S.Scanner);
  972. BEGIN
  973. SELF.s := s;
  974. Next; (* establish one look ahead *)
  975. Module;
  976. END Parse;
  977. END Parser;
  978. FileListEntry = POINTER TO RECORD
  979. filename : ARRAY 128 OF CHAR;
  980. next : FileListEntry;
  981. END;
  982. SymbolCreator = OBJECT
  983. VAR filename : ARRAY 128 OF CHAR;
  984. BEGIN {ACTIVE}
  985. IncWorker;
  986. WHILE GetTask(filename) DO
  987. MakeSymbolFile(filename);
  988. END;
  989. DecWorker
  990. END SymbolCreator;
  991. VAR Universe* : TS.Scope;
  992. System : TS.Module;
  993. release : TS.ObjectList;
  994. fileList : FileListEntry;
  995. nofWorkers : LONGINT;
  996. PROCEDURE GetTask(VAR filename : ARRAY OF CHAR) : BOOLEAN;
  997. BEGIN {EXCLUSIVE}
  998. IF fileList # NIL THEN
  999. COPY(fileList.filename, filename); fileList := fileList.next;
  1000. RETURN TRUE
  1001. ELSE RETURN FALSE
  1002. END
  1003. END GetTask;
  1004. PROCEDURE AddTask(CONST filename : ARRAY OF CHAR);
  1005. VAR fl : FileListEntry;
  1006. BEGIN {EXCLUSIVE}
  1007. NEW(fl);
  1008. COPY(filename, fl.filename);
  1009. fl.next := fileList; fileList := fl;
  1010. END AddTask;
  1011. PROCEDURE IncWorker;
  1012. BEGIN {EXCLUSIVE}
  1013. INC(nofWorkers);
  1014. END IncWorker;
  1015. PROCEDURE DecWorker;
  1016. BEGIN {EXCLUSIVE}
  1017. DEC(nofWorkers);
  1018. END DecWorker;
  1019. PROCEDURE ScanModule*(CONST filename : ARRAY OF CHAR; dump : BOOLEAN; VAR m : TS.Module);
  1020. VAR t : Texts.Text; res : WORD; format: LONGINT;
  1021. s : S.Scanner;
  1022. p : Parser;
  1023. BEGIN
  1024. NEW(t);
  1025. TextUtilities.LoadAuto(t, filename, format, res);
  1026. IF res # 0 THEN
  1027. KernelLog.String(filename); KernelLog.String(" not found"); KernelLog.Ln;
  1028. RETURN
  1029. END;
  1030. s := S.InitWithText(t, 0);
  1031. NEW(p); p.Parse(s);
  1032. m := p.m;
  1033. IF dump THEN
  1034. IF p.m # NIL THEN
  1035. TFDumpTS.Open(p.m.name^);
  1036. TFDumpTS.DumpM(p.m)
  1037. END
  1038. END
  1039. END ScanModule;
  1040. PROCEDURE ScanForModules;
  1041. VAR
  1042. e : Files.Enumerator;
  1043. name : ARRAY 256 OF CHAR; flags : SET; time, date, size : LONGINT;
  1044. module : TS.Module;
  1045. i : LONGINT;
  1046. t0, t1 : LONGINT;
  1047. BEGIN
  1048. NEW(release);
  1049. NEW(e);
  1050. e.Open("d:/release/*.Mod", {});
  1051. i := 0;
  1052. t0 := Kernel.GetTicks();
  1053. WHILE e.HasMoreEntries() DO
  1054. IF e.GetEntry(name, flags, time, date, size) THEN
  1055. KernelLog.String(name); KernelLog.Ln;
  1056. ScanModule(name, FALSE, module);
  1057. TS.WriteSymbolFile(module);
  1058. (* IF module # NIL THEN
  1059. TFCheck.CheckDeclarations(module.scope);
  1060. END; *)
  1061. (* IF module # NIL THEN release.Add(module); INC(i) END; *)
  1062. END
  1063. END;
  1064. t1 := Kernel.GetTicks();
  1065. KernelLog.String("Finished "); KernelLog.Int(i, 0); KernelLog.String(" modules loaded"); KernelLog.Ln;
  1066. KernelLog.String("t1-t0= "); KernelLog.Int(t1-t0, 0); KernelLog.Ln;
  1067. KernelLog.Int((t1-t0) DIV 60000, 0); KernelLog.String("m"); KernelLog.Int(((t1-t0) DIV 1000) MOD 60, 0); KernelLog.String("s"); KernelLog.Ln;
  1068. END ScanForModules;
  1069. PROCEDURE Test*(par : Commands.Context) ;
  1070. VAR
  1071. name :ARRAY 256 OF CHAR;
  1072. sr : Streams.Reader;
  1073. t0, t1 : LONGINT;
  1074. module : TS.Module;
  1075. BEGIN
  1076. sr := par.arg;
  1077. sr.String(name);
  1078. KernelLog.String("Parsing "); KernelLog.String(name);
  1079. t0 := Kernel.GetTicks();
  1080. ScanModule(name, TRUE, module);
  1081. IF module # NIL THEN
  1082. TFCheck.CheckDeclarations(module.scope);
  1083. END;
  1084. t1 := Kernel.GetTicks();
  1085. KernelLog.String("t1-t0= "); KernelLog.Int(t1-t0, 0); KernelLog.Ln;
  1086. KernelLog.String(" done.");
  1087. END Test;
  1088. PROCEDURE MakeSymbolFile(CONST filename : ARRAY OF CHAR);
  1089. VAR module : TS.Module;
  1090. BEGIN
  1091. KernelLog.String(filename); KernelLog.Ln;
  1092. ScanModule(filename, FALSE, module);
  1093. IF module # NIL THEN
  1094. module.filename := Strings.NewString(filename);
  1095. TS.WriteSymbolFile(module)
  1096. END
  1097. END MakeSymbolFile;
  1098. PROCEDURE MakeSymbolFiles*(par : Commands.Context) ;
  1099. CONST NofSymbolCreators = 4;
  1100. VAR e : Files.Enumerator;
  1101. path, name, exclude : ARRAY 256 OF CHAR; flags : SET; time, date, size : LONGINT;
  1102. sr : Streams.Reader;
  1103. i : LONGINT;
  1104. t0, t1 : LONGINT;
  1105. symbolCreators : ARRAY NofSymbolCreators OF SymbolCreator;
  1106. BEGIN
  1107. sr := par.arg;
  1108. sr.String(path); sr.SkipWhitespace();
  1109. sr.String(exclude);
  1110. IF (path # "") & ~Strings.EndsWith("/", path) THEN Strings.Append(path, "/") END;
  1111. Strings.Append(path, "*.Mod");
  1112. KernelLog.String(path); KernelLog.Ln;
  1113. IF exclude # "" THEN
  1114. KernelLog.String("Excluding "); KernelLog.String(exclude); KernelLog.Ln;
  1115. END;
  1116. NEW(e);
  1117. e.Open(path, {});
  1118. i := 0;
  1119. t0 := Kernel.GetTicks();
  1120. KernelLog.String("Processing ... "); KernelLog.Ln;
  1121. WHILE e.HasMoreEntries() DO
  1122. IF e.GetEntry(name, flags, time, date, size) THEN
  1123. IF (exclude = "") OR ~Strings.Match(exclude, name) THEN
  1124. AddTask(name);
  1125. INC(i)
  1126. ELSE
  1127. KernelLog.String("Excluding "); KernelLog.String(name); KernelLog.Ln;
  1128. END
  1129. END
  1130. END;
  1131. KernelLog.Int(i, 0); KernelLog.String(" modules queued for processing"); KernelLog.Ln;
  1132. FOR i := 0 TO NofSymbolCreators - 1 DO NEW(symbolCreators[i]) END;
  1133. BEGIN {EXCLUSIVE}
  1134. AWAIT((fileList = NIL) & (nofWorkers = 0));
  1135. END;
  1136. t1 := Kernel.GetTicks();
  1137. KernelLog.Int((t1-t0) DIV 60000, 0); KernelLog.String("m"); KernelLog.Int(((t1-t0) DIV 1000) MOD 60, 0); KernelLog.String("s"); KernelLog.Ln;
  1138. END MakeSymbolFiles;
  1139. PROCEDURE MakeSym*(par : Commands.Context) ;
  1140. VAR
  1141. name :ARRAY 256 OF CHAR;
  1142. sr : Streams.Reader;
  1143. t0, t1 : LONGINT;
  1144. module : TS.Module;
  1145. BEGIN
  1146. sr := par.arg;
  1147. sr.String(name);
  1148. KernelLog.String("Parsing "); KernelLog.String(name);
  1149. t0 := Kernel.GetTicks();
  1150. ScanModule(name, TRUE, module);
  1151. IF module # NIL THEN
  1152. (* TFCheck.CheckDeclarations(module.scope); *)
  1153. TS.WriteSymbolFile(module);
  1154. END;
  1155. t1 := Kernel.GetTicks();
  1156. KernelLog.String("t1-t0= "); KernelLog.Int(t1-t0, 0); KernelLog.Ln;
  1157. KernelLog.String(" done.");
  1158. END MakeSym;
  1159. PROCEDURE AddStandardProc(scope : TS.Scope; CONST name : ARRAY OF CHAR);
  1160. VAR p : TS.ProcDecl;
  1161. BEGIN
  1162. NEW(p); p.name := Strings.NewString(name);
  1163. scope.Add(p)
  1164. END AddStandardProc;
  1165. PROCEDURE AddBasicType(scope : TS.Scope; CONST name : ARRAY OF CHAR; type : LONGINT);
  1166. VAR t : TS.TypeDecl;
  1167. BEGIN
  1168. NEW(t); t.name := Strings.NewString(name);
  1169. NEW(t.type); t.type.kind := TS.TBasic; t.type.basicType := type;
  1170. scope.Add(t)
  1171. END AddBasicType;
  1172. BEGIN
  1173. NEW(Universe);
  1174. Universe.parent := NIL;
  1175. NEW(System); System.name := Strings.NewString("SYSTEM");
  1176. NEW(System.scope);
  1177. AddBasicType(System.scope, "ADDRESS", TS.BasicInt32);
  1178. AddBasicType(System.scope, "SIZE", TS.BasicInt32);
  1179. TS.ns.AddModule(System);
  1180. AddStandardProc(Universe, "NEW");
  1181. AddStandardProc(Universe, "LEN");
  1182. AddStandardProc(Universe, "COPY");
  1183. AddStandardProc(Universe, "ASSERT");
  1184. AddStandardProc(Universe, "HALT");
  1185. AddStandardProc(Universe, "INC");
  1186. AddStandardProc(Universe, "DEC");
  1187. AddStandardProc(Universe, "INCL");
  1188. AddStandardProc(Universe, "EXCL");
  1189. AddStandardProc(Universe, "CHR");
  1190. AddStandardProc(Universe, "ORD");
  1191. AddStandardProc(Universe, "LONG");
  1192. AddStandardProc(Universe, "SHORT");
  1193. AddStandardProc(Universe, "ENTIER");
  1194. AddStandardProc(Universe, "ASH");
  1195. AddBasicType(Universe, "BOOLEAN", TS.BasicBoolean);
  1196. AddBasicType(Universe, "ANY", TS.BasicInt32);
  1197. AddBasicType(Universe, "PTR", TS.BasicInt32);
  1198. AddBasicType(Universe, "SHORTINT", TS.BasicInt8);
  1199. AddBasicType(Universe, "INTEGER", TS.BasicInt16);
  1200. AddBasicType(Universe, "LONGINT", TS.BasicInt32);
  1201. AddBasicType(Universe, "SET", TS.BasicInt32);
  1202. AddBasicType(Universe, "HUGEINT", TS.BasicInt64);
  1203. AddBasicType(Universe, "CHAR", TS.BasicChar8);
  1204. AddBasicType(Universe, "REAL", TS.BasicReal32);
  1205. AddBasicType(Universe, "LONGREAL", TS.BasicReal64);
  1206. AddBasicType(Universe, "STRING", TS.BasicString);
  1207. END TFAOParser.