DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦1b53f03b0⟧

    Length: 13377 (0x3441)
    Notes: UNIX file
    Names: »y1.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦f4b8d8c84⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »cmd/yacc/y1.c« 

Hex Dump

0x0000…0020 2f 2a 0a 20 2a 20 4c 41 4c 52 2d 31 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 0a 20 2a   ┆/*  * LALR-1 parser generator  *┆
0x0020…0040 0a 20 2a 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 70 72 65 76 69 6f 75 73 6c 79 20 68 65 72 65   ┆  * the comments previously here┆
0x0040…0060 20 68 61 76 65 20 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64 20 73 69 6e 63 65 20 74 68 65 79   ┆ have been suppressed since they┆
0x0060…0080 20 77 65 72 65 0a 20 2a 20 62 6f 72 69 6e 67 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 79 61   ┆ were  * boring  */ #include "ya┆
0x0080…00a0 63 63 2e 68 22 0a 0a 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76 29 0a 63 68 61 72 20 2a 61 72 67   ┆cc.h"  main(argc,argv) char *arg┆
0x00a0…00c0 76 5b 5d 3b 0a 7b 0a 09 6f 70 74 69 6f 6e 73 28 61 72 67 63 2c 61 72 67 76 29 3b 0a 09 67 65 74   ┆v[]; {  options(argc,argv);  get┆
0x00c0…00e0 66 69 6c 65 73 28 29 3b 0a 09 72 65 61 64 72 75 6c 65 73 28 29 3b 0a 09 6e 74 70 72 6f 64 28 29   ┆files();  readrules();  ntprod()┆
0x00e0…0100 3b 0a 09 6e 74 64 65 72 69 76 65 28 29 3b 0a 09 6c 69 73 74 67 72 61 6d 28 29 3b 0a 09 69 66 28   ┆;  ntderive();  listgram();  if(┆
0x0100…0120 20 6e 65 72 72 6f 72 73 20 29 0a 09 09 63 6c 65 61 6e 75 70 28 31 29 3b 0a 09 6e 74 65 6d 70 74   ┆ nerrors )   cleanup(1);  ntempt┆
0x0120…0140 79 28 29 3b 0a 09 69 66 28 20 6e 65 72 72 6f 72 73 20 29 0a 09 09 63 6c 65 61 6e 75 70 28 31 29   ┆y();  if( nerrors )   cleanup(1)┆
0x0140…0160 3b 0a 09 67 65 6e 73 74 61 74 65 73 28 29 3b 0a 09 67 65 6e 73 6c 69 73 74 28 29 3b 0a 09 73 74   ┆;  genstates();  genslist();  st┆
0x0160…0180 74 72 61 6e 73 28 29 3b 0a 09 67 65 6e 6c 6f 6f 6b 28 29 3b 0a 09 67 6f 32 6f 75 74 28 29 3b 0a   ┆trans();  genlook();  go2out(); ┆
0x0180…01a0 09 70 61 6f 75 74 28 29 3b 0a 09 63 61 6c 6c 6f 70 74 28 29 3b 0a 09 63 6c 65 61 6e 75 70 28 30   ┆ paout();  callopt();  cleanup(0┆
0x01a0…01c0 29 3b 0a 7d 0a 0a 67 65 74 66 69 6c 65 73 28 29 0a 7b 0a 09 69 66 28 20 67 72 61 6d 79 3d 3d 4e   ┆); }  getfiles() {  if( gramy==N┆
0x01c0…01e0 55 4c 4c 20 29 0a 09 09 75 73 61 67 65 28 29 3b 0a 09 69 66 28 20 73 74 72 63 6d 70 28 67 72 61   ┆ULL )   usage();  if( strcmp(gra┆
0x01e0…0200 6d 79 2c 22 2d 22 29 3d 3d 30 20 29 0a 09 09 64 65 66 69 6e 20 3d 20 73 74 64 69 6e 3b 0a 09 65   ┆my,"-")==0 )   defin = stdin;  e┆
0x0200…0220 6c 73 65 0a 09 09 69 66 28 20 28 64 65 66 69 6e 20 3d 20 66 6f 70 65 6e 28 67 72 61 6d 79 2c 22   ┆lse   if( (defin = fopen(gramy,"┆
0x0220…0240 72 22 29 29 20 3d 3d 20 4e 55 4c 4c 20 29 0a 09 09 09 79 79 65 72 72 6f 72 28 21 46 41 54 41 4c   ┆r")) == NULL )    yyerror(!FATAL┆
0x0240…0260 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 20 25 73 22 2c   ┆, "cannot open grammar file %s",┆
0x0260…0280 20 67 72 61 6d 79 29 3b 0a 09 6d 6b 74 65 6d 70 28 61 63 74 74 6d 70 29 3b 0a 09 6d 6b 74 65 6d   ┆ gramy);  mktemp(acttmp);  mktem┆
0x0280…02a0 70 28 6f 70 74 74 6d 70 29 3b 0a 09 69 66 28 20 28 61 63 74 6f 75 74 20 3d 20 66 6f 70 65 6e 28   ┆p(opttmp);  if( (actout = fopen(┆
0x02a0…02c0 61 63 74 74 6d 70 2c 22 77 22 29 29 20 3d 3d 20 4e 55 4c 4c 20 29 0a 09 09 79 79 65 72 72 6f 72   ┆acttmp,"w")) == NULL )   yyerror┆
0x02c0…02e0 28 21 46 41 54 41 4c 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 63 74 69 6f 6e 20 74   ┆(!FATAL, "cannot create action t┆
0x02e0…0300 65 6d 70 20 66 69 6c 65 20 25 73 22 2c 20 61 63 74 74 6d 70 29 3b 0a 09 69 66 28 20 28 74 61 62   ┆emp file %s", acttmp);  if( (tab┆
0x0300…0320 6f 75 74 20 3d 20 66 6f 70 65 6e 28 79 74 61 62 63 2c 22 77 22 29 29 20 3d 3d 20 4e 55 4c 4c 20   ┆out = fopen(ytabc,"w")) == NULL ┆
0x0320…0340 29 0a 09 09 79 79 65 72 72 6f 72 28 21 46 41 54 41 4c 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61   ┆)   yyerror(!FATAL, "cannot crea┆
0x0340…0360 74 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 25 73 22 2c 20 79 74 61 62 63 29 3b 0a 09 69 66 28   ┆te output file %s", ytabc);  if(┆
0x0360…0380 20 28 66 68 64 72 20 3d 20 66 6f 70 65 6e 28 79 74 61 62 68 2c 20 22 77 22 29 29 20 3d 3d 20 4e   ┆ (fhdr = fopen(ytabh, "w")) == N┆
0x0380…03a0 55 4c 4c 20 29 0a 09 09 79 79 65 72 72 6f 72 28 21 46 41 54 41 4c 2c 20 22 63 61 6e 6e 6f 74 20   ┆ULL )   yyerror(!FATAL, "cannot ┆
0x03a0…03c0 63 72 65 61 74 65 20 25 73 22 2c 20 79 74 61 62 68 29 3b 0a 09 69 66 28 20 76 65 72 62 6f 73 65   ┆create %s", ytabh);  if( verbose┆
0x03c0…03e0 20 29 0a 09 09 69 66 28 20 28 6c 69 73 74 6f 75 74 20 3d 20 66 6f 70 65 6e 28 79 6f 75 74 70 75   ┆ )   if( (listout = fopen(youtpu┆
0x03e0…0400 74 2c 22 77 22 29 29 20 3d 3d 20 4e 55 4c 4c 20 29 0a 09 09 09 79 79 65 72 72 6f 72 28 4e 4c 4e   ┆t,"w")) == NULL )    yyerror(NLN┆
0x0400…0420 4f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 6c 69 73 74 69 6e 67 20 66 69 6c 65 20 25 73 22   ┆O, "cannot open listing file %s"┆
0x0420…0440 2c 20 79 6f 75 74 70 75 74 29 3b 0a 09 69 66 20 28 28 6f 70 74 6f 75 74 20 3d 20 66 6f 70 65 6e   ┆, youtput);  if ((optout = fopen┆
0x0440…0460 28 6f 70 74 74 6d 70 2c 20 22 77 22 29 29 20 3d 3d 20 4e 55 4c 4c 0a 09 7c 7c 20 20 28 6f 70 74   ┆(opttmp, "w")) == NULL  ||  (opt┆
0x0460…0480 6f 75 74 20 3d 20 66 72 65 6f 70 65 6e 28 6f 70 74 74 6d 70 2c 20 22 72 2b 77 22 2c 20 6f 70 74   ┆out = freopen(opttmp, "r+w", opt┆
0x0480…04a0 6f 75 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 79 79 65 72 72 6f 72 28 4e 4c 4e 4f 2c 20 22   ┆out)) == NULL)   yyerror(NLNO, "┆
0x04a0…04c0 6f 70 65 6e 20 65 72 72 6f 72 20 74 65 6d 70 20 25 73 22 2c 20 6f 70 74 74 6d 70 29 3b 0a 09 69   ┆open error temp %s", opttmp);  i┆
0x04c0…04e0 66 28 20 6e 65 72 72 6f 72 73 20 29 0a 09 09 63 6c 65 61 6e 75 70 28 32 29 3b 0a 7d 0a 0a 72 65   ┆f( nerrors )   cleanup(2); }  re┆
0x04e0…0500 77 6f 70 74 28 29 0a 7b 0a 09 66 73 65 65 6b 28 6f 70 74 6f 75 74 2c 20 30 4c 2c 20 30 29 3b 0a   ┆wopt() {  fseek(optout, 0L, 0); ┆
0x0500…0520 7d 0a 0a 2f 2a 0a 20 2a 20 66 6f 72 20 65 61 63 68 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 2c 20   ┆}  /*  * for each non-terminal, ┆
0x0520…0540 67 65 6e 65 72 61 74 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 6f 64 75 63 74 69 6f 6e 73 20 77   ┆generate a list of productions w┆
0x0540…0560 68 69 63 68 20 74 68 65 0a 20 2a 20 74 68 65 20 6e 6f 6e 20 74 65 72 6d 69 6e 61 6c 20 64 65 72   ┆hich the  * the non terminal der┆
0x0560…0580 69 76 65 73 0a 20 2a 2f 0a 6e 74 70 72 6f 64 28 29 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 69 3b   ┆ives  */ ntprod() {  register i;┆
0x0580…05a0 0a 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 73 79 6d 20 2a 73 70 3b 0a 0a 09 2f 2a 20   ┆  register struct sym *sp;   /* ┆
0x05a0…05c0 66 69 72 73 74 20 72 75 6e 20 64 6f 77 6e 20 74 68 65 20 70 72 6f 64 75 63 74 69 6f 6e 20 74 61   ┆first run down the production ta┆
0x05c0…05e0 62 6c 65 2c 20 63 6f 75 6e 74 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 20 20 20 20   ┆ble, counting references to     ┆
0x05e0…0600 20 20 20 20 20 20 20 61 6c 6c 20 74 68 65 20 6e 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 2e 20 2a 2f   ┆       all the non terminals. */┆
0x0600…0620 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 0a 09 09 6e 74   ┆  for(i=0; i<nnonterm; i++)   nt┆
0x0620…0640 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 6e 70 72 6f 64 73 20 3d 20 30 3b 0a 09 66 6f 72 28 69 3d 30   ┆rmptr[i]->s_nprods = 0;  for(i=0┆
0x0640…0660 3b 20 69 3c 6e 70 72 6f 64 3b 20 69 2b 2b 29 0a 09 09 6e 74 72 6d 70 74 72 5b 2d 70 72 64 70 74   ┆; i<nprod; i++)   ntrmptr[-prdpt┆
0x0660…0680 72 5b 69 5d 2d 3e 70 5f 6c 65 66 74 2d 4e 54 42 41 53 45 5d 2d 3e 73 5f 6e 70 72 6f 64 73 2b 2b   ┆r[i]->p_left-NTBASE]->s_nprods++┆
0x0680…06a0 3b 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 0a 09 09 69   ┆;  for(i=0; i<nnonterm; i++)   i┆
0x06a0…06c0 66 28 20 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 6e 70 72 6f 64 73 3d 3d 30 20 29 0a 09 09 09   ┆f( ntrmptr[i]->s_nprods==0 )    ┆
0x06c0…06e0 79 79 65 72 72 6f 72 28 4e 4c 4e 4f 7c 21 46 41 54 41 4c 2c 20 22 6e 6f 6e 20 74 65 72 6d 69 6e   ┆yyerror(NLNO|!FATAL, "non termin┆
0x06e0…0700 61 6c 20 25 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 22 2c 0a 09 09 09 09 6e 74 72 6d 70 74 72 5b   ┆al %s not defined",     ntrmptr[┆
0x0700…0720 69 5d 2d 3e 73 5f 6e 61 6d 65 29 3b 0a 09 69 66 28 20 6e 65 72 72 6f 72 73 20 29 0a 09 09 63 6c   ┆i]->s_name);  if( nerrors )   cl┆
0x0720…0740 65 61 6e 75 70 28 31 29 3b 0a 09 2f 2a 20 6e 6f 77 20 61 6c 6c 6f 63 61 74 65 20 6c 69 73 74 20   ┆eanup(1);  /* now allocate list ┆
0x0740…0760 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 61 63 68 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 2a   ┆pointers for each non-terminal *┆
0x0760…0780 2f 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 20 7b 0a 09   ┆/  for(i=0; i<nnonterm; i++) {  ┆
0x0780…07a0 09 73 70 20 3d 20 6e 74 72 6d 70 74 72 5b 69 5d 3b 0a 09 09 73 70 2d 3e 73 5f 70 72 6f 64 73 20   ┆ sp = ntrmptr[i];   sp->s_prods ┆
0x07a0…07c0 3d 20 28 73 74 72 75 63 74 20 70 72 6f 64 20 2a 2a 29 79 61 6c 6c 6f 63 28 73 70 2d 3e 73 5f 6e   ┆= (struct prod **)yalloc(sp->s_n┆
0x07c0…07e0 70 72 6f 64 73 2c 20 73 69 7a 65 6f 66 20 2a 73 70 2d 3e 73 5f 70 72 6f 64 73 29 3b 0a 09 09 73   ┆prods, sizeof *sp->s_prods);   s┆
0x07e0…0800 70 2d 3e 73 5f 6e 70 72 6f 64 73 20 3d 20 30 3b 20 2f 2a 20 69 6c 20 73 65 72 61 20 72 65 63 68   ┆p->s_nprods = 0; /* il sera rech┆
0x0800…0820 61 72 67 65 20 61 20 6c 61 20 73 75 69 74 65 20 2a 2f 0a 09 7d 0a 09 2f 2a 20 66 69 6e 61 6c 6c   ┆arge a la suite */  }  /* finall┆
0x0820…0840 79 2c 20 72 75 6e 20 64 6f 77 6e 20 74 68 65 20 70 72 6f 64 75 63 74 69 6f 6e 20 74 61 62 6c 65   ┆y, run down the production table┆
0x0840…0860 20 61 67 61 69 6e 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 09 20 20 20 6c 69 73 74 20 70   ┆ again filling in the     list p┆
0x0860…0880 6f 69 6e 74 65 72 73 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 6f   ┆ointers for the corresponding no┆
0x0880…08a0 6e 20 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 70 72 6f 64 3b   ┆n terminal */  for(i=0; i<nprod;┆
0x08a0…08c0 20 69 2b 2b 29 20 7b 0a 09 09 73 70 20 3d 20 6e 74 72 6d 70 74 72 5b 20 2d 70 72 64 70 74 72 5b   ┆ i++) {   sp = ntrmptr[ -prdptr[┆
0x08c0…08e0 69 5d 2d 3e 70 5f 6c 65 66 74 2d 4e 54 42 41 53 45 20 5d 3b 0a 09 09 73 70 2d 3e 73 5f 70 72 6f   ┆i]->p_left-NTBASE ];   sp->s_pro┆
0x08e0…0900 64 73 5b 73 70 2d 3e 73 5f 6e 70 72 6f 64 73 2b 2b 5d 20 3d 20 70 72 64 70 74 72 5b 69 5d 3b 0a   ┆ds[sp->s_nprods++] = prdptr[i]; ┆
0x0900…0920 09 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 20 61 73 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e 2d   ┆ } }  /*  * assure that all non-┆
0x0920…0940 74 65 72 6d 69 6e 61 6c 73 20 67 65 6e 65 72 61 74 65 20 61 20 74 6f 6b 65 6e 20 73 74 72 69 6e   ┆terminals generate a token strin┆
0x0940…0960 67 0a 20 2a 20 61 6c 67 6f 72 69 74 68 6d 3a 0a 20 2a 20 20 20 61 73 73 75 6d 65 20 61 20 70 72   ┆g  * algorithm:  *   assume a pr┆
0x0960…0980 69 6f 72 69 20 74 68 61 74 20 6e 6f 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 67 65 6e 65 72 61   ┆iori that no non-terminal genera┆
0x0980…09a0 74 65 73 20 61 20 74 6f 6b 65 6e 20 73 74 72 69 6e 67 0a 20 2a 20 20 20 69 66 20 61 20 6e 6f 6e   ┆tes a token string  *   if a non┆
0x09a0…09c0 20 74 65 72 6d 69 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20   ┆ terminal contains a production ┆
0x09c0…09e0 77 68 69 63 68 20 63 6f 6e 73 69 73 74 73 20 6f 6e 6c 79 0a 20 2a 20 20 20 20 20 20 6f 66 20 6e   ┆which consists only  *      of n┆
0x09e0…0a00 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 74 6f 6b 65 6e 20   ┆on-terminals generating a token ┆
0x0a00…0a20 73 74 72 69 6e 67 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 6c 73 0a 20 2a 20 20 20 74 68 65 6e 20   ┆string, and terminals  *   then ┆
0x0a20…0a40 69 74 20 67 65 6e 65 72 61 74 65 73 20 61 20 74 6f 6b 65 6e 20 73 74 72 69 6e 67 0a 20 2a 20 20   ┆it generates a token string  *  ┆
0x0a40…0a60 20 63 79 63 6c 65 20 6f 6e 20 74 68 69 73 20 75 6e 74 69 6c 20 6e 6f 20 6e 65 77 20 6e 6f 6e 20   ┆ cycle on this until no new non ┆
0x0a60…0a80 74 65 72 6d 69 6e 61 6c 73 20 61 72 65 20 66 6f 75 6e 64 0a 20 2a 20 20 20 20 2d 20 61 20 73 69   ┆terminals are found  *    - a si┆
0x0a80…0aa0 6d 69 6c 61 72 20 70 72 6f 63 65 64 75 72 65 20 61 70 70 6c 69 65 73 20 66 6f 72 20 66 69 6e 64   ┆milar procedure applies for find┆
0x0aa0…0ac0 69 6e 67 20 6f 75 74 20 77 68 69 63 68 20 6e 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 0a 20 2a 20 20   ┆ing out which non terminals  *  ┆
0x0ac0…0ae0 20 20 20 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 2a   ┆    generate the empty string  *┆
0x0ae0…0b00 2f 0a 0a 6e 74 64 65 72 69 76 65 28 29 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 69 2c 20 6a 3b 0a   ┆/  ntderive() {  register i, j; ┆
0x0b00…0b20 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 73 79 6d 20 2a 73 70 3b 0a 09 72 65 67 69 73   ┆ register struct sym *sp;  regis┆
0x0b20…0b40 74 65 72 20 73 74 72 75 63 74 20 70 72 6f 64 20 2a 70 70 3b 0a 09 69 6e 74 20 2a 69 70 3b 0a 09   ┆ter struct prod *pp;  int *ip;  ┆
0x0b40…0b60 69 6e 74 20 63 68 61 6e 67 65 64 3b 0a 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65   ┆int changed;   for(i=0; i<nnonte┆
0x0b60…0b80 72 6d 3b 20 69 2b 2b 29 0a 09 09 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 66 6c 61 67 73 20 26   ┆rm; i++)   ntrmptr[i]->s_flags &┆
0x0b80…0ba0 3d 20 7e 44 45 52 49 56 3b 0a 09 64 6f 20 7b 0a 09 09 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 09   ┆= ~DERIV;  do {   changed = 0;  ┆
0x0ba0…0bc0 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 20 7b 0a 09 09 09   ┆ for(i=0; i<nnonterm; i++) {    ┆
0x0bc0…0be0 73 70 20 3d 20 6e 74 72 6d 70 74 72 5b 69 5d 3b 0a 09 09 09 69 66 28 20 73 70 2d 3e 73 5f 66 6c   ┆sp = ntrmptr[i];    if( sp->s_fl┆
0x0be0…0c00 61 67 73 26 44 45 52 49 56 20 29 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 66 6f 72   ┆ags&DERIV )     continue;    for┆
0x0c00…0c20 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 73 5f 6e 70 72 6f 64 73 3b 20 6a 2b 2b 29 20 7b 0a 09 09 09   ┆(j=0; j<sp->s_nprods; j++) {    ┆
0x0c20…0c40 09 70 70 20 3d 20 73 70 2d 3e 73 5f 70 72 6f 64 73 5b 6a 5d 3b 0a 09 09 09 09 66 6f 72 28 69 70   ┆ pp = sp->s_prods[j];     for(ip┆
0x0c40…0c60 3d 70 70 2d 3e 70 5f 72 69 67 68 74 3b 20 2a 69 70 21 3d 2d 31 3b 20 69 70 2b 2b 29 0a 09 09 09   ┆=pp->p_right; *ip!=-1; ip++)    ┆
0x0c60…0c80 09 09 69 66 28 20 2a 69 70 3e 3d 4e 54 42 41 53 45 20 26 26 0a 09 09 09 09 09 20 20 20 20 28 6e   ┆  if( *ip>=NTBASE &&          (n┆
0x0c80…0ca0 74 72 6d 70 74 72 5b 2a 69 70 2d 4e 54 42 41 53 45 5d 2d 3e 73 5f 66 6c 61 67 73 26 44 45 52 49   ┆trmptr[*ip-NTBASE]->s_flags&DERI┆
0x0ca0…0cc0 56 29 3d 3d 30 20 29 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 69 66 28 20 2a 69 70   ┆V)==0 )       break;     if( *ip┆
0x0cc0…0ce0 20 3d 3d 20 2d 31 20 29 20 7b 0a 09 09 09 09 09 73 70 2d 3e 73 5f 66 6c 61 67 73 20 7c 3d 20 44   ┆ == -1 ) {      sp->s_flags |= D┆
0x0ce0…0d00 45 52 49 56 3b 0a 09 09 09 09 09 63 68 61 6e 67 65 64 2b 2b 3b 0a 09 09 09 09 09 62 72 65 61 6b   ┆ERIV;      changed++;      break┆
0x0d00…0d20 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 77 68 69 6c 65 28 20 63 68 61 6e 67   ┆;     }    }   }  } while( chang┆
0x0d20…0d40 65 64 20 29 3b 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29   ┆ed );  for(i=0; i<nnonterm; i++)┆
0x0d40…0d60 0a 09 09 69 66 28 20 28 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 66 6c 61 67 73 26 44 45 52 49   ┆   if( (ntrmptr[i]->s_flags&DERI┆
0x0d60…0d80 56 29 3d 3d 30 20 29 0a 09 09 09 79 79 65 72 72 6f 72 28 4e 4c 4e 4f 7c 21 46 41 54 41 4c 2c 20   ┆V)==0 )    yyerror(NLNO|!FATAL, ┆
0x0d80…0da0 22 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 25 73 20 64 65 72 69 76 65 73 20 6e 6f 20 74 6f 6b 65 6e   ┆"nonterminal %s derives no token┆
0x0da0…0dc0 20 73 74 72 69 6e 67 22 2c 0a 09 09 09 09 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 6e 61 6d 65   ┆ string",     ntrmptr[i]->s_name┆
0x0dc0…0de0 29 3b 0a 09 69 66 28 20 6e 65 72 72 6f 72 73 20 29 0a 09 09 63 6c 65 61 6e 75 70 28 31 29 3b 0a   ┆);  if( nerrors )   cleanup(1); ┆
0x0de0…0e00 7d 0a 0a 2f 2a 0a 20 2a 20 66 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 6e 6f 6e 2d 74 65 72 6d   ┆}  /*  * find out which non-term┆
0x0e00…0e20 69 6e 61 6c 73 20 64 65 72 69 76 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 2a   ┆inals derive the empty string  *┆
0x0e20…0e40 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 73 69 6d 70 6c 65 0a 20 2a 20 20 69 66 20 74 68 65 20   ┆ algorithm is simple  *  if the ┆
0x0e40…0e60 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 68 61 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 64 65   ┆non-terminal has a production de┆
0x0e60…0e80 72 69 76 69 6e 67 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 2a 20 20 69 74 20 64   ┆riving the empty string  *  it d┆
0x0e80…0ea0 65 72 69 76 65 73 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 74 72 69 76 69 61 6c 6c   ┆erives the empty string triviall┆
0x0ea0…0ec0 79 0a 20 2a 20 20 6f 74 68 65 72 77 69 73 65 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f   ┆y  *  otherwise if it consists o┆
0x0ec0…0ee0 6e 6c 79 20 6f 66 20 70 72 6f 64 75 63 74 69 6f 6e 73 20 77 68 69 63 68 20 63 61 6e 20 64 65 72   ┆nly of productions which can der┆
0x0ee0…0f00 69 76 65 20 74 68 65 0a 20 2a 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 69   ┆ive the  *  empty string, then i┆
0x0f00…0f20 74 20 64 65 72 69 76 65 73 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 61 73 20 77 65   ┆t derives the empty string as we┆
0x0f20…0f40 6c 6c 0a 20 2a 2f 0a 0a 6e 74 65 6d 70 74 79 28 29 0a 7b 0a 09 72 65 67 69 73 74 65 72 20 2a 6b   ┆ll  */  ntempty() {  register *k┆
0x0f40…0f60 70 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 70 72 6f 64 20 2a 2a 70 70 70 3b 0a   ┆p;  register struct prod **ppp; ┆
0x0f60…0f80 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 73 79 6d 20 2a 73 70 3b 0a 09 69 6e 74 20 69   ┆ register struct sym *sp;  int i┆
0x0f80…0fa0 2c 20 63 68 61 6e 67 65 64 3b 0a 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d   ┆, changed;   for(i=0; i<nnonterm┆
0x0fa0…0fc0 3b 20 69 2b 2b 29 20 0a 09 09 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 66 6c 61 67 73 20 26 3d   ┆; i++)    ntrmptr[i]->s_flags &=┆
0x0fc0…0fe0 20 7e 44 45 52 49 56 3b 0a 09 64 6f 20 7b 0a 09 09 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 09 09   ┆ ~DERIV;  do {   changed = 0;   ┆
0x0fe0…1000 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 20 7b 0a 09 09 09 73   ┆for(i=0; i<nnonterm; i++) {    s┆
0x1000…1020 70 20 3d 20 6e 74 72 6d 70 74 72 5b 69 5d 3b 0a 09 09 09 69 66 28 20 73 70 2d 3e 73 5f 66 6c 61   ┆p = ntrmptr[i];    if( sp->s_fla┆
0x1020…1040 67 73 26 44 45 52 49 56 20 29 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 66 6f 72 28   ┆gs&DERIV )     continue;    for(┆
0x1040…1060 70 70 70 3d 73 70 2d 3e 73 5f 70 72 6f 64 73 3b 20 70 70 70 3c 26 73 70 2d 3e 73 5f 70 72 6f 64   ┆ppp=sp->s_prods; ppp<&sp->s_prod┆
0x1060…1080 73 5b 73 70 2d 3e 73 5f 6e 70 72 6f 64 73 5d 3b 20 70 70 70 2b 2b 29 20 7b 0a 09 09 09 09 66 6f   ┆s[sp->s_nprods]; ppp++) {     fo┆
0x1080…10a0 72 28 6b 70 20 3d 20 28 2a 70 70 70 29 2d 3e 70 5f 72 69 67 68 74 3b 20 2a 6b 70 21 3d 2d 31 3b   ┆r(kp = (*ppp)->p_right; *kp!=-1;┆
0x10a0…10c0 20 6b 70 2b 2b 20 29 0a 09 09 09 09 09 69 66 28 20 2a 6b 70 3c 4e 54 42 41 53 45 20 7c 7c 0a 09   ┆ kp++ )      if( *kp<NTBASE ||  ┆
0x10c0…10e0 09 09 09 09 20 20 20 20 28 6e 74 72 6d 70 74 72 5b 2a 6b 70 2d 4e 54 42 41 53 45 5d 2d 3e 73 5f   ┆        (ntrmptr[*kp-NTBASE]->s_┆
0x10e0…1100 66 6c 61 67 73 26 44 45 52 49 56 29 3d 3d 30 20 29 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   ┆flags&DERIV)==0 )       break;  ┆
0x1100…1120 09 09 09 69 66 28 20 2a 6b 70 3d 3d 2d 31 20 29 20 7b 0a 09 09 09 09 09 73 70 2d 3e 73 5f 66 6c   ┆   if( *kp==-1 ) {      sp->s_fl┆
0x1120…1140 61 67 73 20 7c 3d 20 44 45 52 49 56 3b 0a 09 09 09 09 09 63 68 61 6e 67 65 64 2b 2b 3b 0a 09 09   ┆ags |= DERIV;      changed++;   ┆
0x1140…1160 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 77 68 69 6c   ┆   break;     }    }   }  } whil┆
0x1160…1180 65 28 20 63 68 61 6e 67 65 64 20 29 3b 0a 7d 0a 0a 09 2f 2a 20 73 6f 6d 65 20 75 73 65 66 75 6c   ┆e( changed ); }   /* some useful┆
0x1180…11a0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 6e 65 77 67 65   ┆ local variables */ static newge┆
0x11a0…11c0 6e 3b 09 2f 2a 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 67 65 6e 73   ┆n; /* communication between gens┆
0x11c0…11e0 74 61 74 65 73 20 61 6e 64 20 69 6e 73 74 61 6c 6c 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72   ┆tates and install */ static char┆
0x11e0…1200 20 2a 6e 74 70 3b 09 2f 2a 20 62 75 66 66 65 72 20 66 6f 72 20 75 73 65 20 62 79 20 63 68 6b 6c   ┆ *ntp; /* buffer for use by chkl┆
0x1200…1220 68 73 20 2a 2f 0a 0a 67 65 6e 73 74 61 74 65 73 28 29 0a 7b 0a 09 65 78 74 65 72 6e 20 73 74 72   ┆hs */  genstates() {  extern str┆
0x1220…1240 75 63 74 20 73 69 74 65 6d 20 20 2a 6e 69 74 69 74 65 6d 3b 0a 09 72 65 67 69 73 74 65 72 20 6b   ┆uct sitem  *nititem;  register k┆
0x1240…1260 2c 20 73 6e 6f 3b 0a 09 69 6e 74 20 69 3b 0a 09 73 74 72 75 63 74 20 74 67 6f 20 74 67 6f 3b 0a   ┆, sno;  int i;  struct tgo tgo; ┆
0x1260…1280 09 73 74 72 75 63 74 20 6e 74 67 6f 20 6e 74 67 6f 3b 0a 0a 09 2f 2a 20 69 6e 69 74 69 61 6c 69   ┆ struct ntgo ntgo;   /* initiali┆
0x1280…12a0 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 74 61 74 65 73 20 61 73 73 6f 63 69 61 74 65 64   ┆ze the list of states associated┆
0x12a0…12c0 20 77 69 74 68 20 65 61 63 68 20 6e 74 20 74 6f 20 65 6d 70 74 79 20 2a 2f 0a 09 69 66 28 20 76   ┆ with each nt to empty */  if( v┆
0x12c0…12e0 65 72 62 6f 73 65 20 29 0a 09 09 66 70 72 69 6e 74 66 28 6c 69 73 74 6f 75 74 2c 20 22 5c 6e 41   ┆erbose )   fprintf(listout, "\nA┆
0x12e0…1300 75 74 6f 6d 61 74 6f 6e 20 73 74 61 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 5c 6e 5c 6e 22   ┆utomaton state description:\n\n"┆
0x1300…1320 29 3b 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 69 2b 2b 29 20 0a 09   ┆);  for(i=0; i<nnonterm; i++)   ┆
0x1320…1340 09 6e 74 72 6d 70 74 72 5b 69 5d 2d 3e 73 5f 6e 73 74 61 74 65 73 20 3d 20 30 3b 0a 09 6e 74 70   ┆ ntrmptr[i]->s_nstates = 0;  ntp┆
0x1340…1360 20 3d 20 79 61 6c 6c 6f 63 28 6e 6e 6f 6e 74 65 72 6d 2c 20 73 69 7a 65 6f 66 20 2a 6e 74 70 29   ┆ = yalloc(nnonterm, sizeof *ntp)┆
0x1360…1380 3b 20 2f 2a 20 61 72 72 61 79 20 75 73 65 64 20 62 79 20 22 69 6e 73 74 61 6c 6c 22 20 2a 2f 0a   ┆; /* array used by "install" */ ┆
0x1380…13a0 09 6e 69 74 69 74 65 6d 2d 3e 69 5f 6e 69 74 65 6d 73 20 3d 20 31 3b 0a 09 6e 69 74 69 74 65 6d   ┆ nititem->i_nitems = 1;  nititem┆
0x13a0…13c0 2d 3e 69 5f 69 74 65 6d 73 5b 30 5d 20 3d 20 70 72 64 70 74 72 5b 30 5d 2d 3e 70 5f 72 69 67 68   ┆->i_items[0] = prdptr[0]->p_righ┆
0x13c0…13e0 74 3b 0a 09 63 6c 6f 73 75 72 65 28 29 3b 0a 09 69 6e 73 74 61 6c 6c 28 29 3b 0a 09 69 20 3d 20   ┆t;  closure();  install();  i = ┆
0x13e0…1400 30 3b 0a 09 64 6f 20 7b 0a 09 09 6e 65 77 67 65 6e 20 3d 20 30 3b 20 2f 2a 20 6e 65 77 67 65 6e   ┆0;  do {   newgen = 0; /* newgen┆
0x1400…1420 20 69 73 20 66 6c 61 67 67 65 64 20 62 79 20 74 68 65 20 69 6e 73 74 61 6c 6c 20 72 6f 75 74 69   ┆ is flagged by the install routi┆
0x1420…1440 6e 65 20 2a 2f 0a 09 09 66 6f 72 28 3b 20 69 3c 6e 73 74 61 74 65 73 3b 20 69 2b 2b 29 20 7b 0a   ┆ne */   for(; i<nstates; i++) { ┆
0x1440…1460 09 09 09 66 77 72 69 74 65 28 26 69 2c 20 73 69 7a 65 6f 66 20 69 2c 20 31 2c 20 6f 70 74 6f 75   ┆   fwrite(&i, sizeof i, 1, optou┆
0x1460…1480 74 29 3b 20 2f 2a 20 73 79 6e 63 20 6e 75 6d 62 65 72 20 2a 2f 0a 09 09 09 73 74 61 74 65 73 5b   ┆t); /* sync number */    states[┆
0x1480…14a0 69 5d 2e 73 5f 74 67 6f 20 3d 20 30 3b 0a 09 09 09 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 74 65 72   ┆i].s_tgo = 0;    for(k=0; k<nter┆
0x14a0…14c0 6d 3b 20 6b 2b 2b 29 0a 09 09 09 09 69 66 28 20 28 73 6e 6f 20 3d 20 67 6f 32 28 69 74 65 6d 73   ┆m; k++)     if( (sno = go2(items┆
0x14c0…14e0 5b 69 5d 2c 20 6b 29 29 20 3e 3d 20 30 20 29 20 7b 0a 09 09 09 09 09 73 74 61 74 65 73 5b 69 5d   ┆[i], k)) >= 0 ) {      states[i]┆
0x14e0…1500 2e 73 5f 74 67 6f 2b 2b 3b 0a 09 09 09 09 09 74 67 6f 2e 74 67 5f 73 74 20 3d 20 73 6e 6f 3b 0a   ┆.s_tgo++;      tgo.tg_st = sno; ┆
0x1500…1520 09 09 09 09 09 74 67 6f 2e 74 67 5f 74 72 6d 20 3d 20 6b 3b 0a 09 09 09 09 09 66 77 72 69 74 65   ┆     tgo.tg_trm = k;      fwrite┆
0x1520…1540 28 26 74 67 6f 2c 20 73 69 7a 65 6f 66 20 74 67 6f 2c 20 31 2c 20 6f 70 74 6f 75 74 29 3b 0a 09   ┆(&tgo, sizeof tgo, 1, optout);  ┆
0x1540…1560 09 09 09 7d 0a 09 09 09 73 74 61 74 65 73 5b 69 5d 2e 73 5f 6e 74 67 6f 20 3d 20 30 3b 0a 09 09   ┆   }    states[i].s_ntgo = 0;   ┆
0x1560…1580 09 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 6e 6f 6e 74 65 72 6d 3b 20 6b 2b 2b 29 0a 09 09 09 09 69   ┆ for(k=0; k<nnonterm; k++)     i┆
0x1580…15a0 66 28 20 28 73 6e 6f 20 3d 20 67 6f 32 28 69 74 65 6d 73 5b 69 5d 2c 20 6b 2b 4e 54 42 41 53 45   ┆f( (sno = go2(items[i], k+NTBASE┆
0x15a0…15c0 29 29 20 3e 3d 20 30 20 29 20 7b 0a 09 09 09 09 09 73 74 61 74 65 73 5b 69 5d 2e 73 5f 6e 74 67   ┆)) >= 0 ) {      states[i].s_ntg┆
0x15c0…15e0 6f 2b 2b 3b 0a 09 09 09 09 09 6e 74 67 6f 2e 6e 67 5f 73 74 20 3d 20 73 6e 6f 3b 0a 09 09 09 09   ┆o++;      ntgo.ng_st = sno;     ┆
0x15e0…1600 09 6e 74 67 6f 2e 6e 67 5f 6e 74 20 3d 20 6b 2b 4e 54 42 41 53 45 3b 0a 09 09 09 09 09 6e 74 67   ┆ ntgo.ng_nt = k+NTBASE;      ntg┆
0x1600…1620 6f 2e 6e 67 5f 72 65 6c 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 4d 57 43 20 44 53 43 20 2a 2f 0a 09   ┆o.ng_rel = NULL; /* MWC DSC */  ┆
0x1620…1640 09 09 09 09 66 77 72 69 74 65 28 26 6e 74 67 6f 2c 20 73 69 7a 65 6f 66 20 6e 74 67 6f 2c 20 31   ┆    fwrite(&ntgo, sizeof ntgo, 1┆
0x1640…1660 2c 20 6f 70 74 6f 75 74 29 3b 0a 09 09 09 09 7d 0a 09 09 09 73 74 61 74 65 73 5b 69 5d 2e 73 5f   ┆, optout);     }    states[i].s_┆
0x1660…1680 6e 72 65 64 20 3d 20 30 3b 0a 09 09 09 66 6f 72 28 6b 3d 30 3b 20 6b 3c 69 74 65 6d 73 5b 69 5d   ┆nred = 0;    for(k=0; k<items[i]┆
0x1680…16a0 2d 3e 69 5f 6e 69 74 65 6d 73 3b 20 6b 2b 2b 29 0a 09 09 09 09 69 66 28 20 2a 28 69 74 65 6d 73   ┆->i_nitems; k++)     if( *(items┆
0x16a0…16c0 5b 69 5d 2d 3e 69 5f 69 74 65 6d 73 5b 6b 5d 29 20 3d 3d 20 2d 31 20 29 0a 09 09 09 09 09 73 74   ┆[i]->i_items[k]) == -1 )      st┆
0x16c0…16e0 61 74 65 73 5b 69 5d 2e 73 5f 6e 72 65 64 2b 2b 3b 0a 09 09 09 73 74 61 74 65 73 5b 69 5d 2e 73   ┆ates[i].s_nred++;    states[i].s┆
0x16e0…1700 5f 74 67 6f 73 20 3d 20 73 74 61 74 65 73 5b 69 5d 2e 73 5f 6e 74 67 6f 73 20 3d 0a 09 09 09 20   ┆_tgos = states[i].s_ntgos =     ┆
0x1700…1720 20 20 20 73 74 61 74 65 73 5b 69 5d 2e 73 5f 72 65 64 73 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20   ┆   states[i].s_reds = NULL;  /* ┆
0x1720…1740 4d 57 43 20 44 53 43 20 2a 2f 0a 09 09 7d 0a 09 7d 20 77 68 69 6c 65 28 20 6e 65 77 67 65 6e 20   ┆MWC DSC */   }  } while( newgen ┆
0x1740…1760 29 3b 0a 09 66 72 65 65 28 6e 74 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 67 65 6e 65 72 61 74 65   ┆);  free(ntp); }  /*  * generate┆
0x1760…1780 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 61 20 73 74 61 74 65 20 28 66 6f 75 6e 64 20 69   ┆ the closure of a state (found i┆
0x1780…17a0 6e 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 60 6e 69 74 69 74 65 6d 27 0a 20 2a 20 41   ┆n global variable `nititem'  * A┆
0x17a0…17c0 6c 67 6f 72 69 74 68 6d 3a 0a 20 2a 20 20 2d 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 6e 6f   ┆lgorithm:  *  - look at every no┆
0x17c0…17e0 6e 20 74 65 72 6d 69 6e 61 6c 27 73 20 61 66 74 65 72 20 65 76 65 72 79 20 27 2e 27 20 69 74 65   ┆n terminal's after every '.' ite┆
0x17e0…1800 6d 20 70 6f 69 6e 74 65 72 0a 20 2a 20 20 2d 20 61 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 64   ┆m pointer  *  - add all the prod┆
0x1800…1820 75 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6e 6f 6e   ┆uctions associated with this non┆
0x1820…1840 2d 74 65 72 6d 69 6e 61 6c 0a 20 2a 20 20 20 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 28 74 68   ┆-terminal  *    to the state (th┆
0x1840…1860 65 20 27 2e 27 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20   ┆e '.' being at the beginning of ┆
0x1860…1880 74 68 65 20 72 68 73 29 20 75 6e 6c 65 73 73 0a 20 2a 20 20 20 20 74 68 65 79 20 61 72 65 20 61   ┆the rhs) unless  *    they are a┆
0x1880…18a0 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 49 74 20 73 75 66 66 69 63 65 73 20 74 6f 20 74 65 73   ┆lready there. It suffices to tes┆
0x18a0…18c0 74 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 6d 20 69 73 0a 20 2a 20 20 20 20 61 6c 72 65 61 64   ┆t if one of them is  *    alread┆
0x18c0…18e0 79 20 74 68 65 72 65 2c 20 73 69 6e 63 65 20 70 72 6f 64 75 63 74 69 6f 6e 73 20 61 72 65 20 61   ┆y there, since productions are a┆
0x18e0…1900 64 64 65 64 20 74 6f 20 74 68 65 20 63 6c 6f 73 75 72 65 20 61 63 63 6f 72 64 69 6e 67 0a 20 2a   ┆dded to the closure according  *┆
0x1900…1920 20 20 20 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 69 72 20 6c 68 73 0a 20 2a 20 20 20   ┆    according to their lhs  *   ┆
[…truncated at 200 lines…]