mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-05 20:42:26 +00:00
Added fetching not terminal(not working)
This commit is contained in:
parent
78085b1079
commit
1dc0059fc2
1 changed files with 75 additions and 24 deletions
|
|
@ -2,6 +2,12 @@ MODULE HashMap;
|
||||||
IMPORT Logger, CharacterStack, Strings, Out;
|
IMPORT Logger, CharacterStack, Strings, Out;
|
||||||
CONST
|
CONST
|
||||||
ArrayMaxNumber = 5000;
|
ArrayMaxNumber = 5000;
|
||||||
|
(* Const *)
|
||||||
|
symbolBracketStart = "{";
|
||||||
|
symbolBracketEnd = "}";
|
||||||
|
(* TODO: Reverse " and ' *)
|
||||||
|
quote = "'";
|
||||||
|
coma = ",";
|
||||||
TYPE
|
TYPE
|
||||||
TString = ARRAY ArrayMaxNumber OF CHAR;
|
TString = ARRAY ArrayMaxNumber OF CHAR;
|
||||||
|
|
||||||
|
|
@ -35,23 +41,48 @@ BEGIN
|
||||||
RETURN FALSE;
|
RETURN FALSE;
|
||||||
END GetTerminal;
|
END GetTerminal;
|
||||||
|
|
||||||
|
PROCEDURE PushDownString(
|
||||||
|
string: ARRAY OF CHAR;
|
||||||
|
startCharacter: CHAR;
|
||||||
|
endCharacter: CHAR;
|
||||||
|
i: LONGINT;
|
||||||
|
VAR returnString: ARRAY OF CHAR): LONGINT;
|
||||||
|
VAR
|
||||||
|
characterStack: CharacterStack.CharacterStackType;
|
||||||
|
j , k: LONGINT;
|
||||||
|
BEGIN
|
||||||
|
NEW(characterStack);
|
||||||
|
j := i;
|
||||||
|
characterStack := CharacterStack.Create();
|
||||||
|
|
||||||
|
REPEAT
|
||||||
|
characterStack.push(characterStack, string[j]);
|
||||||
|
|
||||||
|
IF characterStack.top(characterStack) = endCharacter THEN
|
||||||
|
REPEAT
|
||||||
|
UNTIL characterStack.pop(characterStack) = startCharacter;
|
||||||
|
END;
|
||||||
|
|
||||||
|
INC(j);
|
||||||
|
UNTIL characterStack.top(characterStack) = 0AX;
|
||||||
|
|
||||||
|
FOR k := i TO j DO
|
||||||
|
returnString[k - i] := string[k];
|
||||||
|
END;
|
||||||
|
|
||||||
|
RETURN j;
|
||||||
|
END PushDownString;
|
||||||
|
|
||||||
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
|
PROCEDURE Create*(text: ARRAY OF CHAR): JsonTypePointer;
|
||||||
VAR
|
VAR
|
||||||
self: JsonTypePointer;
|
self: JsonTypePointer;
|
||||||
i,j,k,s: LONGINT;
|
i, j, terminalIterator, noneTerminalIterator: LONGINT;
|
||||||
characterStack: CharacterStack.CharacterStackType;
|
characterStack: CharacterStack.CharacterStackType;
|
||||||
key, val, string: ARRAY ArrayMaxNumber OF CHAR;
|
key, val, nonTerminalVal, string: ARRAY ArrayMaxNumber OF CHAR;
|
||||||
symbol: CHAR;
|
symbol: CHAR;
|
||||||
symbolStart: CHAR;
|
symbolStart: CHAR;
|
||||||
quoteStart: BOOLEAN;
|
quoteStart: BOOLEAN;
|
||||||
symbolBracketStart, symbolBracketEnd, quote: CHAR;
|
|
||||||
BEGIN
|
BEGIN
|
||||||
(* Const *)
|
|
||||||
symbolBracketStart := "{";
|
|
||||||
symbolBracketEnd := "}";
|
|
||||||
(* TODO: Reverse " and ' *)
|
|
||||||
quote := "'";
|
|
||||||
|
|
||||||
NEW(self);
|
NEW(self);
|
||||||
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
NEW(self.NonTerminalValues, ArrayMaxNumber);
|
||||||
self.GetTerminal := GetTerminal;
|
self.GetTerminal := GetTerminal;
|
||||||
|
|
@ -61,7 +92,8 @@ BEGIN
|
||||||
|
|
||||||
i := 0;
|
i := 0;
|
||||||
j := 0;
|
j := 0;
|
||||||
k := 0;
|
terminalIterator := 0;
|
||||||
|
noneTerminalIterator := 0;
|
||||||
|
|
||||||
quoteStart := FALSE;
|
quoteStart := FALSE;
|
||||||
|
|
||||||
|
|
@ -75,19 +107,12 @@ BEGIN
|
||||||
Logger.Log("End Parsing Json");
|
Logger.Log("End Parsing Json");
|
||||||
END;
|
END;
|
||||||
|
|
||||||
IF ~quoteStart & (symbol = quote) THEN quoteStart := TRUE
|
(* terminals *)
|
||||||
ELSIF quoteStart & (symbol # quote) THEN characterStack.push(characterStack, symbol)
|
IF symbol = quote THEN
|
||||||
ELSIF quoteStart & (symbol = quote) THEN
|
i := PushDownString(text; quote; quote; i; string);
|
||||||
j := characterStack.Count;
|
|
||||||
WHILE characterStack.top(characterStack) # 0AX DO
|
|
||||||
DEC(j);
|
|
||||||
string[j] := characterStack.pop(characterStack);
|
|
||||||
END;
|
|
||||||
quoteStart := FALSE;
|
|
||||||
END;
|
END;
|
||||||
|
|
||||||
IF (Strings.Length(string) > 0) & ~quoteStart THEN
|
IF (Strings.Length(string) > 0) & (symbol = quote) THEN
|
||||||
|
|
||||||
IF Strings.Length(key) > 0 THEN
|
IF Strings.Length(key) > 0 THEN
|
||||||
COPY(string, val)
|
COPY(string, val)
|
||||||
ELSE
|
ELSE
|
||||||
|
|
@ -98,13 +123,39 @@ BEGIN
|
||||||
END;
|
END;
|
||||||
|
|
||||||
IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN
|
IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN
|
||||||
COPY(key, self.TerminalKeys[k]);
|
COPY(key, self.TerminalKeys[terminalIterator]);
|
||||||
COPY(val, self.TerminalsValues[k]);
|
COPY(val, self.TerminalsValues[terminalIterator]);
|
||||||
INC(k);
|
INC(terminalIterator);
|
||||||
COPY("", key);
|
COPY("", key);
|
||||||
COPY("", val);
|
COPY("", val);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
(* none terminals *)
|
||||||
|
IF symbol = symbolBracketStart THEN
|
||||||
|
i := PushDownString(string; symbolBracketStart; symbolBracketEnd; i; string);
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF (Strings.Length(string) > 0) & (symbol = symbolBracketStart) THEN
|
||||||
|
IF Strings.Length(key) > 0 THEN
|
||||||
|
COPY(string, nonTerminalVal)
|
||||||
|
ELSE
|
||||||
|
COPY(string, key)
|
||||||
|
END;
|
||||||
|
|
||||||
|
COPY("", string);
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF (Strings.Length(text) > 0) & (Strings.Length(nonTerminalVal) > 0) THEN
|
||||||
|
|
||||||
|
COPY(key, self.NonTerminalKeys[noneTerminalIterator]);
|
||||||
|
self.NonTerminalValues[noneTerminalIterator].Create(nonTerminalVal);
|
||||||
|
|
||||||
|
INC(noneTerminalIterator);
|
||||||
|
|
||||||
|
COPY("", key);
|
||||||
|
COPY("", nonTerminalVal);
|
||||||
|
END;
|
||||||
|
|
||||||
INC(i);
|
INC(i);
|
||||||
UNTIL i > LEN(text) - 1;
|
UNTIL i > LEN(text) - 1;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue