Commit 5b549f1d authored by thebusytypist's avatar thebusytypist

Elaborate the construction of state machine; add states diagram.

parent 03ecc2e4
digraph {
splines=true;
node [shape = doublecircle]; Start; Finish;
node [shape = circle];
Start -> ArrayInitial [label="["];
Start -> ObjectInitial [label="{"];
ObjectInitial -> ObjectFinish [label="}"];
ObjectInitial -> MemberKey [label="string"];
MemberKey -> KeyValueDelimiter [label=":"];
KeyValueDelimiter -> ArrayInitial [label="[ (push MemberValue)"];
KeyValueDelimiter -> ObjectInitial [label="{ (push MemberValue)"];
KeyValueDelimiter -> MemberValue [label="string|false|true|null|number"];
MemberValue -> ObjectFinish [label="}"];
MemberValue -> MemberDelimiter [label=","];
MemberDelimiter -> MemberKey [label="string"];
ArrayInitial -> ArrayInitial [label="[ (push Element)"];
ArrayInitial -> ArrayFinish [label="]"];
ArrayInitial -> ObjectInitial [label="{ (push Element)"];
ArrayInitial -> Element [label="string|flase|true|null|number"];
Element -> ArrayFinish [label="]"];
Element -> ElementDelimiter [label=","];
ElementDelimiter -> ArrayInitial [label="[ (push Element)"];
ElementDelimiter -> ObjectInitial [label="{ (push Element)"];
ElementDelimiter -> Element [label="string|false|true|null|number"];
ArrayFinish -> Finish;
ObjectFinish -> Finish;
}
...@@ -112,10 +112,16 @@ while generating a production could work. ...@@ -112,10 +112,16 @@ while generating a production could work.
In RapidJSON, several modifications(or adaptations to current design) are made to a direct implementation. In RapidJSON, several modifications(or adaptations to current design) are made to a direct implementation.
First, the parsing table is encoded in a state machine in RapidJSON. First, the parsing table is encoded in a state machine in RapidJSON.
Extra states are added for productions involved with `array` and `object`. States are constructed by the head and body of production.
State transitions are constructed by production rules.
Besides, extra states are added for productions involved with `array` and `object`.
In this way the generation of array values or object members would be a single state transition, In this way the generation of array values or object members would be a single state transition,
rather than several pop/push operations in the direct implementation. rather than several pop/push operations in the direct implementation.
This also makes the estimation of stack size more easier. This also makes the estimation of stack size more easier.
The final states diagram is shown below:
![States Diagram](diagram/iterative-parser-states-diagram.png)
Second, the iterative parser also keeps track of array's value count and object's member count Second, the iterative parser also keeps track of array's value count and object's member count
in its internal stack, which may be different from a conventional implementation. in its internal stack, which may be different from a conventional implementation.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment