ObxNoModel.cp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. MODULE JSonObxNoModel;
  2. (**
  3. project = "YSon"
  4. organization = ""
  5. contributors = ""
  6. version = "System/Rsrc/About"
  7. copyright = "Kushnir Piotr Michailovich"
  8. license = "Docu/BB-License"
  9. purpose = "демонстрация работы форматтера без использования динамических моделей данных"
  10. changes = "
  11. - 20130527, pk, автогенерация заголовка, документирование
  12. - 20150204, pk, порт для fw
  13. "
  14. issues = ""
  15. **)
  16. IMPORT
  17. Gen:=JSonGenerator, F:=JSonFormatter, P:=JSonParser,
  18. Str, Out;
  19. TYPE
  20. Wr = POINTER TO RECORD (Gen.Writer) END; (* дефолтный вывод - в лог *)
  21. Reader = POINTER TO RECORD (P.Reader)
  22. base: Str.Dyn;
  23. pos: INTEGER;
  24. END;
  25. StdTarget = POINTER TO RECORD (P.Target)
  26. (* res, root, this: YSonModels.Value; *)
  27. name: ARRAY 256 OF CHAR;
  28. END;
  29. PROCEDURE (t: StdTarget) Result(): ANYPTR;
  30. BEGIN
  31. RETURN NIL
  32. END Result;
  33. PROCEDURE (t: StdTarget) LevelDown (id, type: INTEGER);
  34. BEGIN
  35. Out.String("down"); Out.Int(id); Out.Int(type); Out.Ln;
  36. END LevelDown;
  37. PROCEDURE (t: StdTarget) NextName (IN s: ARRAY OF CHAR);
  38. BEGIN
  39. t.name:=s$;
  40. Out.String("name:"); Out.String(s); Out.Ln;
  41. END NextName;
  42. PROCEDURE (t: StdTarget) LevelUp;
  43. BEGIN
  44. Out.String("up"); Out.Ln;
  45. END LevelUp;
  46. PROCEDURE (t: StdTarget) ThisValue (IN x: ARRAY OF CHAR; quoted: BOOLEAN);
  47. BEGIN
  48. Out.String("value:"); Out.String(x); Out.Bool(quoted); Out.Ln;
  49. END ThisValue;
  50. PROCEDURE (r: Reader) Read (OUT ch: CHAR): BOOLEAN;
  51. VAR ok: BOOLEAN;
  52. BEGIN
  53. ASSERT(r.Base()#NIL, 20);
  54. ok:=~r.Eot();
  55. IF ok THEN ch:=r.base.Char(r.pos); INC(r.pos);END;
  56. RETURN ok
  57. END Read;
  58. PROCEDURE (r: Reader) SetPos (x: INTEGER);
  59. BEGIN
  60. r.pos:=x;
  61. END SetPos;
  62. PROCEDURE (r: Reader) Pos (): INTEGER;
  63. BEGIN
  64. RETURN r.pos
  65. END Pos;
  66. PROCEDURE (r: Reader) ConnectTo (source: ANYPTR);
  67. BEGIN
  68. ASSERT(source#NIL, 20);
  69. WITH source: Str.Dyn DO
  70. r.base:=source; r.pos:=0;
  71. ELSE HALT(100) END;
  72. END ConnectTo;
  73. PROCEDURE (r: Reader) Base (): ANYPTR;
  74. BEGIN
  75. RETURN r.base
  76. END Base;
  77. PROCEDURE (r: Reader) Eot(): BOOLEAN;
  78. BEGIN
  79. RETURN ~(r.pos<r.base.Len());
  80. END Eot;
  81. PROCEDURE (w: Wr) Char (c: CHAR);
  82. BEGIN
  83. Out.Char(c);
  84. END Char;
  85. PROCEDURE (w: Wr) Whitespace (s: ARRAY OF CHAR);
  86. BEGIN
  87. CASE s[0] OF
  88. 09X: Out.Tab;
  89. |0DX, 0AX: Out.Ln;
  90. |' ': Out.Char(' ');
  91. ELSE Out.String(s$) END
  92. END Whitespace;
  93. (* формирование структуры JSON непосредственно при выполнении комманд форматтера *)
  94. PROCEDURE Do*;
  95. TYPE Base = POINTER TO RECORD END;
  96. VAR b: Base; wr: Wr; f: F.Formatter; res: INTEGER;
  97. BEGIN
  98. Out.Ln;
  99. NEW(wr);
  100. NEW(b);
  101. wr.SetBase(b);
  102. f:=F.dir.New(wr);
  103. (* демонстрация пошагового результата *)
  104. f.WriteSym(F.arrBegin, res); (* [ *)
  105. f.WriteSym(F.objBegin, res); (* { *)
  106. f.WriteName('obj', res); (* "obj" *)
  107. f.WriteSym(F.objBegin, res); (* { *)
  108. f.WriteSym(F.objEnd, res); (* } *)
  109. f.WriteName('arr', res); (* "arr" *)
  110. f.WriteSym(F.arrBegin, res); (* [ *)
  111. f.WriteValue(F.atomVal, 'true', res); (* true *)
  112. f.WriteValue(F.atomVal, 'true', res); (* true *)
  113. f.WriteValue(F.atomVal, 'true', res); (* true *)
  114. f.WriteSym(F.objBegin, res); (* { *)
  115. f.WriteSym(F.objEnd, res); (* } *)
  116. f.WriteSym(F.arrBegin, res); (* [ *)
  117. f.WriteSym(F.arrEnd, res); (* ] *)
  118. f.WriteSym(F.arrEnd, res); (* ] *)
  119. f.WriteName('sss', res); (* "sss" *)
  120. f.WriteValue(F.atomVal, 'true', res); (* true *)
  121. f.WriteName('sss1', res); (* "sss1" *)
  122. f.WriteValue(F.stringVal, 'hello, world!', res); (* "hello, world!" *)
  123. f.WriteSym(F.objEnd, res); (* } *)
  124. f.WriteSym(F.arrEnd, res); (* ] *)
  125. END Do;
  126. PROCEDURE Do2*;
  127. VAR source: Str.Dyn; rd: Reader; p: P.Parser; x: ANYPTR; res: INTEGER; t: StdTarget;
  128. BEGIN
  129. source:=Str.NewFrom('{"hello":"world"}');
  130. NEW(rd); rd.ConnectTo(source);
  131. NEW(t);
  132. p:=P.dir.New(rd);
  133. p.SetTarget(t);
  134. x:=p.Parse(res);
  135. END Do2;
  136. BEGIN
  137. END JSonObxNoModel.
  138. (*JediPlain*gvFEZXZDb21tYW5kZXJzLlN0ZFZpZXdEZXNjAPFEZXZDb21tYW5kZXJzLlZpZXdEZXNjAPFWaWV3cy5WaWV3RGVzYwDwU3RvcmVzLlN0b3JlRGVzYwAAAAAAAAAAAAAAAAAGAAAAAAAAFQAA*)YSonObxNoModel.Do