Interp.txt 2.0 KB

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