Provided by: tcllib_1.17-dfsg-1_all bug

NAME

       pt::peg::to::json - PEG Conversion. Write JSON format

SYNOPSIS

       package require Tcl  8.5

       package require pt::peg::to::json  ?1?

       package require pt::peg

       package require json::write

       pt::peg::to::json reset

       pt::peg::to::json configure

       pt::peg::to::json configure option

       pt::peg::to::json configure option value...

       pt::peg::to::json convert serial

_________________________________________________________________________________________________

DESCRIPTION

       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.

       This package implements the converter from parsing expression grammars to JSON markup.

       It resides in the Export section of the Core Layer of Parser Tools, and can be used either
       directly with the other packages of this layer, or indirectly through the  export  manager
       provided  by pt::peg::export. The latter is intented for use in untrusted environments and
       done  through  the  corresponding  export  plugin  pt::peg::export::json  sitting  between
       converter and export manager.

       IMAGE: arch_core_eplugins

API

       The API provided by this package satisfies the specification of the Converter API found in
       the Parser Tools Export API specification.

       pt::peg::to::json reset
              This command resets the configuration of the package to its default settings.

       pt::peg::to::json configure
              This command returns a dictionary  containing  the  current  configuration  of  the
              package.

       pt::peg::to::json configure option
              This command returns the current value of the specified configuration option of the
              package. For the set of legal options, please read the section Options.

       pt::peg::to::json configure option value...
              This command sets the given configuration options of the package, to the  specified
              values. For the set of legal options, please read the section Options.

       pt::peg::to::json convert serial
              This  command takes the canonical serialization of a parsing expression grammar, as
              specified in section  PEG  serialization  format,  and  contained  in  serial,  and
              generates  JSON markup encoding the grammar, per the current package configuration.
              The created string is then returned as the result of the command.

OPTIONS

       The converter to the JSON grammar exchange format recognizes the  following  configuration
       variables and changes its behaviour as they specify.

       -file string
              The  value  of  this  option is the name of the file or other entity from which the
              grammar came, for which the command is run. The default value is unknown.

       -name string
              The value of this option is the name of the grammar we are processing.  The default
              value is a_pe_grammar.

       -user string
              The  value of this option is the name of the user for which the command is run. The
              default value is unknown.

       -indented boolean
              If this option is set the system will break the generated  JSON  across  lines  and
              indent  it  according  to  its  inner structure, with each key of a dictionary on a
              separate line.

              If the option is not set (the default), the whole JSON object will be written on  a
              single line, with minimum spacing between all elements.

       -aligned boolean
              If  this  option  is  set  the system will ensure that the values for the keys in a
              dictionary are vertically aligned with each other, for a  nice  table  effect.   To
              make this work this also implies that -indented is set.

              If the option is not set (the default), the output is formatted as per the value of
              indented, without trying to align the values for dictionary keys.

JSON GRAMMAR EXCHANGE FORMAT

       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:

       [1]    The JSON of any PEG is a JSON object.

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

       [3]    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.

                     [1]    Each nonterminal symbol may occur only once.

                     [2]    The empty string is not a legal nonterminal symbol.

                     [3]    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.

       [4]    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.

   EXAMPLE
       Assuming the following PEG for simple mathematical expressions

              PEG calculator (Expression)
                  Digit      <- '0'/'1'/'2'/'3'/'4'/'5'/'6'/'7'/'8'/'9'       ;
                  Sign       <- '-' / '+'                                     ;
                  Number     <- Sign? Digit+                                  ;
                  Expression <- Term (AddOp Term)*                            ;
                  MulOp      <- '*' / '/'                                     ;
                  Term       <- Factor (MulOp Factor)*                        ;
                  AddOp      <- '+'/'-'                                       ;
                  Factor     <- '(' Expression ')' / Number                   ;
              END;

       a JSON serialization for it is

              {
                  "pt::grammar::peg" : {
                      "rules" : {
                          "AddOp"     : {
                              "is"   : "\/ {t -} {t +}",
                              "mode" : "value"
                          },
                          "Digit"     : {
                              "is"   : "\/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}",
                              "mode" : "value"
                          },
                          "Expression" : {
                              "is"   : "\/ {x {t (} {n Expression} {t )}} {x {n Factor} {* {x {n MulOp} {n Factor}}}}",
                              "mode" : "value"
                          },
                          "Factor"    : {
                              "is"   : "x {n Term} {* {x {n AddOp} {n Term}}}",
                              "mode" : "value"
                          },
                          "MulOp"     : {
                              "is"   : "\/ {t *} {t \/}",
                              "mode" : "value"
                          },
                          "Number"    : {
                              "is"   : "x {? {n Sign}} {+ {n Digit}}",
                              "mode" : "value"
                          },
                          "Sign"      : {
                              "is"   : "\/ {t -} {t +}",
                              "mode" : "value"
                          },
                          "Term"      : {
                              "is"   : "n Number",
                              "mode" : "value"
                          }
                      },
                      "start" : "n Expression"
                  }
              }

       and a Tcl serialization of the same is

              pt::grammar::peg {
                  rules {
                      AddOp      {is {/ {t -} {t +}}                                                                mode value}
                      Digit      {is {/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}}                mode value}
                      Expression {is {x {n Term} {* {x {n AddOp} {n Term}}}}                                        mode value}
                      Factor     {is {/ {x {t (} {n Expression} {t )}} {n Number}}                                  mode value}
                      MulOp      {is {/ {t *} {t /}}                                                                mode value}
                      Number     {is {x {? {n Sign}} {+ {n Digit}}}                                                 mode value}
                      Sign       {is {/ {t -} {t +}}                                                                mode value}
                      Term       {is {x {n Factor} {* {x {n MulOp} {n Factor}}}}                                    mode value}
                  }
                  start {n Expression}
              }

       The similarity of the latter to the JSON should be quite obvious.

PEG SERIALIZATION FORMAT

       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

              [1]    The serialization of any PEG is a nested Tcl dictionary.

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

              [3]    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.

                            [1]    Each nonterminal symbol may occur only once.

                            [2]    The empty string is not a legal nonterminal symbol.

                            [3]    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.

              [4]    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.

              [1]    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.

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

   EXAMPLE
       Assuming the following PEG for simple mathematical expressions

              PEG calculator (Expression)
                  Digit      <- '0'/'1'/'2'/'3'/'4'/'5'/'6'/'7'/'8'/'9'       ;
                  Sign       <- '-' / '+'                                     ;
                  Number     <- Sign? Digit+                                  ;
                  Expression <- Term (AddOp Term)*                            ;
                  MulOp      <- '*' / '/'                                     ;
                  Term       <- Factor (MulOp Factor)*                        ;
                  AddOp      <- '+'/'-'                                       ;
                  Factor     <- '(' Expression ')' / Number                   ;
              END;

       then its canonical serialization (except for whitespace) is

              pt::grammar::peg {
                  rules {
                      AddOp      {is {/ {t -} {t +}}                                                                mode value}
                      Digit      {is {/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}}                mode value}
                      Expression {is {x {n Term} {* {x {n AddOp} {n Term}}}}                                        mode value}
                      Factor     {is {/ {x {t (} {n Expression} {t )}} {n Number}}                                  mode value}
                      MulOp      {is {/ {t *} {t /}}                                                                mode value}
                      Number     {is {x {? {n Sign}} {+ {n Digit}}}                                                 mode value}
                      Sign       {is {/ {t -} {t +}}                                                                mode value}
                      Term       {is {x {n Factor} {* {x {n MulOp} {n Factor}}}}                                    mode value}
                  }
                  start {n Expression}
              }

PE SERIALIZATION FORMAT

       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

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

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

                     [3]    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.

                     [4]    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.

                     [5]    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.

                     [6]    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.

                     [7]    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.

                     [8]    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.

                     [9]    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.

                     [10]   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.

                     [11]   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.

                     [12]   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.

                     [13]   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.

                     [14]   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.

                     [15]   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.

                     [16]   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.

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

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

              Combined Parsing Expressions

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

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

                     [3]    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.

                     [4]    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.

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

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

                     [7]    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.

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

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

   EXAMPLE
       Assuming the parsing expression shown on the right-hand side of the rule

                  Expression <- Term (AddOp Term)*

       then its canonical serialization (except for whitespace) is

                  {x {n Term} {* {x {n AddOp} {n Term}}}}

BUGS, IDEAS, FEEDBACK

       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
       [http://core.tcl.tk/tcllib/reportlist].  Please also report any ideas for enhancements you
       may have for either package and/or documentation.

KEYWORDS

       EBNF, JSON, LL(k), PEG,  TDPL,  context-free  languages,  conversion,  expression,  format
       conversion,  grammar,  matching,  parser,  parsing expression, parsing expression grammar,
       push down automaton, recursive descent, serialization, state, top-down parsing  languages,
       transducer

CATEGORY

       Parsing and Grammars

COPYRIGHT

       Copyright (c) 2009 Andreas Kupries <andreas_kupries@users.sourceforge.net>