Provided by: libmarpa-r2-perl_2.086000~dfsg-7build1_amd64 bug

Name

       Marpa::R2::Scanless::DSL - The DSL for the Scanless interface

Synopsis

           use Marpa::R2;

           my $grammar = Marpa::R2::Scanless::G->new(
               {   bless_package => 'My_Nodes',
                   source        => \(<<'END_OF_SOURCE'),
           :default ::= action => [values] bless => ::lhs
           lexeme default = action => [ start, length, value ]
               bless => ::name latm => 1

           :start ::= Script
           Script ::= Expression+ separator => comma
           comma ~ [,]
           Expression ::=
               Number bless => primary
               | '(' Expression ')' bless => paren assoc => group
              || Expression '**' Expression bless => exponentiate assoc => right
              || Expression '*' Expression bless => multiply
               | Expression '/' Expression bless => divide
              || Expression '+' Expression bless => add
               | Expression '-' Expression bless => subtract

           Number ~ [\d]+
           :discard ~ whitespace
           whitespace ~ [\s]+
           # allow comments
           :discard ~ <hash comment>
           <hash comment> ~ <terminated hash comment> | <unterminated
              final hash comment>
           <terminated hash comment> ~ '#' <hash comment body> <vertical space char>
           <unterminated final hash comment> ~ '#' <hash comment body>
           <hash comment body> ~ <hash comment char>*
           <vertical space char> ~ [\x{A}\x{B}\x{C}\x{D}\x{2028}\x{2029}]
           <hash comment char> ~ [^\x{A}\x{B}\x{C}\x{D}\x{2028}\x{2029}]
           END_OF_SOURCE
               }
           );

About this document

       This is the reference document for the domain-specific language (DSL) of Marpa's Scanless interface
       (SLIF).  The SLIF's DSL is an extension of BNF.  The SLIF DSL is used to specify other DSL's, and is
       therefore a "meta-DSL".

The structure of SLIF source strings

       The SLIF source string consists of a series of rules, pseudo-rules and statements.  These are made up of
       tokens, as described below.  Whitespace separates tokens, but is otherwise ignored.

       A hash (""#"") character starts a comment, which continues to the end of the line.  Comments are
       equivalent to whitespace.

L0, G1 and lexemes

       In reading this document, it is important to keep in mind the distinction, on one hand, between L0 and G1
       rules and, on the other hand, between rules and lexemes.  G1 rules have a semantics, which can be
       specified as described in this document.  L0 rules simply recognize symbols in the input.  L0 rules do
       not have a semantics.

       Top-level L0 rules correspond to a string in the input.  The top-level L0 rules are seen by G1 as
       lexemes, and the string to which a top-level L0 rule corresponds becomes the default value of the lexeme.
       The L0 grammar can be thought of as similar in behavior to a set of regular expressions with the lexemes
       being seen as similar to named captures.

       Lexemes are the symbols which form the interface between G1 and L0.  Lexemes, like G1 rules, have a
       semantics.  The semantics of lexemes is specified separately from the semantics of G1 rules, as described
       below.

Symbol names

       Symbol names can be either "bare" or enclosed in angle brackets.  Bare symbol names must consist entirely
       of Perl word characters (alphanumerics, plus the underscore).  Symbol names are case-sensitive.

       The angle brackets, if used, serve to "quote" the symbol name, and will not be part of the explicit
       symbol name.

       If angle brackets are used, symbol names may also contain whitespace, as in

           <op comma>

       A whitespace sequence inside angle brackets can include any whitespace character that is legal in Perl,
       including newlines.  This allows very long symbol names to be line wrapped, if necessary.

       Unlike the angle brackets, the whitespace in a bracketed symbol token does become part of the explicit
       symbol name, but it does so in a "normalized" form.  Leading and trailing whitespace in the name is
       discarded, and all other whitespace sequences are converted to a single ASCII space character.  This
       means that

           < op comma  >
           <op   comma>
           <     op comma>

       and even

           <op
           comma>

       will all be regarded as the same symbol name.  The explicit form of that symbol name is "<op comma>",
       except that, again, the angle brackets are for clarity, and are not part of the explicit name.

       Explicit, reserved and internal symbol names are often displayed between angle brackets, regardless of
       whether the symbol was originally specified in bracketed form.

       When a SLIF symbol needs to be referred to by name in Perl code, it is the symbol's explicit name that is
       used.

Single-quoted strings

           Expression ::=
               Number bless => primary
               | '(' Expression ')' bless => paren assoc => group
              || Expression '**' Expression bless => exponentiate assoc => right
              || Expression '*' Expression bless => multiply
               | Expression '/' Expression bless => divide
              || Expression '+' Expression bless => add
               | Expression '-' Expression bless => subtract

           Child ~ 'cHILd':i

       Single quotes can be used in prioritized rules to indicate character strings.  The characters inside the
       single quote will be matched in the input, literally and one-for-one.  Single-quoted strings can contain
       any characters with the exception of single quotes and vertical whitespace.

       Single-quoted strings do not allow "escaped" characters.  A backslash (""\"") represents itself and has
       no effect on the interpretation of the next character.  If a rule needs to match one of the forbidden
       characters (single quote or vertical whitespace), it must use a character class.

       Single-quoted strings are always interpreted at the L0 level, but they may be used in either structural
       or lexical rules.  When a single quoted string is used in a structural rule, Marpa creates a virtual L0
       rule on behalf of the application.  This is handy, but it does have a real disadvantage -- the name of
       the virtual rule's LHS will be one assigned automatically by Marpa.  When tracing and debugging parses
       and grammars, these virtual LHS's can be harder for a programmer to interpret.

       A modifier can appear after the string.  It must appear immediately after the string, with no intervening
       whitespace.  Currently only the "":ic"" and "":i"" modifier are availables.  These have exactly the same
       effect -- they make the string match case-insensitive.

Character classes

           <vertical space char> ~ [\x{A}\x{B}\x{C}\x{D}\x{2028}\x{2029}]

           word ~ [\w]:ic +

       A character class in square brackets (""[]"") can be used in a RHS alternative of a prioritized rule, a
       quantified rule or a discard pseudo-rule.  Marpa character classes may contain anything acceptable to
       Perl, and follow the same escaping conventions as Perl's character classes.

       Character classes are always interpreted at the L0 level, but they may be used in either structural or
       lexical rules.  When a character class is used in a structural rule, Marpa creates a virtual L0 rule on
       behalf of the application.  This is handy, but it does have a real disadvantage -- the name of the
       virtual rule's LHS will be one assigned automatically by Marpa.  When tracing and debugging parses and
       grammars, these virtual LHS's can be harder for a programmer to interpret.

       An implementation note: character classes are interpreted by Perl, but this involves minimal overhead
       when the parse is of any length.  Each character class is passed to Perl to interpret exactly once and
       the result is memoized in a C language structure for future use.

       The modifiers allowed after single quoted strings are also allowed allowed after character classes.
       Modifiers must appear immediately after the closing square bracket, with no intervening whitespace.  For
       more details, see the section on single-quoted strings.

Statements

       The SLIF DSL consists of a series of statements.  The statements are of three kinds, as indicated by
       their declarator:

       •   G1 rules

           The BNF operator (""::=""), coming between the LHS and the first RHS alternative of a rule, indicates
           that the rule is a G1 rule.

       •   L0 rules

           The match operator (""~""), coming between the LHS and the first RHS alternative of a rule, indicates
           a L0 rule.

       •   Global statements

           Global  statements  are signified by the assignment operator (""="").  The location of a statement in
           the DSL source will never affect the result.

       Rules differ from statements in that the effect of a rule is sometimes lexical -- that is, the effect may
       vary depending on the position of the rule in the  DSL  source.   Some  rules  are  called  pseudo-rules.
       Pseudo-rules  do  not  correspond  to  BNF  rules, but instead use the rule format as a convenient way to
       express other information.

The structure of rules

       Every rule declaration consists of, in order:

       •   A left hand side (LHS).  This will be a symbol or a pseudo-symbol.

       •   A declaration operator (""::="" or ""~"").

       •   A right side declaration, which contains one or more RHS alternatives.  Details  of  the  right  side
           declaration vary by the type of rule.  For each type of rule, the right side declaration is described
           in detail below.

RHS alternatives

       The  right side declaration of a rule will often contain one or more RHS alternatives.  A RHS alternative
       is a series of RHS primaries, where a RHS primary may be a symbol name, a character class,  or  a  single
       quoted string.  A list of one or more adverbs is often associated with the RHS alternatives.  Each adverb
       consists of a keyword, the adverb operator (""=>""), and the adverb's value.

       Within  an  alternative,  primaries may be enclosed in parentheses.  A primary enclosed in parentheses is
       hidden from Marpa's semantics.  A set of parentheses may contain more than one primary, in which case the
       entire sequence of primaries is hidden, as  if  they  had  been  enclosed  in  parentheses  individually.
       "Hiding"  primaries  in  this way can be convenient for primaries whose values the semantics will ignore,
       perhaps because the value is constant.

       For example, in the following rule

           a ::= b (',' c) d action => ::first

       there is

       •   A LHS, in this case the symbol ""a"".

       •   A declarator, ""::="", which indicates this is a G1 rule.

       •   A RHS alternative consisting of four RHS primaries.  The first RHS primary is the symbol ""b"".   The
           second  RHS  primary  is  a  short  single-quoted string ','.  The third and fourth RHS primaries are
           symbols: ""c"" and ""d"".  The parentheses around the second and third RHS primaries "hide" them from
           the semantics.  Marpa's semantics will see this as a rule with only two RHS values.

       •   The adverb list associated with the RHS alternative, consisting  of  a  single  adverb.   The  adverb
           consists  of its keyword ""action"", followed by the adverb operator (""=>""), and the adverb's value
           ""::first"".

       The rule in the above example is one of a very common type: a trivial prioritized  rule.   A  prioritized
       rule is one that contains one or more prioritized RHS alternatives.  Prioritized rules are the only rules
       which  may  contain  more  than one RHS alternative, but even prioritized rules usually have only one RHS
       alternative.  If there is only one RHS alternative, as in this case, the  prioritization  is  trivial  --
       there is only one priority.

   Start rule
           :start ::= Script

       By  default,  the  start symbol of the grammar is the LHS of the first G1 rule.  This default can be make
       explicit or overriden by using an explicit start rule.  The LHS of this  rule  is  the  ":start"  pseudo-
       symbol.   Only  one  RHS alternative is allowed.  This RHS alternative must contain only one symbol name,
       and that symbol will be the start symbol of the G1 grammar.  No adverbs should be associated with the RHS
       alternative.  Start rules must be G1 rules.

   Empty rules
       An empty rule is a rule with an empty RHS.  The empty RHS, technically, is a RHS  alternative,  one  with
       zero  RHS  primaries.  The "action" and "bless" adverbs are allowed for the empty RHS alternative, but no
       others.  A empty rule makes its LHS symbol a nullable symbol.

   Quantified rules
           Script ::= Expression+ separator => comma

       A quantified rule has only one RHS alternative, which is followed by a quantifier.  The  RHS  alternative
       must  consist of a single RHS primary.  This RHS primary must be a symbol name or a character class.  The
       quantifer is either a star (""*""), or a plus sign (""+"") indicating, respectively,  that  the  sequence
       rule has a minimum length of 0 or 1.

       Adverbs  may  be  associated  with the RHS alternative.  The adverb list must follow the quantifier.  The
       adverbs allowed are "action", "bless", "proper" and "separator".

   Prioritized rules
           Expression ::=
               Number bless => primary
               | '(' Expression ')' bless => paren assoc => group
              || Expression '**' Expression bless => exponentiate assoc => right
              || Expression '*' Expression bless => multiply
               | Expression '/' Expression bless => divide
              || Expression '+' Expression bless => add
               | Expression '-' Expression bless => subtract

       A prioritized rule contains a series of one or more RHS alternatives, separated by either the alternation
       operator (""|"") or the loosen operators (""||"").  In a typical  grammar,  most  rules  are  prioritized
       rules,  but  they  are often trivially prioritized, consisting of only one RHS alternative.  For brevity,
       RHS alternatives are often called alternatives.

       Each alternative may be followed by a list of associated adverbs.   The  "action",  "assoc"  and  "bless"
       adverbs are allowed.

       The  RHS  alternatives  in  a  prioritized  right  hand  side proceed from tightest (highest) priority to
       loosest.  The double "or" symbol (""||"") is the "loosen" operator -- the alternatives after  it  have  a
       looser  (lower) priority than the alternatives before it.  The single "or" symbol (""|"") is the ordinary
       "alternative" operator -- alternatives on each side of it  have  the  same  priority.   Associativity  is
       specified using adverbs, as described below.

   Discard pseudo-rules
           :discard ~ whitespace

       A  discard  pseudo-rule  is  a rule whose LHS is the ":discard" pseudo-symbol, and which has only one RHS
       alternative.  The RHS alternative must contain exactly one symbol  name,  called  the  discarded  symbol.
       Discard  pseudo-rules indicate that the discarded symbol is a top-level L0 symbol, but one which is not a
       lexeme.  When a discarded symbol is recognized, it is not passed as a lexeme to the G1 parser, but is (as
       the name suggests) discarded.  Discard pseudo-rules must be L0 rules.  No adverbs are allowed.

   Default pseudo-rules
           :default ::= action => [values] bless => ::lhs

           :default ::= action => [lhs, values ]

       The purpose of the default pseudo-rule is to change the defaults for rule adverbs.  Technically,  it  has
       one RHS alternative, but this must always contain zero RHS primaries.  Default pseudo-rules do not affect
       the  defaults for L0 rules or for lexemes.  There may be more than one default pseudo-rule.  The scope of
       default pseudo-rules is lexical, applying only to rules that appear afterwards in the DSL source.

       Currently only the "action" and "bless" adverbs can be specified in a default pseudo-rule.  Each  default
       pseudo-rule  creates  a  completely  new set of defaults -- if an adverb is not specified, the default is
       reset to its implicit value, the value which it had prior to any explicit settings.

   Lexeme pseudo-rules
           :lexeme ~ <say keyword> priority => 1

       The purpose of the ":lexeme" pseudo-rule is to allow adverbs to change the treatment of a  lexeme.   This
       pseudo-rule  always  has  exactly  one RHS alternative, and that RHS alternative must contain exactly one
       symbol.  This RHS symbol identifies the lexeme which the adverbs will affect.  The only  adverbs  allowed
       in a ":lexeme" rule are "event", "pause", and "priority".

       As  a side effect, a ":lexeme" pseudo-rule declares that its RHS symbol is expected to be a lexeme.  This
       declaration does not "force" lexeme status -- if the symbol does not meet the criteria for a lexeme based
       on its use in L0 and G1 rules, the result will be a fatal error.  Applications may find this  ability  to
       "declare" lexemes useful for debugging, and for documenting grammars.

   Lexeme default statement
           lexeme default = action => [ start, length, value ]
               bless => ::name latm =>

           lexeme default = action => [ lhs, value ]

       The  lexeme  default statement changes the defaults for lexeme adverbs.  It only changes the defaults for
       lexemes, and does not affect rules.  Only the defaults for the "action", "bless", and "latm" adverbs  can
       be specified in a lexeme default statement.  Only one lexeme default statement is allowed in a grammar.

   Named event statement
           event subtext = completed <subtext>

           event 'A[]' = nulled <A>

           event '^a' = predicted A

       The  named event statement sets up a symbol so that a named event is triggered when some condition occurs
       at a location.  Named events can be defined to occur when  a  symbol  is  predicted,  when  a  symbol  is
       completed, or when a symbol is nulled.

       A  "completed" event occurs whenever a rule with that symbol on its LHS is fully recognized in the parse.
       (The idea is that "symbol completion" occurs when the rule, and therefore its LHS, is  "complete".)   For
       the  purpose  of "completed" events, a nulled symbol is not considered "complete", and "completed" events
       will not be triggered for a zero-length instance of a symbol.

       A "nulled" event occurs whenever a zero-length symbol instance is recognized.  Null  symbols  may  derive
       other null symbols, and these derivations may be ambiguous.  Ambiguous or not, all such derivations cause
       "nulled"  events.  Again, nulled events and completed events are mutually exclusive -- a nulled, or zero-
       length, symbol is not considered "complete" for this purpose.

       A "predicted" event occurs at any location where a non-zero  length  symbol  would  be  accepted  by  the
       recognizer.   It  can be thought of as occurring when a symbol is "expected".  The expectation may or may
       not come true, depending on future input.  Because there is no physical distinction between  expecting  a
       zero-length  symbol,  and actually seeing one, "predicted" events are not generated for symbols which are
       only expected in zero-length form.

       Completed and nulled events may not be defined for symbols that are lexemes, but lexemes are  allowed  to
       be  predicted  events.  A predicted event which is a lexeme is different from a lexeme pause.  The lexeme
       pause will not occur unless that the lexeme is actually found in the input.  A predicted  event,  on  the
       other  hand,  is  as  the  name suggests, only a prediction.  The predicted symbol may or not actually be
       found in the input.

       The name of an event may be either a bare name, or enclosed in single quotes.  A bare event name must  be
       one  or  more  word  characters,  starting  with an alphabetic character.  A single quoted event name may
       contain any character except a single quote or vertical space.  The whitespace  in  single  quoted  event
       names  is  normalized  in  similar  fashion  to the normalization of symbol names -- leading and trailing
       whitespace is removed, and all sequences of internal whitespace are  changed  to  a  single  ASCII  space
       character.   Names  containing  single  quotes  (which,  in any case, are impossible to add using current
       syntax) are reserved.

       Named  completion  events  can  occur  during   the   the   Scanless   recognizer's   read(),   resume(),
       lexeme_complete(),  and  lexeme_read() methods.  When they occur in the Scanless recognizer's read(), and
       resume() methods, they pause  internal  scanning.   Named  events  may  be  queried  using  the  Scanless
       recognizer's event() method.

   Inaccessible symbol statement
           inaccessible is ok by default

           inaccessible is fatal by default

       Inaccessible  symbols  are  symbols  which  cannot be reached from the start symbol.  Often, they are the
       result of an error in grammar writing.  But inaccessible symbols can also occur for legitimate reasons --
       for example, you may have rules and symbols in grammar intended for future use.

       The default can be specified or changed with a statement of the form:

           inaccessible is TREATMENT by default

       where "TREATMENT" is one of "warn", "ok", or "fatal".

       "fatal" indicates that an inaccessible symbol should be a  fatal  error.   "warn"  indicates  that  Marpa
       should  print a warning message, but proceed with the parse.  "warn" is the default.  "ok" indicates that
       the parse should proceed without warning messages.

Ambiguity

       Marpa parses ambiguous grammars and the design of the SLIF exploits this.  A  flexible,  but  potentially
       ambiguous,  syntax is used.  Actual ambiguities are obvious to the human eye, and users will create them,
       so that the techniques of this section will rarely be needed.

       If and when an actual ambiguity does occur,  an  error  message  reports  the  ambiguity  and  its  exact
       location.   It will always be possible to disambiguate a SLIF DSL, and there will always be more than one
       way to do this.

   Separating statements with semicolons
               :default ::= action => ::array
               quartet  ::= a a a a;
               inaccessible is warn by default
               a ~ 'a'

       A statement may be terminated with a semicolon ("";"").

   Grouping statements in curly braces
             {
                 :default ::= action => ::array
                 quartet  ::= a a a a
             }
             inaccessible is warn by default
             a ~ 'a'

       Statements can be grouped, using curly braces.  These do not create scopes  --  the  curly  braces  serve
       merely to group and to separate groups of statements.

   Other ways to disambiguate
       There  are  many  other  ways  to disambiguate SLIF statements.  If the ambiguity is between keywords and
       symbol names, enclosing a symbol name in angle brackets will force it to be  treated  only  as  a  symbol
       name.  And while it is never necessary, statements can be re-ordered.

Adverbs

       Adverbs  consist of a keyword, the adverb operator (""=>""), and the adverb's value.  The keyword must be
       one of those described in this section.  The adverb's value must be as described for each keyword.

   action
       The "action" adverb is allowed for

       •   An RHS alternative, in which the action is for the alternative.

       •   The default pseudo-rule, in which case the action is for all rules which do not have their own action
           explicitly specified.

       •   The lexeme default statement, in which case the action is for all lexemes.

       The "action" adverb is not allowed for L0 rules.  The possible values of  actions  are  described,  along
       with other details of the semantics, in a separate document.

   assoc
       The  "assoc"  adverb  is  only  valid in a prioritized rule.  Its value must be one of "left", "right" or
       "group".  Its effect will be as described below.

   bless
       The "bless" adverb causes the result of the semantics to be blessed into the class indicated by the value
       of the adverb.  Details of its use may be found in the semantics document.

   event
           :lexeme ~ <a> pause => before event => 'before a'
           :lexeme ~ <b> pause => after event => 'after b'
           :lexeme ~ <c> pause => before event => 'before c'
           :lexeme ~ <d> pause => after event => 'after d'

       The "event" adverb applies only to lexemes and is only allowed in a ":lexeme" pseudo-rule.   It  turns  a
       lexeme's pause into a named event, using the name specified as its value.  Applications are encouraged to
       turn  all  lexeme  pause's  into  named events, using the "event" adverb.  The allowed event names are as
       described for the named event statement.

       It is a fatal error to specify the "event" adverb if the "pause" adverb is not also specified.

   forgiving
           :lexeme ~ <name> forgiving => 1

       The forgiving adverb is a synonym for the "latm" adverb.

   latm
           :lexeme ~ value latm => 1

       The "latm" adverb applies only to lexemes and is only allowed in a ":lexeme" pseudo-rule  and  a  "lexeme
       default" statement.  Its value is a boolean.  If the boolean is set it indicates that a token is LATM.  A
       value  of 1 is recommended, which indicates that a token is LATM.  The default value is 0, for reasons of
       backward compatibility.

       LATM means "longest acceptable tokens match".  In this, the lexer find those tokens that are the  longest
       that would be accepted by the G1 grammar.  There may be more than one such "longest" acceptable token, in
       which case, the lexing will be ambiguous, and the parse will use all of the matching tokens.

       The alternative to LATM, and the default, is the "longest tokens match" (LTM) discipline.  LTM is similar
       to  LATM, except that it takes no account of whether a token would be acceptable to the G1 grammar.  This
       makes it possible that LTM will find one or more lexemes that are a longest match, and none of them  will
       be acceptable to G1.  When that happens, the parse fails with an error message.  This failure occurs even
       if  shorter  lexemes would have been found using LATM, lexemes which would have been acceptable to the G1
       grammar.  This means that matching succeeds more often under LATM than under LTM.

       Intuitively, LATM is a longest tokens match that considers context, while LTM is a longest  tokens  match
       that  ignores  context.  LATM is usually preferable.  Usually if LATM is chosen, a parse will want to use
       the a "lexeme default" statement and use LATM globally.  It is possible to use LATM adverb on a lexeme by
       lexeme basis.  When that is done, the lexemes marked LATM  will  match  only  if  acceptable  to  the  G1
       grammar, and the lexemes not marked LATM will match regardless of their acceptability to the G1 grammar.

       Whichever token discipline is chosen, all tokens matched will be of the same length.  Shorter tokens will
       not be considered.

       LTM is the default for historical reasons.  LTM was the SLIF's original token matching discipline because
       it  more  closely  models  traditional  lexing.   Also for historical reasons, LATM lexemes are sometimes
       called "forgiving" -- in the original implementation, an LTM search was always done for all lexemes,  and
       LATM  was  implemented  by "forgiving" rejection by the G1 grammar, and backing up over the input to find
       acceptable lexemes.  Marpa now does LATM far more efficiently -- the G1 grammar indicates to  the  lexer,
       in advance, which lexemes are acceptable, and the lexer searches only for those.

   name
           start ::= number1 number2 name => top
           number1 ::= <forty two> name => 'number 1'
           number2 ::= <forty three> name => 'number 2'

       The  "name"  adverb  applies  only to rules and rule alternatives.  When specified, it defines a name for
       that rule alternative.

   null-ranking
           S ::= A A A A null-ranking => high

       The "null-ranking" adverb applies only to G1 rules (L0 rules do not have  a  semantics)  and  is  ignored
       unless  the SLIF recognizer's "ranking_method" named argument is set to something other than its default.
       Some rule alternatives can match the same input in several ways, depending on which symbols  are  nulled.
       These different ways of nulling symbols in a rule are called its null variants.  The "null-ranking" named
       argument allows the application to control the order in which null variants are returned by the "value()"
       method.

       If  "null-ranking"  is undefined, the order of the null variants will be arbitrary.  This is the default,
       and is acceptable to most applications.  For details on using the "null-ranking" adverb, see the document
       on parse order.

   pause
           :lexeme ~ <a> pause => before event => 'before a'
           :lexeme ~ <b> pause => after event => 'after b'
           :lexeme ~ <c> pause => before event => 'before c'
           :lexeme ~ <d> pause => after event => 'after d'

       The "pause" adverb applies only to lexemes and is only allowed in a ":lexeme" pseudo-rule.   Pauses  take
       effect  during the Scanless recognizer's read() and resume() methods.  They cause internal scanning to be
       suspended, or "paused", before or after the specified lexeme.  Internal scanning can be resumed with  the
       Scanless recognizer's resume() method.

       Applications  are  encouraged to name every lexeme pause using the event adverb.  If this is done, lexeme
       pauses can be queried using the SLIF recognizer's events() method.  Unnamed lexeme pauses must be queried
       using the SLIF recognizer's pause_lexeme() method.

       If the value of pause is "before", Marpa will "pause" internal scanning before that lexeme.   No  lexemes
       will be read at that position.

       If  the  value  of  pause  is  "after",  all  applicable lexemes at that position will be read by G1, and
       internal scanning will pause immediately afterwards.

       A lexeme pause event does not occur, and has no effect, if

       •   It is deactivated.  Deactivation and reactivation of  events  is  done  with  the  SLIF  recognizer's
           activate() method

       •   The G1 grammar would reject that lexeme at that location.

       •   It has a lexeme priority lower than the highest lexeme priority.

       •   At  the  same priority, it has a pause value of "after", when another lexeme pause occurs which has a
           pause value of "before".  In other words, pausing before a lexeme prevents Marpa from  pausing  after
           another lexeme at the same location.

       Even  with  the  above  restrictions,  there  can be more than one lexeme pause event at a location.  The
       pause_lexeme() method will return only one of them, chosen arbitrarily, whereas the events() method  will
       return  all of the named events.  This is one of the reasons that applications are strongly encouraged to
       specify a name for every lexeme pause event using the "event" adverb.

   priority
       The "priority" adverb is only allowed in a ":lexeme" pseudo-rule.  It sets the lexeme  priority  for  the
       lexeme.  The priority must be an integer, but it may be negative.  An increase in numerical value means a
       higher  priority.   For  example,  a  priority of 1 is greater than a priority of 0.  A priority of 0, in
       turn, is greater than a priority of -1.  The default priority is zero.

       Where more than one lexeme can be accepted at a location, the lexeme priority  limits  the  lexemes  that
       will  be considered.  Only lexemes with the highest priority are considered.  If several lexemes have the
       same priority, all of them will be accepted.

       The only effect of the lexeme priority is on the choice of lexemes when

       •   all of them would be accepted;

       •   all started at the same string location;

       •   all end at the same string location; and therefore

       •   all have the same length.

       Lexeme priorities only have an effect when lexemes are accepted.  The intent of this scheme is  to  avoid
       situations  where  a  lexeme  with  a  high priority is rejected, and causes a parse to fail, even though
       another lower priority lexeme is acceptable and would allow the parse to continue.

       For example, suppose that ""say""  can  be  both  a  keyword  ("<say  keyword>"),  and  a  variable  name
       ("<variable>").  Suppose further that the grammar specifies that "<say keyword>" has a priority of 1, and
       "<variable>" is left at the default priority of 0.  When L0 finds a occurrence of ""say"", where both the
       "say"  keyword  and  a  variable name would be accepted by G1, then only the "say" keyword is read by G1,
       because of the priorities.

       But, suppose instead that the parse is at a location where G1  is  not  accepting  the  "<say  keyword>".
       Since  only  lexeme  priorites  of acceptable lexemes are considered, "<variable>" lexeme has the highest
       priority, and the literal string ""say"" will be read as a "<variable>" token.

   proper
       The "proper" keyword is only valid for a quantified right side, and its value must be a boolean,  in  the
       form  of  a  binary  digit  (0  or  1).  It is only relevant is a separator is defined and is 1 if proper
       separation is required, and 0 if Perl separation is allowed.  "Perl separation" allows a final separator.
       "Proper separation" is so called, because it requires that separators be "proper" in the sense that  they
       must actually separate sequence items.

   rank
           unspecial ::= ('I' 'am' 'special') words ('--' 'NOT!' ';') rank => 1
           special ::= words (';') rank => -1

       "rank"  is ignored unless the recognizer's "ranking_method" named argument is set to something other than
       its default.  The range allowed for "rank" is implementation-defined, but numbers in  the  range  between
       -134,217,727  and  134,217,727 will always be allowed.  "rank" is 0 by default.  For details on using the
       "rank" named argument, see the document on parse order.

   separator
       The "separator" keyword is only valid for a quantified right side, and its value must be a single  symbol
       -- either a single symbol name, or a character class.  If specified, the separator must separate items of
       the sequence.  A separator may not be nullable.

Precedence

       Marpa's  precedence  is  a  generalization  beyond  the  traditional  ideas  of  precedence.  Traditional
       precedence parsing required the classification of operators as postfix, infix, etc.   Marpa's  precedence
       parsing is NOT based on the special treatment of operators.

       For  the  purpose  of precedence, an operand is an occurrence in a RHS alternative of the LHS symbol.  An
       operator is considered to be anything that is not an operand.  The arity of an alternative is the  number
       of  operands  that  it  contains.   All arities are allowed, from zero to the arbitrary number imposed by
       system limits such as memory and file size.

       For example, in the synopsis, the LHS symbol is "Expression".  The alternative

               (<op lparen>) Expression (<op rparen>)

       contains one occurrence of "Expression" and therefore has an arity of one.  The "<op  lparen>"  and  "<op
       rparen>" are considered operators.

       In the RHS alternative

              Expression (<op pow>) Expression

       "Expression" occurs twice, and therefore the arity is 2.  "<op pow>" is considered to be an operator.

       Because  for  this  purpose  an operator is defined as anything that is not an operand, Marpa treats some
       symbols as operators that would not be considered operators in the traditional approach.  For example, in
       the RHS alternative

              Number

       there are no occurrences of "Expression", so that the alternative has an arity of zero -- it is  nullary.
       The symbol "Number" is considered to be an operator.

       An  alternative  with  arity 0 is nullary.  Precedence and associativity are meaningless in this case and
       will be ignored.

       An alternative with arity 1 is unary.  Precedence will have effect, but left and right associativity will
       not.

       An alternative with arity 2 is binary.  Precedence will have effect, and  left  and  right  associativity
       will  behave  in  the  traditional  way.   The traditional behavior for binary alternatives is exactly as
       described next for the N-ary case.

       An alternative with an arity of N, where N is 2 or greater, is N-ary.  Precedence will have effect.   For
       left  associativity,  only  the leftmost operand of an N-ary alternative associates -- operands after the
       first will have the next-tightest priority level.  For right associativity, only the rightmost operand of
       an N-ary alternative associates -- all operands except the last  will  have  the  next-tightest  priority
       level.

       Marpa also allows "group" associativity.  In "group" associativity, all operands associate at the loosest
       (lowest)  priority.   That  is,  in  an  alternative with group associativity, each operand may be a full
       expression of the kind defined by the prioritized rule.  "Group" associativity is used, for  example,  in
       implementing  the  traditional  function of parentheses in Marpa.  Group associativity is meaningless for
       nullary alternatives, and is ignored.

   Precedence and ambiguous grammars
       Marpa's generalization of precedence works for all grammars that can be defined by prioritized rules.  It
       is efficient (linear) for all grammars that  could  be  parsed  by  the  traditional  precedence  parsing
       methods.  Marpa also allows you to define alternatives not allowed by traditional methods.  Many of these
       are useful, and most of the useful ones can be parsed efficiently.

       Because  of the many forms of recursion allowed, it is possible to define highly ambiguous grammars using
       the precedence mechanism.  This can occur even by accident.

       The user should especially be careful with right hand side alternatives in  which  all  the  symbols  are
       operands.   These  can  be  useful.   For  example,  an  implicit operation can be defined using a binary
       alternative with no non-operands, and this could  implement,  for  example,  the  standard  notation  for
       concatenation  or  multiplication.   But  to  do  this efficiently requires either avoiding ambiguity, or
       controlling its use carefully.

       Marpa does catch the case where an alternative consists only of a single operand -- a "unit rule".   This
       causes  a  fatal  error.   Unit rules are easy to define by accident in the SLIF.  The author knows of no
       practical use for them, and their presence in a grammar is usually  unintentional.   Note  that,  in  the
       event  an  application does find a use for a grammar with unit rules, the NAIF and the Thin interface can
       parse it.

Copyright and License

         Copyright 2014 Jeffrey Kegler
         This file is part of Marpa::R2.  Marpa::R2 is free software: you can
         redistribute it and/or modify it under the terms of the GNU Lesser
         General Public License as published by the Free Software Foundation,
         either version 3 of the License, or (at your option) any later version.

         Marpa::R2 is distributed in the hope that it will be useful,
         but WITHOUT ANY WARRANTY; without even the implied warranty of
         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         Lesser General Public License for more details.

         You should have received a copy of the GNU Lesser
         General Public License along with Marpa::R2.  If not, see
         http://www.gnu.org/licenses/.

perl v5.34.0                                       2022-02-06                      Marpa::R2::Scanless::DSL(3pm)