2
0

Interp.txt 2.4 KB

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