fixed issue with push down

This commit is contained in:
Ruben Shekspir 2019-04-27 11:16:14 +04:00
parent 959cb3bb9b
commit 7ec56af371

View file

@ -1,7 +1,7 @@
MODULE HashMap; MODULE HashMap;
IMPORT Logger, CharacterStack, Strings, Out; IMPORT Logger, CharacterStack, Strings, Out;
CONST CONST
ArrayMaxNumber = 5000; ArrayMaxNumber = 100;
(* Const *) (* Const *)
symbolBracketStart = "{"; symbolBracketStart = "{";
symbolBracketEnd = "}"; symbolBracketEnd = "}";
@ -30,7 +30,6 @@ VAR
jsonRecord: JsonTypePointer; jsonRecord: JsonTypePointer;
testValue: ARRAY ArrayMaxNumber 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; PROCEDURE GetTerminal *(self: JsonTypePointer; key: ARRAY OF CHAR; VAR returnValue: ARRAY OF CHAR): BOOLEAN;
VAR VAR
i: LONGINT; i: LONGINT;
@ -41,6 +40,12 @@ BEGIN
RETURN FALSE; RETURN FALSE;
END GetTerminal; END GetTerminal;
(*
TODO:
Create a good validation for comas
Create a good validation for name repetition
*)
PROCEDURE PushDownString( PROCEDURE PushDownString(
string: ARRAY OF CHAR; string: ARRAY OF CHAR;
startCharacter: CHAR; startCharacter: CHAR;
@ -54,23 +59,20 @@ BEGIN
NEW(characterStack); NEW(characterStack);
j := i; j := i;
characterStack := CharacterStack.Create(); characterStack := CharacterStack.Create();
REPEAT REPEAT
IF (characterStack.Count > 1) & (string[j] = endCharacter) THEN
REPEAT UNTIL characterStack.pop(characterStack) = startCharacter;
ELSE
characterStack.push(characterStack, string[j]); characterStack.push(characterStack, string[j]);
IF characterStack.top(characterStack) = endCharacter THEN
REPEAT
UNTIL characterStack.pop(characterStack) = startCharacter;
END;
INC(j); INC(j);
END;
UNTIL characterStack.top(characterStack) = 0AX; UNTIL characterStack.top(characterStack) = 0AX;
FOR k := i TO j DO FOR k := i TO j DO
returnString[k - i] := string[k]; returnString[k - i] := string[k];
END; END;
RETURN j; RETURN j; (* returning next symbol of quote *)
END PushDownString; END PushDownString;
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer; PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
@ -98,8 +100,8 @@ BEGIN
quoteStart := FALSE; quoteStart := FALSE;
REPEAT REPEAT
symbol := text[i]; IF (text[i] = symbolBracketStart) & (i = 0) THEN
IF symbol = symbolBracketStart THEN INC(i);
Logger.Log("Starting Parse Json"); Logger.Log("Starting Parse Json");
END; END;
@ -107,6 +109,8 @@ BEGIN
Logger.Log("End Parsing Json"); Logger.Log("End Parsing Json");
END; END;
symbol := text[i];
(* terminals *) (* terminals *)
IF symbol = quote THEN IF symbol = quote THEN
i := PushDownString(text, quote, quote, i, string); i := PushDownString(text, quote, quote, i, string);
@ -126,13 +130,14 @@ BEGIN
COPY(key, self.TerminalKeys[terminalIterator]); COPY(key, self.TerminalKeys[terminalIterator]);
COPY(val, self.TerminalsValues[terminalIterator]); COPY(val, self.TerminalsValues[terminalIterator]);
INC(terminalIterator); INC(terminalIterator);
COPY("", key); COPY("", key);
COPY("", val); COPY("", val);
END; END;
(* none terminals *) (* none terminals *)
IF symbol = symbolBracketStart THEN IF symbol = symbolBracketStart THEN
i := PushDownString(string, symbolBracketStart, symbolBracketEnd, i, string); i := PushDownString(text, symbolBracketStart, symbolBracketEnd, i, string);
END; END;
IF (Strings.Length(string) > 0) & (symbol = symbolBracketStart) THEN IF (Strings.Length(string) > 0) & (symbol = symbolBracketStart) THEN
@ -164,8 +169,9 @@ END Create;
BEGIN BEGIN
NEW(jsonRecord); NEW(jsonRecord);
jsonRecord := Create("{'foo': 'bar', 'test': 'test1'}"); jsonRecord := Create("{'foo': 'bar', 'test': 'test1', 'test2': {'asdasd': 'asd'}}");
keyFound := jsonRecord.GetTerminal(jsonRecord, "test", testValue);
keyFound := jsonRecord.GetTerminal(jsonRecord, "'test'", testValue);
IF keyFound THEN IF keyFound THEN
Logger.Log('found KEY'); Logger.Log('found KEY');