mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-06 13:02:26 +00:00
JSON parser parses nested variables
This commit is contained in:
parent
7576130b76
commit
7a05c9b3e8
2 changed files with 69 additions and 5 deletions
|
|
@ -4,7 +4,6 @@ IMPORT Files, Out, Logger, Strings;
|
||||||
PROCEDURE WriteString(VAR r : Files.Rider; str : ARRAY OF CHAR);
|
PROCEDURE WriteString(VAR r : Files.Rider; str : ARRAY OF CHAR);
|
||||||
BEGIN
|
BEGIN
|
||||||
Files.WriteBytes(r, str, Strings.Length(str));
|
Files.WriteBytes(r, str, Strings.Length(str));
|
||||||
Logger.Log(str);
|
|
||||||
END WriteString;
|
END WriteString;
|
||||||
|
|
||||||
PROCEDURE Read*(fileName: ARRAY OF CHAR; VAR returnString: ARRAY OF CHAR): BOOLEAN;
|
PROCEDURE Read*(fileName: ARRAY OF CHAR; VAR returnString: ARRAY OF CHAR): BOOLEAN;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
MODULE JsonParser;
|
MODULE JsonParser;
|
||||||
IMPORT Logger, CharacterStack, Strings, Out;
|
IMPORT Logger, CharacterStack, Strings, Out, strutils;
|
||||||
CONST
|
CONST
|
||||||
ArrayMaxNumber = 100;
|
ArrayMaxNumber = 100;
|
||||||
(* Const *)
|
(* Const *)
|
||||||
|
|
@ -18,6 +18,8 @@ TYPE
|
||||||
GetNonTerminal* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer;
|
GetNonTerminal* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer;
|
||||||
HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN;
|
HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN;
|
||||||
TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR);
|
TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR);
|
||||||
|
GetTerminalKeys* : PROCEDURE(self : JsonTypePointer;VAR destination : ARRAY OF TString);
|
||||||
|
GetNoneTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString);
|
||||||
|
|
||||||
TerminalKeys : ARRAY ArrayMaxNumber OF TString;
|
TerminalKeys : ARRAY ArrayMaxNumber OF TString;
|
||||||
TerminalsValues : ARRAY ArrayMaxNumber OF TString;
|
TerminalsValues : ARRAY ArrayMaxNumber OF TString;
|
||||||
|
|
@ -30,16 +32,70 @@ VAR
|
||||||
jsonRecord: JsonTypePointer;
|
jsonRecord: JsonTypePointer;
|
||||||
testValue: ARRAY ArrayMaxNumber OF CHAR;
|
testValue: ARRAY ArrayMaxNumber OF CHAR;
|
||||||
keyFound: BOOLEAN;
|
keyFound: BOOLEAN;
|
||||||
|
|
||||||
|
PROCEDURE GetNonTerminal(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer;
|
||||||
|
VAR
|
||||||
|
i: LONGINT;
|
||||||
|
BEGIN
|
||||||
|
FOR i := 0 TO LEN(self.NonTerminalKeys) - 1 DO
|
||||||
|
IF Strings.Match(key, self.NonTerminalKeys[i]) THEN RETURN self.NonTerminalValues[i] END;
|
||||||
|
END;
|
||||||
|
|
||||||
|
RETURN NIL;
|
||||||
|
END GetNonTerminal;
|
||||||
|
|
||||||
PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN;
|
PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN;
|
||||||
VAR
|
VAR
|
||||||
i: LONGINT;
|
i: LONGINT;
|
||||||
|
noneTerminal: JsonTypePointer;
|
||||||
|
strings: strutils.strings;
|
||||||
|
parent, children: ARRAY ArrayMaxNumber OF CHAR;
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO
|
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO
|
||||||
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], returnValue); RETURN TRUE END;
|
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], returnValue); RETURN TRUE END;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
strings := strutils.tokenize(key, '.');
|
||||||
|
|
||||||
|
IF LEN(strings^) < 1 THEN RETURN FALSE END;
|
||||||
|
|
||||||
|
COPY(strings^[0], parent);
|
||||||
|
|
||||||
|
IF Strings.Length(parent) < 1 THEN RETURN FALSE END;
|
||||||
|
|
||||||
|
noneTerminal := jsonRecord.GetNonTerminal(self, parent);
|
||||||
|
|
||||||
|
IF noneTerminal = NIL THEN RETURN FALSE END;
|
||||||
|
|
||||||
|
FOR i := 1 TO LEN(strings^) - 1 DO
|
||||||
|
Strings.Append(strings[i], children);
|
||||||
|
IF i < LEN(strings^) - 1 THEN
|
||||||
|
Strings.Append(".", children);
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
|
RETURN noneTerminal.GetTerminal(noneTerminal, children, returnValue);
|
||||||
|
|
||||||
RETURN FALSE;
|
RETURN FALSE;
|
||||||
END GetTerminal;
|
END GetTerminal;
|
||||||
|
|
||||||
|
PROCEDURE GetTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString);
|
||||||
|
VAR
|
||||||
|
i: LONGINT;
|
||||||
|
BEGIN
|
||||||
|
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO
|
||||||
|
destination[i] := self.TerminalKeys[i];
|
||||||
|
END;
|
||||||
|
END GetTerminalKeys;
|
||||||
|
|
||||||
|
PROCEDURE GetNoneTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString);
|
||||||
|
VAR
|
||||||
|
i: LONGINT;
|
||||||
|
BEGIN
|
||||||
|
FOR i := 0 TO LEN(self.NonTerminalKeys) - 1 DO
|
||||||
|
destination[i] := self.NonTerminalKeys[i];
|
||||||
|
END;
|
||||||
|
END GetNoneTerminalKeys;
|
||||||
(*
|
(*
|
||||||
TODO:
|
TODO:
|
||||||
Create a good validation for comas
|
Create a good validation for comas
|
||||||
|
|
@ -101,7 +157,9 @@ BEGIN
|
||||||
NEW(self);
|
NEW(self);
|
||||||
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
||||||
self.GetTerminal := GetTerminal;
|
self.GetTerminal := GetTerminal;
|
||||||
|
self.GetNonTerminal := GetNonTerminal;
|
||||||
|
self.GetTerminalKeys := GetTerminalKeys;
|
||||||
|
self.GetNoneTerminalKeys := GetNoneTerminalKeys;
|
||||||
NEW(characterStack);
|
NEW(characterStack);
|
||||||
characterStack := CharacterStack.Create();
|
characterStack := CharacterStack.Create();
|
||||||
|
|
||||||
|
|
@ -186,7 +244,7 @@ BEGIN
|
||||||
END Create;
|
END Create;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
(* NEW(jsonRecord);
|
NEW(jsonRecord);
|
||||||
jsonRecord := Create("{'foo': 'bar', 'test': 'test1', 'test2': {'sub': 'dub'}}");
|
jsonRecord := Create("{'foo': 'bar', 'test': 'test1', 'test2': {'sub': 'dub'}}");
|
||||||
|
|
||||||
keyFound := jsonRecord.GetTerminal(jsonRecord, "foo", testValue);
|
keyFound := jsonRecord.GetTerminal(jsonRecord, "foo", testValue);
|
||||||
|
|
@ -194,5 +252,12 @@ BEGIN
|
||||||
IF keyFound THEN
|
IF keyFound THEN
|
||||||
Logger.Log('found KEY');
|
Logger.Log('found KEY');
|
||||||
Logger.Log(testValue);
|
Logger.Log(testValue);
|
||||||
ELSE Logger.Log('Value for the Key is not found') END; *)
|
ELSE Logger.Log('Value for the Key is not found') END;
|
||||||
|
|
||||||
|
keyFound := jsonRecord.GetTerminal(jsonRecord, "test2.sub", testValue);
|
||||||
|
|
||||||
|
IF keyFound THEN
|
||||||
|
Logger.Log('found KEY');
|
||||||
|
Logger.Log(testValue);
|
||||||
|
ELSE Logger.Log('Value for the Key is not found') END;
|
||||||
END JsonParser.
|
END JsonParser.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue