Splicing in Modified BNF Syntax (ANSI and GNU Common Lisp Document)

Next: Indirection in Modified BNF Syntax, Previous: Modified BNF Syntax, Up: Notational Conventions

#### 1.4.1.3 Splicing in Modified BNF Syntax

The primary extension used is the following:

[[O]]

An expression of this form appears whenever a list of elements is to be spliced into a larger structure and the elements can appear in any order. The symbol O represents a description of the syntax of some number of syntactic elements to be spliced; that description must be of the form

O_1 | ... | O_l

where each O_i can be of the form S or of the form S* or of the form S^1.

The expression [[O]] means that a list of the form

(O_{i_1}... O_{i_j}) 1<= j

is spliced into the enclosing expression, such that if n != m and 1<= n,m<= j, then either O_{i_n}!= O_{i_m} or O_{i_n} = O_{i_m} = Q_k, where for some 1<= k <= n, O_k is of the form Q_k*.

Furthermore, for each O_{i_n} that is of the form Q_k^1, that element is required to appear somewhere in the list to be spliced.

For example, the expression

`(x [[A | B* | C]] y)`

means that at most one `A`, any number of `B`’s, and at most one `C` can occur in any order. It is a description of any of these:

     (x y)
     (x B A C y)
     (x A B B B B B C y)
     (x C B A B B B y)

but not any of these:

     (x B B A A C C y)
     (x C B C y)

In the first case, both `A` and `C` appear too often, and in the second case `C` appears too often.

The notation [[O_1 | O_2 | ...]]^+ adds the additional restriction that at least one item from among the possible choices must be used. For example:

`(x [[A | B* | C]]^+ y)`

means that at most one `A`, any number of `B`’s, and at most one `C` can occur in any order, but that in any case at least one of these options must be selected. It is a description of any of these:

     (x B y)
     (x B A C y)
     (x A B B B B B C y)
     (x C B A B B B y)

but not any of these:

     (x y)
     (x B B A A C C y)
     (x C B C y)

In the first case, no item was used; in the second case, both `A` and `C` appear too often; and in the third case `C` appears too often.

Also, the expression:

`(x [[A^1 | B^1 | C]] y)`

can generate exactly these and no others:

     (x A B C y)
     (x A C B y)
     (x A B y)
     (x B A C y)
     (x B C A y)
     (x B A y)
     (x C A B y)
     (x C B A y)

Next: Indirection in Modified BNF Syntax, Previous: Modified BNF Syntax, Up: Notational Conventions