From dennisy@hpcvra.cv.hp.com Tue Jan 19 12:50 PST 1993
Received: from hpcvra.cv.hp.com by hpcvrs.cv.hp.com with SMTP
	(15.11/15.5+IOS 3.22[SMTP-rly]+CV 1.0leaf) id AA20868; Tue, 19 Jan 93 12:50:22 pst
Return-Path: <dennisy@hpcvra.cv.hp.com>
Received: by hpcvra.cv.hp.com
	(15.11/15.5+IOS 3.22[SMTP-rly]+CV 1.0leaf) id AA18945; Tue, 19 Jan 93 12:50:19 pst
Date: Tue, 19 Jan 93 12:50:19 pst
From: Dennis York <dennisy@hpcvra.cv.hp.com>
Full-Name: Dennis York
Message-Id: <9301192050.AA18945@hpcvra.cv.hp.com>
To: charliep@hpcvra.cv.hp.com, dianab@hpcvra.cv.hp.com
Subject: Request from Detlef
Status: R

Diana/Charlie,

Can you make sense of this for me?  What should we do?
Drop by when you have a chance.

Dennis
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>From detlef@dmhh.hanse.de Tue Jan 19 09:34 PST 1993
Received: from hp-cv.cv.hp.com by hpcvra.cv.hp.com with SMTP
	(15.11/15.5+IOS 3.22[SMTP-rly]+CV 1.0leaf) id AA23548; Tue, 19 Jan 93 09:34:36 pst
Return-Path: <detlef@dmhh.hanse.de>
Received: from mail.Germany.EU.net by hp-cv.cv.hp.com with SMTP
	(16.6/15.5+IOS 3.22+CV 1.0ext) id AA27858; Tue, 19 Jan 93 09:33:29 -0800
Received: from pophh (pophh.Hamburg.Germany.EU.net)
	by mail.Germany.EU.net with SMTP (5.65c/EUnetD-2.2.1.d)
	via EUnet for hpcvra.cv.hp.com
	id eI20563; Tue, 19 Jan 1993 18:30:04 +0100
Received: by pophh.Hamburg.Germany.EU.net from mcshh  Via smtp
	id m0nEMKq-0001YtC; Tue, 19 Jan 93 18:01 MEZ; (Smail3.1.28.1)
Received: by mcshh.Hanse.DE from mwhh  Via uucp
	id m0nEMIy-0000BhC; Tue, 19 Jan 93 18:00 MEZ; (Smail3.1.28.1)
Received: by mwhh.hanse.de (5.65/smail2.5/09/15/87/mwhh)
	id AA02413; Tue, 19 Jan 93 17:29:57 +0100
Received:  by dmhh.hanse.de (UUPC/extended 1.11q);
           Tue, 19 Jan 1993 17:47:13 CET
Date: Tue, 19 Jan 93 17:47:12 CET
>From: Detlef Mueller <detlef@dmhh.hanse.de>
Message-Id: <2b5c3ea1.dmhh@dmhh.hanse.de>
Subject: May I publish a chapter from the RPL kernel ERS ?
To: dennisy@hpcvra.cv.hp.com
X-Mailer: ELM [version 2.3 PL11] for OS/2
Status: R

Dear Sir,

some time ago, a friend of mine sent me a copy of chapter 11 of the 'RPL
Kernel ERS'. I brought the example BNF parser desriped there to work (on
a HP48) and would like to add a subscription of this chapter and the source
of the BNF parser generator (see below) to the next release of RPL48 as an
input example for the <-RPL-> library. Is this possible ?

Best regards,
    Detlef Mueller

Appendix
--------
--v--8<--BNF.DOC---------------------------------------------------------------
The summary of chapter 11 'RPL READER and Parser Tools' from the HP Kernel
ERS; it's a transcription with minor modifications where neccassary:

11.3 Parser Tools and the BNF parser

The parser tools are modelled after the PRISM system MINI utility which is a
parser generator (pg) program. The definition of a parser, for our purposes,
is a function which takes arguments in the form
  ob1 .. obn n toktyptab string offset token
and returns results in the form
  ob1' .. obn' n' toktypetab' string offset' token' flag TRUE
or
  ob1 .. obn n toktyptab string offset token FALSE

The interpretation of these pieces conforms to the intuitive notion of a
parser. ob1 .. obn are objects previously parsed, and n is a binary int
representing the number of objects. Toktypetab is a token-type table (see
below). String is the string being parsed, token is also a string, but
represents the piece of the string currently being considered. Offset is a
binary int offset into (or beyond) the string and points to the 1st char
not accounted for in the token.

The flags returned have the following interpretation. If FALSE is returned,
then parsing was never started. If TRUE TRUE is returned, then parsing was
started and successfully completed. If FALSE TRUE is returned, then parsing
was started, but not completed (usally an error condition).

The pg 'BNF' (see below) produces a parser from its Backus-Naur-Form
description given as a string. The BNF consists of a sequence of clauses
seperated by '/'s. Each clause is a sequence of parsers. The evaluation of a
BNF of the form A B C ... 1st evaluates A, and if A returns FALSE, then B C
... is ignored and FALSE is returned. If A returns FALSE TRUE, then B C ...
is again ignored and FALSE TRUE is returned. If A returns TRUE TRUE then B C
... is evaluated sequentially until either a FALSE or a FALSE TRUE is
returned, or the sequence completes. In the 1st case FALSE TRUE is returned,
in the 2nd case TRUE TRUE is returned.

A BNF of the form A B / C D is evaluated by evaluating A B as above, and if
the result is FALSE, then evaluate C D as above and return whatever is
returned by this evaluation. On the other hand, if the evaluation of A B
returns TRUE TRUE or FALSE TRUE, then C D is not evaluated, and the result
of A B is returned.

As an example, consider the parser for a list of names:
  list:
     leftparen terminator
  terminator:
     rightparen / name terminator / list terminator

>From this description, you can see that (), ( ABC ), ( ABC ( CDE ) ), etc.
are all lists.

The pg is invoked by the word 'BNF' and expect a string in level 1 which
contains the BNF description of a parser. The string starts with the token
"BNF" and is ended by the token "ENDBNF". Between these two, and in addition
to the clause seperator "/", the following are allowed:
  - an name of a variable in the current directory, assumed to be a parser.
  - the token " followed by another token.
  - the token CK" followed by another token.
  - the token // used in the same way as /

The parser corresponding to " creates a parser using the token that follows.
The parser created doesn't start unless the current token corresponds to that
parser to the creator. If a match is made, then the created parser returns
TRUE TRUE and drops the current token and gets the next one.

The parser corresponding to CK" is nearly identical to the above, exept that
it leaves the current token right where it is.

The // is used as a clause seperator with the same meaning as /, except that
it modifies the manner in which the last object in the terminated clause is
evaluated. It's usefull for tail-recursive calls to a parser which allways
completes or fails, that is never returns FALSE. If such a parser is the last
object in a clause, then it can be evaluated with a COLA. The token //
indicates such a situation to the BNF parser.

11.4 Extensible Parsers

  [Some text I didn't understand about !*XTNDPA and LAM !*FAILTOKENS, a
   extensible parser sheme, build-in into the RPL development system...]

... I suggest that a bottom-level RAM- or ROM-WORD which designates a parser
should be named !*<name>PA [I've strip the dammed !*].

To further refine the conventions for parser, we need to pick out two
fundamental kinds of parsers. Although many parsers will not fall strictly
in one category or the other, most, if not all, parsers can be decomposed,
BNF-style, into parsers of these two fundamental kinds. The two kinds of
parsers may be called production parsers and reduction parsers. They are
distinguished by their action on tokens and currently parsed objects.

A production parser ignores already parsed objects and only operates on the
string and token to produce a sequence of objects. In stack notation:

  ob1 .. obn n toktyptab string offset token -->
  ob1 .. obn n ob1' .. obn' n' toktypetab' string offset' token' flag TRUE
or
  ob1 .. obn n toktyptab string offset token FALSE

In particular, a production parser returns a single sequence of objects and
the number of objects, if it successfully completes parsing, and leaves the
objects already on the stack unchanged.

In contrast, a reduction parser doesn't alter the current offset or token and
instead takes the sequence or sequences of objects on the stack and rearranges
and/or combines them into new objects or sequences. Most reduction parsers
will take a fixed number of sequences of objects, with restrictions on the
number of objects in each sequence and return a new sequence. In stack
notation:
  <seq 1> n1 .. <seq n> nn toktypetab string offset token -->
  <seq 1>' n1' .. <seq n>' nn' toktypetab string offset token flag TRUE

A further convention on parser will be that any parser should be, in its net
effect, a production parser. That is to say that even though a parser may be
composed of sub-parsers which may be either production or reduction parser,
the net effect of the parser, when successfully completed, should be that of
a production parser.

11.4.1 An Example

As an example of the use of the BNF pg, the generator is given in terms of
itself (and a few other pieces). In the example, named subparsers which are
production parsers will begin with a capital letter.

  [I used this example to create the *WORKING* (I wonder, if HP have ever
   check the functionality of their examples ;-) BNF pg in the directory
   BNFPG. I also bring the example to work, you can find it in the
   subdirectory BNFXMPL (to run it, 1st run the BNFPG-SETUP and install the
   resulting library).]

The parser BNFPA produces a parser function from a clause or sequence of
clauses seperated by '/'s or '//'s. Its operation is quite simple, but has
several features which recognize special situations to aid the effeciency of
the resulting function [ROTFLL :-].

In the general case, a clause of the form A B .. C / is transformed into
  ID A !*trior :: ID B !*triand .. ID C !*triand TrueTrue ;

and a clause of the form A B .. C // is transformed into
  ID A !*trior :: ID B !*triand .. COLA ID C ;

A sequence of clauses is tramsformed into the concatenation of the forms
shown above and, when the ENDBNF is encoutered, a FALSE is appended to the
form and the entire form is collected into a secondary which is then the
parser function.

  [you will find an explaination for !*trior and !*triand along with some
   other entries below.]

The two special cases arise when there's only one object in a clause.

Normally, a clause of the form A / would produce
  ID A !*trior :: TrueTrue ;

This can be replaced by
  ID A !*trior TrueTrue

The 2nd case arises when the single-object clause is the final clause in the
BNF description. Something of the form
  BNF ... A ENDBNF

would produce
  :: ... A !*trior TrueTrue FALSE ;

Since A is (assumed to be) a parser, when it's evaluated it will return the
tristate-flag on top of the stack. The net result is exactly the same as if
A alone were evaluated. For this reason, BNF will produce
  :: ... COLA A ;

  [As an specific example of the output of the BNF parser, run the BNFPXMPL-
   SETUP, store the resulting directory and then decompile e.g. Bnfob using
   RPL->.]

11.5 Tokens and Token-Type Tables

  [They are telling us what a token is - see the description of the built-in
   GetNextToken below]

11.6 BNF Description of the READER

  [Description of a program in their RPL development system, similar to ->RPL.
   Long and unusefull.]

11.7 Provided Objects

GetNextToken
( hxs $ # --> hxs $ #' $' )
  where hxs is a token-type table, $ is a string and # is an offset (in
  chars) into the string. Returns the ttt, the string, the offset to the
  first char not used in the token, and the token.

  The ttt is a a hxs containing 256 elements, one for each char. The table
  gives an implicit correspondence between ASCII characters and their TYPE,
  which is one of 16 values:
	0  - neutral character
	1  - normal character
	2  - digit
	3  - left delimiter
	4  - right delimiter
	5  - self delimiter
	6  - escape character
	7  - diphthong start

	[Not described in the ERS, but built-in in the HP48 GetNextToken: ]

	8  - ?
	9  - ?
	10 - ?
	11 - ?
	12 - ?
	13 - comment toggle
	14 - comment off
	15 - ?

  GetNextToken scans the string beginning at the offset until it finds the
  1st non-neutral character (or the end of the string). If this char is a
  left-delimiter, a right-delimiter or a self-delimiter, then this char is
  returned as the token and the new offset points just beyond it.

  If the 1st non-neutral char is a dipthong-start, then this char and the
  following char are returned as the token.

  If none of the above have occured, then the type of the token is determined
  from the type of the 1st char, with the exception that a char of type 6
  forces itself and the char following it to be interpreted as type 1. Then
  chars from the string are accumulated into the token until a type change
  occurs, or the offset gos beyond the end of the string. The accumulated
  token (with chars of a uniform type) is returned and the offset returned
  points beyond the last char which was added to the token.

  Note that since one of the arguments for a parser is a token, each parser
  that successsfully completes parsing must provide the token for the next
  parser in line for evaluation. In particular, the ttt for entry into a
  given parser is determined by the previous successfully completed parser.

  [Comments:
   Digits are treated as ordinary chars if they follow an ordinary char.
   Chars between two comment toggles behave as neutral chars.]

!*Tok [PTR BC15]
( hxs $ # $' $'' --> hxs $ # $' FALSE )
( hxs $ # $' $'' --> hxs $''' #' $'''' TRUE TRUE )
  If the string on the top of the stack matches the string just beneath it,
  the top two strings are dropped, GetNextToken is evaluated and TRUE TRUE is
  subsequently returnde. Otherwise, the top string is dropped and FALSE is
  returned.

!*tokck [PTR BC47]
( hxs $ # $' $'' --> hxs $ # $' FALSE )
( hxs $ # $' $'' --> hxs $ # $' TRUE TRUE )
  If the top two strings match, the top string is dropped and TRUE TRUE is
  returned, otherwise the top string is dropped and FALSE is returned.

!*trior
( FALSE --> ? )
( FALSE TRUE --> FALSE TRUE )
( TRUE TRUE --> ? )
  In the 1st case, FALSE and the 1st object in the top body of the runstream
  are dropped, and execution resumes at the (former) second object. In the
  2nd case, the entire top body in the runstream is dropped. In the 3rd case,
  TRUE TRUE and the top body in the runstream are dropped, and the (former)
  1st object in the runstream is evaluated.

!*triand
( FALSE --> FALSE TRUE )
( FALSE TRUE --> FALSE TRUE )
( TRUE TRUE --> ? )
  In the 1st case, TRUE is pushed on the stack; in either the 1st or the 2nd
  case, the top body in the runstream is dropped. In the 3rd case, the flags
  are dropped, and evaluation continues normally.

TrueTrue
( --> TRUE TRUE )

failed
( --> FALSE TRUE )

-----------------------------------------------------------------------------

The BNF parser generator:

In the BNF.DIR directory you'll find the following variables:

  BNFXMPL	- BNF example: the BNF pg in terms of itself
  SETUP		- Run run this to create a BNF pg library (id 800) in stack
		  level 1. The <-RPL-> and <-LIB-> libraries must be
		  installed for it to work.

  All following variables are source strings for ->RPL:

  BED		- 'BNF EDitor', nice name .. ;-)
  BNF		- BNF pg user interface, feed this program with a BNF def.
  BNFPA		- BNF pg; named !*BNFPA in the ERS
  Bnfterm	- term parser
  Bnfcls	- clause parser
  Bnfob		- object parser
  Maketoken	- " pg
  Makeck	- CK" pg
  CompileID	- object pg
  fincls	- normal clause end
  colacls	- COLA clause end
  inscola	- append COLA to meta object
  &ob		- append two meta objects
  &nostart	- append 'failed' to meta object
  bnfsav	- save BNF pg context
  bnfrst	- restore BNF pg context
  TTT		- token-type table

In the BNFXMPL directory you'll find the following variables (source strings,
ready for compiling/BNF pg'ing) :

  SETUP		- Run it to genarate a directory in stack level 1. The
		  <-RPL->, <-LIB-> and BNF libraries must be installed for
		  it to work.
  bnf		- Same as BNF above. Change name to lower case, because of
		  the conflict with the lib-word BNF in the BNF lib.
  BNFPA		- BNF pg in BNF notation
  Bnfterm	- term parser in BNF notation
  Bnfcls	- clause parser in BNF notation
  Bnfob		- object parser in BNF notation
  Maketoken	- " pg
  Makeck	- CK" pg
  CompileID	- object pg
  startbnf	- start BNF pg
  finbnf	- close BNF pg
  startcls	- start clause
  fincls	- normal clause end
  colacls	- COLA clause end
  contcls	- next clause
  inscola	- append COLA to meta object
  &ob		- append two meta objects
  &nostart	- append 'ID failed' to meta object
  bnfsav	- save BNF pg context
  bnfrst	- restore BNF pg context
  failed	- FALSE TRUE
  TTT		- Token-type table
--^--8<--BNF.DOC---------------------------------------------------------------

--v--8<--BNF.UUE---------------------------------------------------------------
section 1 of uuencode 4.13 of file BNF.DIR    by R.E.M.

begin 644 BNF.DIR
M2%!(4#0X+466*O!_I!H````#5%14`RPJ$"(`*%145"D*2%A3(#$P,"`P,#`PQ
M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,3`Q,3$Q,3$Q,3$Q,3$Q,3$QK
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,#$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q<
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,`)@(.9F)C='9\"B`F4`@"+F4
M9B8W1Y>BH*.C`$)S5$3%%-0$,G-41,44U*0`(G-41,44U`02<U1$%23D1*2PS
MHP<`!F)N9G-A=@8L*E`%`"AB;F9S878I"CHZ"B`G($Y53$Q,04T@-"!.1%50(
M3@H@1$]"24Y$"CMJ`(!@XO8V1Q<F1X?`H@+!`8!BXO8V1Q<F1Y>BH*.C`#(#[
M\F15)#7B`S(6-E>F`**CHP`"8A3$-%4$@N+V-D<7)D>7H@`",G45!#42LZ(`R
MLJ,`<@+B5,7$Q!34!$)4!454!:4`,@-"]"24Y$2D`#)S5$3%%-2D`'("$J)"$
M)Y?V)@=2%*4`(G-41,44U*0`<@)")5=71B575P92%*4`$N1$-!8V5Z8`HJ.C.
M``)R`C+TQ!0$,G45!*4``A)S5$05).1$!#(2TZ(`LJ,`,G-41,44U`0B<U1$!
MQ134!&(4Q#15I``2<U1$%23D1`0R$K.BL*,=``,F;V(#+"I0!0`H)F]B*0HZ]
M.@H@1%50(S`]8W-$4D]0"B!$55`C,BL@4D],3"`C*PH[9`!PD.8V-_;&%G;`2
MH@*M`("2YC8W]L86EJ*@HZ,`(@/R9%4D->(#,A8V5Z8`HJ.C``)R`D(E5U=&7
M)5=7!C)U%00U$K.B`+*C`%+E)/5$123U!*4`<@(R],04!#)U%00E]42EL$,,4
M``=C;VQA8VQS!RPJT`X`*&-O;&%C;',I"CHZ"B!)1"!B;F9S878*($154%17V
M3R`C/4E410H@.CH@,D123U`@,0H@.PH@.CH*("!)1"!I;G-C;VQA"B`@1%503
M(S$](#]314U)"B`@.CI.(#$*(#L*($E$("9O8@H@240@8FYF<G-T"CL$`6!@*
MEN8VQC9GP*("L0"`8I;F-L8VEZ*@HZ,`DD0$(N9F-A=FIP!R`D(E5U=&)5=75
M!C)U%00U$K.B`$)4!342TP.21%7T123U!`6BH^.D`!(#DD0$8O(FI@"21`0B4
MYF8F-T>GL&,,``E#;VUP:6QE240)+"JP%0`H0V]M<&EL94E$*0HZ.@H@3E5,X
M3"0@4%12($)#-#<*("$J=')I;W(@9F%I;&5D"B`D/DE$(%!44B`W0D9$("A#0
M3TU024Q%240I"B!.3U1C87-E(&9A:6QE9`H@240@8FYF<V%V"B`Q1T543$%-R
M(%-705`C,2L*($E$(&)N9G)S=`H@1%)/4"!'971.97AT5&]K96X*(%1R=654H
M<G5E("AC;VUP;&5T960I"CMV`6#0%+96-K9FP*("#P&`TA2V5C:VEJ*@HZ,`#
MXE3%Q$0"`D4E!2(T1'.C`!*B0B>7]B8'8A:6QE9&I@"21`0BYF8V%V:G`!)SG
M5$3%%-0$,G45!#42LZ(`<@("124%(C1$<P,R=14$-1*SH@"21`0BYF8F-T>GZ
M`$(D]00%<E1&YU2&1T?UME;FI@!")5=71B575Z:P0Q(`"4UA:V5T;VME;@DLN
M*M`2`"A-86ME=&]K96XI"CHZ"B!.54Q,)"!05%(@0D,T-PH@(2IT<FEO<B!F]
M86EL960*($E$(&)N9G-A=@H@,4=%5$Q!32!35T%0(S$K"B`G(%!44B!"0S$UE
M(%-705`C,2L*($E$(&)N9G)S=`H@1%)/4"!'971.97AT5&]K96X*(%1R=654H
M<G5E("AC;VUP;&5T960I"CM(`5`@Y&;V)E;`H@+U`8`BY&;V)I:BH*.C`$("L
M(E+D1"3D9"0"`D4E!2(T%%.C`!*B0B>7]B8'8A:6QE9&I@!"`B+R(@("124%#
M(C044Z,`$J)")Y?V)@=B%I;&5D:F`$("(O+R(@("124%(C044Z,`$J)")Y?V2
M)@=B%I;&5D:F`$("(B+D9"0"`D4E!2(T%%.C`!*B0B>7]B8'8A:6QE9&I@!"G
M`B+"!3-#(P("124%(C044Z,`$J)")Y?V)@>21`32%+961O>V5N:F`$("(C*TF
MQ`4S0R,"`D4E!2(T%%.C`!*B0B>7]B8'DD0$TA2V5C:VI@`R],04!))$!#+T$
MU@:7QE:61*2P@R``!D)N9F-L<P8L*C`G`"A";F9C;',I"CHZ"B`D(")%3D1"=
M3D8B(%!44B!"0S0W("@A*G1O:V-K*0H@(2IT<FEO<@H@.CH*("!)1"!F:6YC*
M;',*("!#3TQ!($E$($)N9G1E<FT*(#L*("0@(B\B(%!44B!"0S$U"B`A*G1R`
M:6]R"B`Z.@H@($E$(&9I;F-L<PH@($-/3$$@240@0FYF=&5R;0H@.PH@)"`BD
M+R\B(%!44B!"0S$U"B`A*G1R:6]R"B`Z.@H@($E$(&-O;&%C;',*("!#3TQ!E
M($E$($)N9G1E<FT*(#L*($E$($)N9F]B("$J=')I;W(*(#HZ"B`@240@8FYF;
M<V%V"B`@)R`A*G1R:6%N9"!35T%0(S$K"B`@240@8FYF<G-T"B`@0T],02!)S
M1"!";F9C;',*(#L*(&9A:6QE9`H[B`)P(.1F1E<FUW;`H@*Q`8`BY&9&5R;71
MEJ*@HZ,`0@(B4N1$).1D)`("124%(C044Z,`$J)")Y?V)J<`HJ.C``*21`0B=
MYF8V%V:G``*21`1BXO8V1Q<F1P>BH^.D``*21`0BYF8F-T>G``)")5=71B579
M5P:",O;6!L=61E=&EJ(`LJ,`DD0$(N1F]B8&$J)")Y?V)J<`HJ.C``*21`0B&
MYF8V%V:G``)R`A*B0B>7]B8',G45!#42LZ(``@*C``*21`0BYF8F-T>G``(R3
M],04!))$!"+D9C;&-J<`LJ,`8A:6QE9&IK"#'``%0DY&4$$%+"KP#@`H0DY&%
M4$$I"CHZ"B`D(")"3D8B(%!44B!"0S$U("@A*E1O:RD*("$J=')I;W(*(#HZ$
M"B`@240@8FYF<V%V"B`@,`H@($E$(&)N9G)S=`H@($-/3$$@240@0FYF=&5RO
M;0H@.PH@1D%,4T4@*&YO<W1A<G0I"CL"`3`@Y&0TP*("B0*`(N1DE**@HZ,`O
M,K04HP!"5`5%E055-#1%)?6C`.(T%C971I4%550D):4`0@(B,O36!I?&EN9V$
M!B+D9`0"%28W5R;W(:(`0I0V!S?T]B9'%J,`DD0$0D5%!3)U%03UY%2D`')47
M1N=4AD='];96YJ8`DD0$(N1D!!6D`))$5:0`HJ.C``(R%C97I@`"HJ,#0D,D8
M]00%(D4D]02E``*RHP`"0@(B(N1D!%(D)_<F!Q)&!P+U-J<#(J(``B+U1`4R<
MXD,"8D*B``)"`B+"!1,#<X461G<R!Y)&]P,BH@`"8D(R=14$!4+TY#-%)05B-
M0J(`LJ,``D("(B+D9`12)"?W)J?#!1,#<X461@="AU8&@E3&QL8%,Q,#\B.BR
M``)%)05"4S1S`X)2A)5$U31U-$7UE*(`,@)R`P,#`P-2)"7U)/541:6P@RD`U
M`T)%1`,L*G`E`"A"140I"CHZ"B!#2S`*($1%4%1((",P/#X*($Y53$PD($9![
M3%-%(%)/5`H@250*(#HZ"B`@,U!)0TL*("!465!%0U-44C\@3D]4/U-%34D*?
M("`R1%)/4"!$55`@5%)510H@.PH@,4Q!34))3D0*("0@(D5D:70@>6]U<B!PG
M87)S97(Z(@H@4U=!4$].12!:15)/6D523UI%4D\*('L*("!)1"!"3D9<,#$P&
M"B`@240@7#`S,EPP,S0*("!)1"!<,#,R0TM<,#,T"B`@240@+UPP,3`@240@-
M+R]<,#$P"B`@240@7#`Q,$5.1$).1@H@?0H@,2!44E5%(#`*($EN<'5T3&EN?
M90H@,4=%5$%"3D0*($%.1"!.3U0_4T5-20H@4U=!4$123U`*.V8"4#!51%4%^
M5=#9`AXV0AD:5#:"Y`(!F7DV<K@?!:'A.QHL*M`!`%!R;V-E<W-I;F<Z"LFB^
M0E@:P332Y@(!=AXVTN8"`7:XR3$O*J`QTN8"`7AM+A!@U^8"`7C&UW&X'PO+]
MX2TJA*5QN!]`"R+I`M(4`+W[T<P@AJ,"."/^-<*B`B<`(%27QD:6YG8&PI8FL
M)A<FEZ>0+"J$I4&G`D@N,"#D9(3D`@-"140K,2#I`L4$`<T,PJ(")0`@Y&0$&
M`@*B$^,"DTK4=)(S(^D"Q10!S0PRDP("````````")(N4$P/T,P@DBY03`(@(
MZ0+%!``L*I`!`$-L96%N=7`N+B[)HD)8&ENA064C2"X0D)EG(SH2DF,C*S%@6
M(@`'0DY&6$U03`>6*O!_:Q0````#5%14`RPJ4"$`2%A3(#$P,"`P,#`P,#`P*
M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,3`Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q`
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,#$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q<
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$QL
M,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q)`)@8!:6QE9&9L"B`BT`@&(6EL963
M1I:BH*,#8A:6QE9&IK`C!``&8FYF<G-T!BPJ4`8`*&)N9G)S="D*.CH*(#1'S
M151,04T@,T=%5$Q!30H@,D=%5$Q!32`Q1T5404).1`H[>@!@(.9F-A=F9\"B!
M`E4`@"+F9C879I>BH*.C`'("XE3%Q,04U`1"`^)$5`7EI`!"]"24Y$2DL*,&S
M``@F;F]S=&%R=`@L*O`;`"@F;F]S=&%R="D*.CH*(#,@3U9%4B,^(&-A<V4*:
M(#HZ"B`@1D%,4T4@*&YO<W1A<G0I"B`@4U=!4",Q*PH@.PH@)R!.54Q,3$%-+
M($154$154`H@,R!$3T))3D0*(#-'151,04T@)R`A*G1R:6]R($51"B`R1T54X
M3$%-("<@5')U951R=64*($51($%.1&-A<V4*(#HZ"B`@)R!#3TQ!(%-705`*:
M("`@,4=%5$%"3D0@(S$M"B`["B`S1T543$%-(#)'151,04T@1D%,4T4*(#%'%
M151!0DY$(",Q*PH[V`$P8/(F-L"B`E4`@&+R)I:BH*.C`$)4!34"TS,V1R3U5
M!*4`0E0%-2*S`B+UQ,0$,K*BL$,&``=I;G-C;VQA!RPJD`H`*&EN<V-O;&$I0
M"CHZ"B`R($]615(C/B!C87-E"B`Z.B`G(%1R=654<G5E(%-705`C,2L*(#L*O
M(%5.4D]41%)/4"`G($-/3$$*(%-705!23U0*.\``<##VYD8WQC9WP*("B0"`F
M,O;F1C?&-I>BH*.C`))$!"+F9C879J<`<@(2HD(GEQ;F1@8R=14$-1*SH@"2B
M1`0BYF8F-T>G`$(E5U=&)5=7IK`#"@`'8V]L86-L<P<L*M`+`"AC;VQA8VQSE
M*0HZ.@H@240@8FYF<V%V"B!$55`C,3T@/U-+25`*(#HZ($E$(&EN<V-O;&$@^
M.CI.(#$*(#L*($E$("9O8@H@240@8FYF<G-T"B!4<G5E5')U90H[U`!@8);F4
M-L8V9\"B`L4`@&*6YC;&-I>BH*.C`))$!"+F9C879J<`<@)")5=71B575P8RW
M=14$-1*SH@!"5`4U$M,#DD15]$4D]00%HJ/CI``2`Y)$!&+R)J8`DD0$(N9FX
M)C='IP!")5=71B575Z:PHPT`"'-T87)T8VQS""PJ\`@`*'-T87)T8VQS*0HZ0
M.@H@240@8FYF<V%V"B`G("$J=')I;W(@4U=!4",Q*PH@,`H@240@8FYF<G-T0
M"B!4<G5E5')U90H[J`!@8);F)N9F9L"B`H$`@&*6YB;F9I:BH*.C`))$!"+FA
M9C879J<`DD0$8N+V-D<7)D<'HJ/CI`"21`0BYF8F-T>G`$(E5U=&)5=7IK!CP
M"0`(<W1A<G1B;F8(+"J0!@`H<W1A<G1B;F8I"CHZ"B!)1"!B;F9S878*(#`*A
M($E$(&)N9G)S=`H@5')U951R=64*.X(`D##TU@:7QE:61)3`H@)#`8`R]-8&B
ME\96ED24HJ"CHP#B5,7$1`("124%(C1$<Z,`$J)")Y?V)@=B%I;&5D:F`$+B9
MDT0$`D4E!7(C9$0$@C+TU`25Q%241)2B`.+T1#46-E<&8A:6QE9&I@"21`0BB
MYF8V%V:G`!)S5$3%%-0$,G45!#42LZ(`DD0$(N9F)C='IP!")/4$!7)41N=4#
MAD='];96YJ8`0B575T8E5U>FL.,5``9-86ME8VL&+"KP$``H36%K96-K*0HZN
M.@H@3E5,3"0@4%12($)#-#<*("$J=')I;W(@9F%I;&5D"B!)1"!B;F9S878*O
M(#%'151,04T@4U=!4",Q*PH@)R!05%(@0D,T-R!35T%0(S$K"B!)1"!B;F9R;
M<W0*($123U`@1V5T3F5X=%1O:V5N"B!4<G5E5')U90H[)`&0T!2V5D;WME;FE
MEL"B`E,!@-(4ME9&][96YI:BH*.C`.)4Q<1$`@)%)04B-$1S`X(2HD+WMC:VH
MEJ(`$J)")Y?V)@=B%I;&5D:F`))$!"+F9C879J<`$G-41,44U`0R=14$-1*S4
MH@!R`@)%)04B-!13`X(2HD+UMI:B`#)U%00U$K.B`))$!"+F9B8W1Z<`0B3U)
M!`5R5$;G5(9'1_6V5N:F`$(E5U=&)5=7!H(R]M8&QU9&5T:6HK#C%@`%0FYF0
M;V(%+"K0$`!"3D8*("(@14Y$0DY&"B`@9F%I;&5D("\*("(@+PH@(&9A:6QEK
M9"`O"B`B("\O"B`@9F%I;&5D("\*("(@0DY&"B`@9F%I;&5D("\*("(@(@H@"
M($UA:V5T;VME;B`O+PH@(B!#2R(*("!-86ME8VL@+R\*($-O;7!I;&5)1`I%H
M3D1"3D8@`6`@Y&8VQC9GP*("!P$@Y&2D`#*T)`)2Y$0DY&2D``)BEN8VQC8'H
M(N1F1E<FUP;R\J(`(@+RH@`"8I;F-L8V!R+D9D97)M<&\O*B`"("\O*B``(R8
M]L86-L8V!R+D9D97)M<&\O*B`"+D9O8FI@`",O;F1C?&-@<BY&8VQC8'\O*BU
M`&(6EL961J90Y$0DY&3$$0`'0FYF=&5R;0<L*M`(`$).1@H@(B!%3D1"3D8*"
M("!F:6YB;F8@+PH@0FYF;V(*("!S=&%R=&-L<R!";F9C;',@+R\*(&9A:6QE1
M9"`*14Y$0DY&I`!0(.1D!!54P*("30`@Y&2D`"("(N1DI``",D<7)D<GYF8&8
M(N1F1E<FUZ90Y$0DY&0$!@`#8FYF`RPJ4"8`*&)N9BD*.CH*($-+,4Y/3$%3*
M5%=$"B!$55!465!%0U-44C\*($YC87-E5%E014524@H@6D523U-705`*($E$(
M(%145`H@4U=!4$].10H@1V5T3F5X=%1O:V5N"B!)1"!"3D9000H@251%"B`ZT
M.@H@(&-A<V4*("`Z.B`T1%)/4"!21%)/4`H@(#L*("`D(")"3D8@17)R;W(@[
M870@4&]S.B`B"B`@4D]4(",^)"`F)`H@("0@(EPP,3!7:&%T)W,@:70@/R`BE
M"B`@)B135T%0($1//E-44B`F)`H@.PH@("`D(")"3D8@17)R;W(Z7#`Q,%=HO
M870@=&AE($AE;&Q<,#,Q(#\B"B!05%(@-$4S-R`H15A)5$U31U-43RD*(",@T
M-S`P,#`@15)23U)/550*.W0"4#!51%4%5=#9`AXV0AD:+"K0`0!0<F]C97-S^
M:6YG.@K)HD)8&L$TTN8"`78>-N(M*FTN$&"'FQR@,=+F`@%X;2X08-?F`@%X#
MQM=QN!\+R^$M*H2E<;@?0`LR["*'^Y$L*O.BPH4<+"JP``!"3D9AYZ'O(I(NA
L`#(!4/LBDBX@30%0_2*]^\$D(VTN$&"'FQS)HI+0&I(N4$P&X%\C.3:R$@.R?
``
end
sum -r/size 18656/8719 section (from "begin" to "end")
sum -r/size 11509/6209 entire input file
--^--8<--BNF.UUE---------------------------------------------------------------
-- 
+------------------------------------+--------------------------------------+
|`What a depressingly stupid machine'|             Detlef Mueller           |
| -- Marvin                          |          detlef@dmhh.hanse.de        |
+------------------------------------+--------------------------------------+




