Are you lost ? Do you have trouble understanding this document ?
In that case please read the overview provided by the Introduction to Parser
Tools. This document is the entrypoint to the whole system
the current package is a part of.

The json format for parsing expression
grammars was written as a data exchange format not bound to Tcl. It
was defined to allow the exchange of grammars with PackRat/PEG
based parser generators for other languages.

It is formally specified by the rules below:

The JSON of any PEG is a JSON object.

This object holds a single key, pt::grammar::peg, and its value. This value holds the
contents of the grammar.

The contents of the grammar are a JSON object holding the set of
nonterminal symbols and the starting expression. The relevant keys
and their values are

rules

The value is a JSON object whose keys are the names of the
nonterminal symbols known to the grammar.

Each nonterminal symbol may occur only once.

The empty string is not a legal nonterminal symbol.

The value for each symbol is a JSON object itself. The relevant
keys and their values in this dictionary are

is

The value is a JSON string holding the Tcl serialization of the
parsing expression describing the symbols sentennial structure, as
specified in the section PE serialization format.

mode

The value is a JSON holding holding one of three values
specifying how a parser should handle the semantic value produced
by the symbol.

value

The semantic value of the nonterminal symbol is an abstract
syntax tree consisting of a single node node for the nonterminal
itself, which has the ASTs of the symbol's right hand side as its
children.

leaf

The semantic value of the nonterminal symbol is an abstract
syntax tree consisting of a single node node for the nonterminal,
without any children. Any ASTs generated by the symbol's right hand
side are discarded.

void

The nonterminal has no semantic value. Any ASTs generated by the
symbol's right hand side are discarded (as well).

start

The value is a JSON string holding the Tcl serialization of the
start parsing expression of the grammar, as specified in the
section PE serialization
format.

The terminal symbols of the grammar are specified implicitly as
the set of all terminal symbols used in the start expression and on
the RHS of the grammar rules.

As an aside to the advanced reader, this is pretty much the same
as the Tcl serialization of PE grammars, as specified in section
PEG serialization
format, except that the Tcl dictionaries and lists of
that format are mapped to JSON objects and arrays. Only the parsing
expressions themselves are not translated further, but kept as JSON
strings containing a nested Tcl list, and there is no concept of
canonicity for the JSON either.

Here we specify the format used by the Parser Tools to serialize
Parsing Expression Grammars as immutable values for transport,
comparison, etc.

We distinguish between regular and canonical serializations. While a PEG may have more than
one regular serialization only exactly one of them will be canonical.

regular serialization

The serialization of any PEG is a nested Tcl dictionary.

This dictionary holds a single key, pt::grammar::peg, and its value. This value holds the
contents of the grammar.

The contents of the grammar are a Tcl dictionary holding the set
of nonterminal symbols and the starting expression. The relevant
keys and their values are

rules

The value is a Tcl dictionary whose keys are the names of the
nonterminal symbols known to the grammar.

Each nonterminal symbol may occur only once.

The empty string is not a legal nonterminal symbol.

The value for each symbol is a Tcl dictionary itself. The
relevant keys and their values in this dictionary are

is

The value is the serialization of the parsing expression
describing the symbols sentennial structure, as specified in the
section PE serialization
format.

mode

The value can be one of three values specifying how a parser
should handle the semantic value produced by the symbol.

value

The semantic value of the nonterminal symbol is an abstract
syntax tree consisting of a single node node for the nonterminal
itself, which has the ASTs of the symbol's right hand side as its
children.

leaf

The semantic value of the nonterminal symbol is an abstract
syntax tree consisting of a single node node for the nonterminal,
without any children. Any ASTs generated by the symbol's right hand
side are discarded.

void

The nonterminal has no semantic value. Any ASTs generated by the
symbol's right hand side are discarded (as well).

start

The value is the serialization of the start parsing expression
of the grammar, as specified in the section PE serialization
format.

The terminal symbols of the grammar are specified implicitly as
the set of all terminal symbols used in the start expression and on
the RHS of the grammar rules.

canonical serialization

The canonical serialization of a grammar has the format as
specified in the previous item, and then additionally satisfies the
constraints below, which make it unique among all the possible
serializations of this grammar.

The keys found in all the nested Tcl dictionaries are sorted in
ascending dictionary order, as generated by Tcl's builtin command
lsort -increasing -dict.

The string representation of the value is the canonical
representation of a Tcl dictionary. I.e. it does not contain
superfluous whitespace.

Here we specify the format used by the Parser Tools to serialize
Parsing Expressions as immutable values for transport, comparison,
etc.

We distinguish between regular and canonical serializations. While a parsing expression may
have more than one regular serialization only exactly one of them
will be canonical.

Regular serialization

Atomic Parsing Expressions

The string epsilon is an atomic parsing
expression. It matches the empty string.

The string dot is an atomic parsing
expression. It matches any character.

The string alnum is an atomic parsing
expression. It matches any Unicode alphabet or digit character.
This is a custom extension of PEs based on Tcl's builtin command string is.

The string alpha is an atomic parsing
expression. It matches any Unicode alphabet character. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string ascii is an atomic parsing
expression. It matches any Unicode character below U0080. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string control is an atomic parsing
expression. It matches any Unicode control character. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string digit is an atomic parsing
expression. It matches any Unicode digit character. Note that this
includes characters outside of the [0..9] range. This is a custom
extension of PEs based on Tcl's builtin command string is.

The string graph is an atomic parsing
expression. It matches any Unicode printing character, except for
space. This is a custom extension of PEs based on Tcl's builtin
command string is.

The string lower is an atomic parsing
expression. It matches any Unicode lower-case alphabet character.
This is a custom extension of PEs based on Tcl's builtin command string is.

The string print is an atomic parsing
expression. It matches any Unicode printing character, including
space. This is a custom extension of PEs based on Tcl's builtin
command string is.

The string punct is an atomic parsing
expression. It matches any Unicode punctuation character. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string space is an atomic parsing
expression. It matches any Unicode space character. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string upper is an atomic parsing
expression. It matches any Unicode upper-case alphabet character.
This is a custom extension of PEs based on Tcl's builtin command string is.

The string wordchar is an atomic parsing
expression. It matches any Unicode word character. This is any
alphanumeric character (see alnum), and any connector punctuation
characters (e.g. underscore). This is a custom extension of PEs
based on Tcl's builtin command string is.

The string xdigit is an atomic parsing
expression. It matches any hexadecimal digit character. This is a
custom extension of PEs based on Tcl's builtin command string is.

The string ddigit is an atomic parsing
expression. It matches any decimal digit character. This is a
custom extension of PEs based on Tcl's builtin command regexp.

The expression [list t x] is an atomic
parsing expression. It matches the terminal string x.

The expression [list n A] is an atomic
parsing expression. It matches the nonterminal A.

Combined Parsing Expressions

For parsing expressions e1, e2, ... the result of [list / e1e2 ... ] is a parsing
expression as well. This is the ordered choice,
aka prioritized choice.

For parsing expressions e1, e2, ... the result of [list x e1e2 ... ] is a parsing
expression as well. This is the sequence.

For a parsing expression e the result of
[list * e] is a parsing expression as well.
This is the kleene closure, describing zero or
more repetitions.

For a parsing expression e the result of
[list + e] is a parsing expression as well.
This is the positive kleene closure, describing
one or more repetitions.

For a parsing expression e the result of
[list & e] is a parsing expression as
well. This is the and lookahead predicate.

For a parsing expression e the result of
[list ! e] is a parsing expression as well.
This is the not lookahead predicate.

For a parsing expression e the result of
[list ? e] is a parsing expression as well.
This is the optional input.

Canonical serialization

The canonical serialization of a parsing expression has the
format as specified in the previous item, and then additionally
satisfies the constraints below, which make it unique among all the
possible serializations of this parsing expression.

The string representation of the value is the canonical
representation of a pure Tcl list. I.e. it does not contain
superfluous whitespace.

Terminals are not encoded as ranges (where start and
end of the range are identical).

This document, and the package it describes, will undoubtedly
contain bugs and other problems. Please report such in the category
pt of the Tcllib Trackers. Please
also report any ideas for enhancements you may have for either
package and/or documentation.