From ab05eb8bd5954c5062d57368c8dcddda747fa637 Mon Sep 17 00:00:00 2001 From: Ruben Shekspir Date: Sun, 21 Apr 2019 13:43:31 +0400 Subject: [PATCH] HashMapString.Mod sent --- HashMapString.Mod | 88 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/HashMapString.Mod b/HashMapString.Mod index ec53028..742f675 100644 --- a/HashMapString.Mod +++ b/HashMapString.Mod @@ -2,47 +2,57 @@ MODULE HashMap; IMPORT Logger, CharacterStack, Strings; CONST ArrayMaxNumber = 5000; - symbolBracketStart = "{"; - symbolBracketEnd = "}"; TYPE TString = ARRAY ArrayMaxNumber OF CHAR; JsonTypePointer* = POINTER TO JsonType; JsonType* = RECORD - GetTerminal* : PROCEDURE(self : JsonTypePointer; string : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR); + GetTerminal* : PROCEDURE(self : JsonTypePointer; string : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR): BOOLEAN; GetNonTerminal* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer; HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN; TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR); - TerminalsValues : ARRAY ArrayMaxNumber OF TString; TerminalKeys : ARRAY ArrayMaxNumber OF TString; + TerminalsValues : ARRAY ArrayMaxNumber OF TString; - NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; NonTerminalKeys : ARRAY ArrayMaxNumber OF TString; + NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; END; VAR - jsonRecord :JsonTypePointer; - - - + jsonRecord: JsonTypePointer; + testValue: ARRAY OF CHAR; + keyFound: BOOLEAN; PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer; VAR - jsonRecord: JsonTypePointer; - i,j: INTEGER; + self: JsonTypePointer; + i,j,k,s: INTEGER; characterStack: CharacterStack.CharacterStackType; - key, val: ARRAY ArrayMaxNumber OF CHAR; + key, val, string: ARRAY ArrayMaxNumber OF CHAR; symbol: CHAR; symbolStart: CHAR; + quoteStart: BOOLEAN; + symbolBracketStart, symbolBracketEnd, quote: CHAR; BEGIN - NEW(jsonRecord); + (* Const *) + symbolBracketStart := "{"; + symbolBracketEnd := "}"; + (* TODO: Reverse " and ' *) + quote := "'"; + + NEW(self); + NEW(self.NonTerminalValues, ArrayMaxNumber); + self.GetTerminal = GetTerminal; + + NEW(characterStack); characterStack := CharacterStack.Create(); i := 0; j := 0; + k := 0; REPEAT symbol := text[i]; @@ -53,14 +63,60 @@ BEGIN IF symbol = symbolBracketStart THEN Logger.Log("End Parsing Json"); END; + + IF quoteStart = FALSE & symbol = quote THEN quoteStart = TRUE + ELSE IF quoteStart & symbol #= quote THEN characterStack.push(symbol) + ELSE IF quoteStart & symbol = quote THEN + j := 0; + WHILE characterStack.top #= 0AX DO + str[j] = characterStack.pop; + END; + 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; + + IF Strings.Length(key) #= 0 & Strings.Length(val) #= 0 THEN + COPY(key, self.TerminalKeys[k]); + COPY(val, self.TerminalsValues[k]); + INC(k); + COPY([], key); + COPY([], val); + END. + INC(i); UNTIL i > LEN(text) - 1; - (* UNTIL text[i] = 0AX; TODO: Ask Norayr *) - + (* UNTIL text[i] = 0AX; TODO: Ask Norayr *) + (* WHY you write AND as & and OR as OR? *) + RETURN jsonRecord; 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 NEW(jsonRecord); - jsonRecord := Create('{"asdasd": "test"}'); + jsonRecord := Create("{'asdasd': 'test'}"); + keyFound := jsonRecord.GetNonTerminal("asdasd", testValue); + + IF keyFound THEN + Logger.Log('found KEY'); + Logger.Log(testValue); + ELSE Logger.Log('VAlue for the Key is not found') END; + END HashMap. \ No newline at end of file