HashMapString.Mod sent

This commit is contained in:
Ruben Shekspir 2019-04-21 13:43:31 +04:00
parent d7a574ce89
commit ab05eb8bd5

View file

@ -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.