Provided by: tcllib_1.21+dfsg-1_all bug

NAME

       pt_parser_api - Parser API

SYNOPSIS

       package require Tcl  8.5

       className ?objectName?

       objectName destroy

       objectName parse chan

       objectName parset text

_________________________________________________________________________________________________

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  document describes the API shared by the grammar interpreter provided by the package
       pt::peg::interp and the parsers generated by the pt application  for  the  result  formats
       critcl, snit, and oo regarding access to the actual parsing functionality.

       Its  intended  audience are people who wish to create a parser for some language of theirs
       and then use that parser within a Tcl-based package or application.

       It resides in the User Layer of Parser Tools.

       IMAGE: arch_user_pkg

CLASS API

       className ?objectName?
              The class command constructs parser instances, i.e.  objects.  The  result  of  the
              command is the fully-qualified name of the instance command.

              If no objectName is specified the class will generate and use an automatic name. If
              the objectName was specified, but is  not  fully  qualified  the  command  will  be
              created in the current namespace.

INSTANCE API

       All parser instances provide at least the methods shown below:

       objectName destroy
              This  method  destroys  the parser instance, releasing all claimed memory and other
              resources, and deleting the instance command.

              The result of the command is the empty string.

       objectName parse chan
              This method runs the parser using the contents of chan as input  (starting  at  the
              current  location  in  the  channel), until parsing is not possible anymore, either
              because parsing has completed, or run into a syntax error.

              Note here that the Parser Tools are based on Tcl 8.5+. In other words, the  channel
              argument  is  not  restricted  to  files,  sockets,  etc. We have the full power of
              reflected channels available.

              It should also be noted that the parser pulls the characters from the input  stream
              as  it needs them. If a parser created by this package has to be operated in a push
              aka event-driven manner it will be  necessary  to  go  to  Tcl  8.6+  and  use  the
              coroutine::auto  to  wrap  it  into  a coroutine where read is properly changed for
              push-operation.

              Upon successful completion the command returns  an  abstract  syntax  tree  as  its
              result.  This AST is in the form specified in section AST serialization format.  As
              a plain nested Tcl-list it can then be processed with any  Tcl  commands  the  user
              likes,  doing  transformations,  semantic checks, etc.  To help in this the package
              pt::ast provides a set of convenience commands for validation of the  tree's  basic
              structure,  printing it for debugging, and walking it either from the bottom up, or
              top down.

              When encountering a syntax error the command will throw  an  error  instead.   This
              error will be a 4-element Tcl-list, containing, in the order listed below:

              [1]    The string pt::rde identifying it as parser runtime error.

              [2]    The  location  of the parse error, as character offset from the beginning of
                     the parsed input.

              [3]    The location of parse error, now as a 2-element list containing  line-number
                     and column in the line.

              [4]    A  set  of  atomic  parsing  expressions  indicating encoding the characters
                     and/or nonterminal symbols the parser expected to see at the location of the
                     parse  error,  but  did  not  get.   For the specification of atomic parsing
                     expressions please see the section PE serialization format.

       objectName parset text
              This method runs the parser using the string in text as input.  In all  other  ways
              it behaves like the method parse, shown above.

USAGE

       A generated parser is used like this

                  package require the-parser-package ;# Generated by result-formats 'critcl', 'snit' or 'oo' of 'pt'.
                  set parser [the-parser-class]

                  set ast [$parser parse $channel]
                  ... process the abstract syntax tree ...

       When using a grammar interpreter for parsing some differences creep in

                  package require the-grammar-package ;# Generated by result-format 'container' of 'pt'.
                  set grammar [the-grammar-class]

                  package require pt::peg::interp
                  set parser [pt::peg::interp]

                  $parser use $grammar

                  set ast [$parser parse $channel]
                  $parser destroy

                  ... process the abstract syntax tree ...

AST SERIALIZATION FORMAT

       Here  we  specify  the  format used by the Parser Tools to serialize Abstract Syntax Trees
       (ASTs) as immutable values for transport, comparison, etc.

       Each node in an AST represents a nonterminal  symbol  of  a  grammar,  and  the  range  of
       tokens/characters  in  the input covered by it. ASTs do not contain terminal symbols, i.e.
       tokens/characters. These can be recovered from the input given a symbol's location.

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

       Regular serialization

              [1]    The serialization of any AST is the serialization of its root node.

              [2]    The  serialization  of  any  node  is  a  Tcl list containing at least three
                     elements.

                     [1]    The first element is the name of the nonterminal symbol stored in the
                            node.

                     [2]    The  second and third element are the locations of the first and last
                            token in the token stream the node represents (covers).

                            [1]    Locations are provided as non-negative  integer  offsets  from
                                   the  beginning of the token stream, with the first token found
                                   in the stream located at offset 0 (zero).

                            [2]    The end location has to be equal to or larger than  the  start
                                   location.

                     [3]    All  elements  after  the  first  three represent the children of the
                            node, which are themselves nodes. This means that the  serializations
                            of  nodes  without  children,  i.e.  leaf  nodes,  have exactly three
                            elements.  The children are stored in  the  list  with  the  leftmost
                            child first, and the rightmost child last.

       Canonical serialization
              The  canonical serialization of an abstract syntax tree 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 tree.

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

   EXAMPLE
       Assuming the parsing expression grammar below

              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;

       and the input string

               120+5
       then a parser should deliver the abstract syntax tree below (except for whitespace)

              set ast {Expression 0 4
                  {Factor 0 4
                      {Term 0 2
                          {Number 0 2
                              {Digit 0 0}
                              {Digit 1 1}
                              {Digit 2 2}
                          }
                      }
                      {AddOp 3 3}
                      {Term 4 4
                          {Number 4 4
                              {Digit 4 4}
                          }
                      }
                  }
              }

       Or, more graphical

       .nf +- Digit 0 0 | 1 |            | +- Term 0 2 --- Number 0  2  -+-  Digit  1  1  |  2  |
       |                |     |                              +-    Digit    2    2    |    0    |
       | Expression 0 4  ---  Factor  0  4  -+-----------------------------  AddOp  3  3  |  +  |
       | +- Term 4 4 --- Number 4 4 --- Digit 4 4 | 5 .fi

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.

       When proposing code changes, please provide unified diffs, i.e the output of diff -u.

       Note further that attachments are strongly preferred over inlined patches. Attachments can
       be made by going to the Edit form of the ticket immediately after its creation,  and  then
       using the left-most button in the secondary navigation bar.

KEYWORDS

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

CATEGORY

       Parsing and Grammars

COPYRIGHT

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