Flat JSON workssssss

This commit is contained in:
Ruben Shekspir 2019-04-21 19:05:22 +04:00
parent ab05eb8bd5
commit 78085b1079
2 changed files with 45 additions and 43 deletions

View file

@ -19,9 +19,9 @@ TYPE
CharacterStackType* = POINTER TO CharacterStackTypeDesc; CharacterStackType* = POINTER TO CharacterStackTypeDesc;
CharacterStackTypeDesc* = RECORD (List.TListDesc) CharacterStackTypeDesc* = RECORD (List.TListDesc)
pop: PROCEDURE(self: CharacterStackType): CHAR; pop*: PROCEDURE(self: CharacterStackType): CHAR;
push: PROCEDURE(self: CharacterStackType; char: CHAR); push*: PROCEDURE(self: CharacterStackType; char: CHAR);
top: PROCEDURE(self: CharacterStackType) : CHAR; top*: PROCEDURE(self: CharacterStackType) : CHAR;
END; END;
VAR VAR

View file

@ -1,5 +1,5 @@
MODULE HashMap; MODULE HashMap;
IMPORT Logger, CharacterStack, Strings; IMPORT Logger, CharacterStack, Strings, Out;
CONST CONST
ArrayMaxNumber = 5000; ArrayMaxNumber = 5000;
TYPE TYPE
@ -22,13 +22,23 @@ TYPE
VAR VAR
jsonRecord: JsonTypePointer; jsonRecord: JsonTypePointer;
testValue: ARRAY OF CHAR; testValue: ARRAY ArrayMaxNumber OF CHAR;
keyFound: BOOLEAN; keyFound: BOOLEAN;
PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN;
VAR
i: LONGINT;
BEGIN
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;
END;
RETURN FALSE;
END GetTerminal;
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer; PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
VAR VAR
self: JsonTypePointer; self: JsonTypePointer;
i,j,k,s: INTEGER; i,j,k,s: LONGINT;
characterStack: CharacterStack.CharacterStackType; characterStack: CharacterStack.CharacterStackType;
key, val, string: ARRAY ArrayMaxNumber OF CHAR; key, val, string: ARRAY ArrayMaxNumber OF CHAR;
symbol: CHAR; symbol: CHAR;
@ -44,8 +54,7 @@ BEGIN
NEW(self); NEW(self);
NEW(self.NonTerminalValues, ArrayMaxNumber); NEW(self.NonTerminalValues, ArrayMaxNumber);
self.GetTerminal = GetTerminal; self.GetTerminal := GetTerminal;
NEW(characterStack); NEW(characterStack);
characterStack := CharacterStack.Create(); characterStack := CharacterStack.Create();
@ -53,6 +62,8 @@ BEGIN
i := 0; i := 0;
j := 0; j := 0;
k := 0; k := 0;
quoteStart := FALSE;
REPEAT REPEAT
symbol := text[i]; symbol := text[i];
@ -64,59 +75,50 @@ BEGIN
Logger.Log("End Parsing Json"); Logger.Log("End Parsing Json");
END; END;
IF quoteStart = FALSE & symbol = quote THEN quoteStart = TRUE IF ~quoteStart & (symbol = quote) THEN quoteStart := TRUE
ELSE IF quoteStart & symbol #= quote THEN characterStack.push(symbol) ELSIF quoteStart & (symbol # quote) THEN characterStack.push(characterStack, symbol)
ELSE IF quoteStart & symbol = quote THEN ELSIF quoteStart & (symbol = quote) THEN
j := 0; j := characterStack.Count;
WHILE characterStack.top #= 0AX DO WHILE characterStack.top(characterStack) # 0AX DO
str[j] = characterStack.pop; DEC(j);
string[j] := characterStack.pop(characterStack);
END; END;
quoteStart := FALSE; quoteStart := FALSE;
ELSE.
IF Strings.Length(string) & quoteStart #= FALSE THEN
IF Strings.Length(key) #= 0 THEN COPY(string, val)
ELSE COPY(string, val) #= 0 END;
COPY([], string);
END; END;
IF Strings.Length(key) #= 0 & Strings.Length(val) #= 0 THEN IF (Strings.Length(string) > 0) & ~quoteStart THEN
IF Strings.Length(key) > 0 THEN
COPY(string, val)
ELSE
COPY(string, key)
END;
COPY("", string);
END;
IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN
COPY(key, self.TerminalKeys[k]); COPY(key, self.TerminalKeys[k]);
COPY(val, self.TerminalsValues[k]); COPY(val, self.TerminalsValues[k]);
INC(k); INC(k);
COPY([], key); COPY("", key);
COPY([], val); COPY("", val);
END. END;
INC(i); INC(i);
UNTIL i > LEN(text) - 1; UNTIL i > LEN(text) - 1;
(* UNTIL text[i] = 0AX; TODO: Ask Norayr *)
(* WHY you write AND as & and OR as OR? *)
RETURN jsonRecord; RETURN self;
END Create; END Create;
PROCEDURE *GetTerminal(self: JsonTypePointer, key: ARRAY OF CHAR, VAR returnValue ARRAY OF CHAR): BOOLEAN
VAR
i: LONGINT;
BEGIN
FOR i := 0 TO LEN(self.TerminalKeys): DO
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], val) RETURN TRUE;
END
RETURN FALSE;
END GetTerminal;
BEGIN BEGIN
NEW(jsonRecord); NEW(jsonRecord);
jsonRecord := Create("{'asdasd': 'test'}"); jsonRecord := Create("{'foo': 'bar', 'test': 'test1'}");
keyFound := jsonRecord.GetNonTerminal("asdasd", testValue); keyFound := jsonRecord.GetTerminal(jsonRecord, "test", testValue);
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;
END HashMap. END HashMap.