Interp.txt 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. MODULE ConsInterp;
  2. (*
  3. A. V. Shiryaev, 2012.09
  4. *)
  5. IMPORT
  6. Console,
  7. Strings, Dialog,
  8. DevCommanders, TextModels,
  9. StdLog;
  10. VAR
  11. textR: TextModels.Reader;
  12. PROCEDURE ShowStdLog;
  13. VAR c: CHAR;
  14. BEGIN
  15. StdLog.text.Append(StdLog.buf);
  16. textR.SetPos(0);
  17. textR.ReadChar(c);
  18. WHILE ~textR.eot DO
  19. IF c = 0DX THEN c := 0AX END;
  20. Console.WriteChar(c);
  21. textR.ReadChar(c)
  22. END;
  23. StdLog.text.Delete(0, StdLog.text.Length())
  24. END ShowStdLog;
  25. PROCEDURE Call1 (IN s: ARRAY OF CHAR; i: INTEGER): BOOLEAN;
  26. VAR j: INTEGER;
  27. res: INTEGER;
  28. par: DevCommanders.Par;
  29. m: TextModels.Model; w: TextModels.Writer;
  30. BEGIN
  31. (* ASSERT 0X in s[ i:LEN(s) ) *)
  32. j := i;
  33. WHILE s[j] # 0X DO INC(j) END;
  34. IF j > i THEN
  35. m := TextModels.dir.New();
  36. w := m.NewWriter(NIL);
  37. WHILE i < j DO
  38. w.WriteChar(s[i]);
  39. INC(i)
  40. END;
  41. NEW(par); par.text := m; par.beg := 0; par.end := m.Length() - 1;
  42. DevCommanders.par := par
  43. END;
  44. Dialog.Call(s, " ", res);
  45. DevCommanders.par := NIL;
  46. ShowStdLog;
  47. RETURN res = 0
  48. END Call1;
  49. PROCEDURE Call0 (VAR s: ARRAY OF CHAR): BOOLEAN;
  50. VAR i: INTEGER;
  51. res: BOOLEAN;
  52. inStr: BOOLEAN;
  53. BEGIN
  54. (* ASSERT s is 0X terminated and not empty *)
  55. i := 0;
  56. WHILE (s[i] # 0X) & (s[i] # ' ') & (s[i] # '(') DO
  57. INC(i)
  58. END;
  59. IF s[i] = 0X THEN
  60. res := Call1(s, i)
  61. ELSIF s[i] = ' ' THEN
  62. s[i] := 0X;
  63. res := Call1(s, i + 1)
  64. ELSE (* s[i] = '(' *)
  65. INC(i);
  66. inStr := FALSE;
  67. WHILE (s[i] # 0X) & ~(~inStr & (s[i] = ')')) DO
  68. IF s[i] = "'" THEN inStr := ~inStr END;
  69. INC(i)
  70. END;
  71. IF s[i] # 0X THEN
  72. INC(i);
  73. IF s[i] = 0X THEN
  74. res := Call1(s, i)
  75. ELSE
  76. s[i] := 0X;
  77. res := Call1(s, i + 1)
  78. END
  79. ELSE
  80. res := FALSE
  81. END
  82. END;
  83. RETURN res
  84. END Call0;
  85. PROCEDURE Call (VAR s: ARRAY OF CHAR): BOOLEAN;
  86. VAR i: INTEGER;
  87. res: BOOLEAN;
  88. BEGIN
  89. i := 0;
  90. WHILE (i < LEN(s)) & (s[i] # 0AX) & (s[i] # 0DX) & (s[i] # 0X) DO
  91. INC(i)
  92. END;
  93. IF (i < LEN(s)) & (s[i] # 0X) THEN
  94. IF (i > 0) & (s[0] # '#') THEN
  95. s[i] := 0X;
  96. res := Call0(s)
  97. ELSE (* skip empty strings and comments *)
  98. res := TRUE
  99. END
  100. ELSE (* end of input *)
  101. res := FALSE
  102. END;
  103. RETURN res
  104. END Call;
  105. PROCEDURE Run*;
  106. VAR s: ARRAY 1024 OF CHAR;
  107. BEGIN
  108. Console.ReadLn(s);
  109. WHILE Call(s) DO
  110. Console.ReadLn(s)
  111. END
  112. END Run;
  113. BEGIN
  114. textR := StdLog.text.NewReader(NIL)
  115. END ConsInterp.