Elaborate the construction of state machine; add states diagram.
This commit is contained in:
parent
03ecc2e4f8
commit
5b549f1dce
37
doc/diagram/iterative-parser-states-diagram.dot
Normal file
37
doc/diagram/iterative-parser-states-diagram.dot
Normal 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;
|
||||
}
|
BIN
doc/diagram/iterative-parser-states-diagram.png
Normal file
BIN
doc/diagram/iterative-parser-states-diagram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
@ -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:
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user