Elaborate the construction of state machine; add states diagram.

This commit is contained in:
thebusytypist 2014-07-19 13:12:13 +08:00
parent 03ecc2e4f8
commit 5b549f1dce
3 changed files with 44 additions and 1 deletions

View File

@ -0,0 +1,37 @@
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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@ -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.
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,
rather than several pop/push operations in the direct implementation.
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
in its internal stack, which may be different from a conventional implementation.