LSP.Mod.txt 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. MODULE LSP; (*display data structure; NW 28.8.2015*)
  2. IMPORT Texts, Oberon, LSB;
  3. VAR W: Texts.Writer;
  4. C: ARRAY 64, 6 OF CHAR;
  5. PROCEDURE PrintType(typ: LSB.Type);
  6. VAR obj: LSB.Object;
  7. BEGIN
  8. IF typ IS LSB.ArrayType THEN
  9. Texts.Write(W, "["); Texts.WriteInt(W, typ.len, 1); Texts.Write(W, "]"); PrintType(typ(LSB.ArrayType).eltyp)
  10. ELSIF typ IS LSB.UnitType THEN
  11. Texts.WriteString(W, "UnitType "); obj := typ(LSB.UnitType).firstobj;
  12. ELSE Texts.WriteString(W, "BIT")
  13. END ;
  14. Texts.Append(Oberon.Log, W.buf)
  15. END PrintType;
  16. PROCEDURE PrintTree(x: LSB.Item; n: INTEGER);
  17. VAR i: INTEGER;
  18. BEGIN
  19. IF x # NIL THEN i := n;
  20. IF x IS LSB.Object THEN
  21. WHILE i > 0 DO Texts.Write(W, 9X); DEC(i) END ;
  22. Texts.WriteString(W, x(LSB.Object).name); Texts.WriteLn(W)
  23. ELSE
  24. PrintTree(x.a, n+1);
  25. WHILE i > 0 DO Texts.Write(W, 9X); DEC(i) END ;
  26. IF x.tag = LSB.lit THEN Texts. WriteInt(W, x.val, 1) ELSE Texts.WriteString(W, C[x.tag]); END ;
  27. Texts.WriteLn(W);
  28. PrintTree(x.b, n+1)
  29. END
  30. END
  31. END PrintTree;
  32. PROCEDURE PrintObj(obj: LSB.Object; n: INTEGER);
  33. VAR apar: LSB.Item; obj1: LSB.Object;
  34. BEGIN
  35. IF n > 0 THEN Texts.Write(W, 9X) END ;
  36. Texts.WriteString(W, C[obj.tag]); Texts.Write(W, " "); Texts.WriteString(W, obj.name); Texts.Append(Oberon.Log, W.buf);
  37. IF obj.tag = LSB.const THEN Texts.WriteString(W, " = "); PrintTree(obj.b, 1); Texts.WriteLn(W)
  38. ELSIF obj.tag = LSB.typ THEN
  39. IF obj.type IS LSB.UnitType THEN (*formal param list*)
  40. obj1 := obj.type(LSB.UnitType).firstobj;
  41. Texts.WriteString(W, " BEGIN "); Texts.WriteLn(W);
  42. WHILE (obj1 # NIL) & (obj1 # LSB.root) DO PrintObj(obj1, 0); obj1 := obj1.next END ;
  43. Texts.WriteString(W, "END"); Texts.WriteLn(W)
  44. ELSE PrintType(obj.type)
  45. END
  46. ELSE (*var*) Texts.WriteString(W, ": ");
  47. IF obj.type IS LSB.UnitType THEN
  48. Texts.WriteString(W, obj.type.typobj.name);
  49. apar := obj.b; Texts.WriteString(W, " ["); (*actual param list*)
  50. WHILE apar # NIL DO PrintTree(apar.b, 1); apar := apar.a END ;
  51. Texts.Write(W, "]"); Texts.WriteLn(W)
  52. ELSE PrintType(obj.type);
  53. Texts.WriteString(W, " #"); Texts.WriteInt(W, obj.val, 1);
  54. IF obj.a # NIL THEN
  55. IF obj.val = 0 THEN Texts.WriteString(W, " CLK") ELSIF obj.val = 1 THEN (*indexed*) Texts.WriteString(W, " DEMUX") END ;
  56. PrintTree(obj.a, 1)
  57. END ;
  58. IF obj.b # NIL THEN Texts.WriteString(W, " := "); Texts.WriteLn(W); PrintTree(obj.b, 1)
  59. ELSE Texts.WriteLn(W)
  60. END
  61. END
  62. END ;
  63. Texts.Append(Oberon.Log, W.buf)
  64. END PrintObj;
  65. PROCEDURE List*;
  66. VAR obj: LSB.Object;
  67. BEGIN obj := LSB.top;
  68. Texts.WriteString(W, "listing "); Texts.WriteString(W, LSB.modname); Texts.WriteLn(W);
  69. WHILE (obj # LSB.root) & (obj # NIL) DO PrintObj(obj, 0); obj := obj.next END ;
  70. Texts.Append(Oberon.Log, W.buf)
  71. END List;
  72. BEGIN Texts.OpenWriter(W);
  73. C[LSB.const] := "CONST"; C[LSB.typ] := "TYPE"; C[LSB.var] := "VAR";
  74. C[LSB.lit] := "LIT"; C[LSB.sel] := "MUX"; C[LSB.range] := ": "; C[LSB.cons] := ", "; C[LSB.repl] := "**";
  75. C[LSB.or] := "| "; C[LSB.xor] := "^ "; C[LSB.and] := "& "; C[LSB.not] := "~ ";
  76. C[LSB.add] := "+ "; C[LSB.sub] := "- "; C[LSB.mul] := "* "; C[LSB.div] := "/ ";
  77. C[LSB.eql] := "= "; C[LSB.neq] := "# "; C[LSB.lss] := "< "; C[LSB.geq] := ">="; C[LSB.leq] := "<="; C[LSB.gtr] := "> ";
  78. C[LSB.then] := " -> "; C[LSB.else] := " :: "; C[LSB.ts] := "TS "; C[LSB.next] := "--"
  79. END LSP.