/ Hex Artifact Content
Login

Artifact 0c455691cc1e59a8f782d51a83dd6bbd7c5c44e7:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 20 20  ined(WIN32).#   
01e0: 20 20 20 20 64 65 66 69 6e 65 20 5f 5f 57 49 4e      define __WIN
01f0: 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69 66 0a 23  32__.#   endif.#
0200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f  endif..#ifdef __
0210: 57 49 4e 33 32 5f 5f 0a 23 69 66 64 65 66 20 5f  WIN32__.#ifdef _
0220: 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72  _cplusplus.exter
0230: 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 65  n "C" {.#endif.e
0240: 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
0250: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
0260: 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 23 69  h, int mode);.#i
0270: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0280: 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  .}.#endif.#else.
0290: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
02a0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23  .h>.#endif../* #
02b0: 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20 73  define PRIVATE s
02c0: 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65  tatic */.#define
02d0: 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66   PRIVATE..#ifdef
02e0: 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41   TEST.#define MA
02f0: 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20  XRHS 5       /* 
0300: 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63  Set low to exerc
0310: 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f  ise exception co
0320: 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  de */.#else.#def
0330: 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a  ine MAXRHS 1000.
0340: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
0350: 6e 74 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  nt showPrecedenc
0360: 65 43 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 73  eConflict = 0;.s
0370: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72  tatic char *msor
0380: 74 28 63 68 61 72 2a 2c 63 68 61 72 2a 2a 2c 69  t(char*,char**,i
0390: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
03a0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  *,const char*));
03b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72  ../*.** Compiler
03c0: 73 20 61 72 65 20 67 65 74 74 69 6e 67 20 69 6e  s are getting in
03d0: 63 72 65 61 73 69 6e 67 6c 79 20 70 65 64 61 6e  creasingly pedan
03e0: 74 69 63 20 61 62 6f 75 74 20 74 79 70 65 20 63  tic about type c
03f0: 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 61 73  onversions.** as
0400: 20 43 20 65 76 6f 6c 76 65 73 20 65 76 65 72 20   C evolves ever 
0410: 63 6c 6f 73 65 72 20 74 6f 20 41 64 61 2e 2e 2e  closer to Ada...
0420: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
0430: 64 20 74 68 65 20 6c 61 74 65 73 74 20 70 72 6f  d the latest pro
0440: 62 6c 65 6d 73 0a 2a 2a 20 77 65 20 68 61 76 65  blems.** we have
0450: 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 66   to define the f
0460: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 6e 74  ollowing variant
0470: 20 6f 66 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f   of strlen()..*/
0480: 0a 23 64 65 66 69 6e 65 20 6c 65 6d 6f 6e 53 74  .#define lemonSt
0490: 72 6c 65 6e 28 58 29 20 20 20 28 28 69 6e 74 29  rlen(X)   ((int)
04a0: 73 74 72 6c 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a  strlen(X))../*.*
04b0: 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20  * Compilers are 
04c0: 73 74 61 72 74 69 6e 67 20 74 6f 20 63 6f 6d 70  starting to comp
04d0: 6c 61 69 6e 20 61 62 6f 75 74 20 74 68 65 20 75  lain about the u
04e0: 73 65 20 6f 66 20 73 70 72 69 6e 74 66 28 29 20  se of sprintf() 
04f0: 61 6e 64 20 73 74 72 63 70 79 28 29 2c 0a 2a 2a  and strcpy(),.**
0500: 20 73 61 79 69 6e 67 20 74 68 65 79 20 61 72 65   saying they are
0510: 20 75 6e 73 61 66 65 2e 20 20 53 6f 20 77 65 20   unsafe.  So we 
0520: 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 20 76  define our own v
0530: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 6f 73 65  ersions of those
0540: 20 72 6f 75 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a   routines too..*
0550: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
0560: 68 72 65 65 20 72 6f 75 74 69 6e 65 73 20 68 65  hree routines he
0570: 72 65 3a 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  re:  lemon_sprin
0580: 74 66 28 29 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72  tf(), lemon_vspr
0590: 69 6e 74 66 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c  intf(), and.** l
05a0: 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 29 2e 20  emon_addtext(). 
05b0: 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72  The first two ar
05c0: 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20 66  e replacements f
05d0: 6f 72 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64  or sprintf() and
05e0: 20 76 73 70 72 69 6e 74 66 28 29 2e 0a 2a 2a 20   vsprintf()..** 
05f0: 54 68 65 20 74 68 69 72 64 20 69 73 20 61 20 68  The third is a h
0600: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 66 6f  elper routine fo
0610: 72 20 76 73 6e 70 72 69 6e 74 66 28 29 20 74 68  r vsnprintf() th
0620: 61 74 20 61 64 64 73 20 74 65 78 74 73 20 74 6f  at adds texts to
0630: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 0a 2a 2a   the end of a.**
0640: 20 62 75 66 66 65 72 2c 20 6d 61 6b 69 6e 67 20   buffer, making 
0650: 73 75 72 65 20 74 68 65 20 62 75 66 66 65 72 20  sure the buffer 
0660: 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d 74  is always zero-t
0670: 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  erminated..**.**
0680: 20 54 68 65 20 73 74 72 69 6e 67 20 66 6f 72 6d   The string form
0690: 61 74 74 65 72 20 69 73 20 61 20 6d 69 6e 69 6d  atter is a minim
06a0: 61 6c 20 73 75 62 73 65 74 20 6f 66 20 73 74 64  al subset of std
06b0: 6c 69 62 20 73 70 72 69 6e 74 66 28 29 20 73 75  lib sprintf() su
06c0: 70 70 6f 72 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a  pporting only.**
06d0: 20 61 20 66 65 77 20 73 69 6d 70 6c 79 20 63 6f   a few simply co
06e0: 6e 76 65 72 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  nversions:.**.**
06f0: 20 20 20 25 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a     %d.**   %s.**
0700: 20 20 20 25 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74     %.*s.**.*/.st
0710: 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f  atic void lemon_
0720: 61 64 64 74 65 78 74 28 0a 20 20 63 68 61 72 20  addtext(.  char 
0730: 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *zBuf,          
0740: 20 2f 2a 20 54 68 65 20 62 75 66 66 65 72 20 74   /* The buffer t
0750: 6f 20 77 68 69 63 68 20 74 65 78 74 20 69 73 20  o which text is 
0760: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  added */.  int *
0770: 70 6e 55 73 65 64 2c 20 20 20 20 20 20 20 20 20  pnUsed,         
0780: 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 74 68 65   /* Slots of the
0790: 20 62 75 66 66 65 72 20 75 73 65 64 20 73 6f 20   buffer used so 
07a0: 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  far */.  const c
07b0: 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20 2f  har *zIn,      /
07c0: 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 2a 2f  * Text to add */
07d0: 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 20 20 20 20  .  int nIn,     
07e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
07f0: 73 20 6f 66 20 74 65 78 74 20 74 6f 20 61 64 64  s of text to add
0800: 2e 20 20 2d 31 20 74 6f 20 75 73 65 20 73 74 72  .  -1 to use str
0810: 6c 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  len() */.  int i
0820: 57 69 64 74 68 20 20 20 20 20 20 20 20 20 20 20  Width           
0830: 20 2f 2a 20 46 69 65 6c 64 20 77 69 64 74 68 2e   /* Field width.
0840: 20 20 4e 65 67 61 74 69 76 65 20 74 6f 20 6c 65    Negative to le
0850: 66 74 20 6a 75 73 74 69 66 79 20 2a 2f 0a 29 7b  ft justify */.){
0860: 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 20 66  .  if( nIn<0 ) f
0870: 6f 72 28 6e 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49  or(nIn=0; zIn[nI
0880: 6e 5d 3b 20 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77  n]; nIn++){}.  w
0890: 68 69 6c 65 28 20 69 57 69 64 74 68 3e 6e 49 6e  hile( iWidth>nIn
08a0: 20 29 7b 20 7a 42 75 66 5b 28 2a 70 6e 55 73 65   ){ zBuf[(*pnUse
08b0: 64 29 2b 2b 5d 20 3d 20 27 20 27 3b 20 69 57 69  d)++] = ' '; iWi
08c0: 64 74 68 2d 2d 3b 20 7d 0a 20 20 69 66 28 20 6e  dth--; }.  if( n
08d0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  In==0 ) return;.
08e0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 2a    memcpy(&zBuf[*
08f0: 70 6e 55 73 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49  pnUsed], zIn, nI
0900: 6e 29 3b 0a 20 20 2a 70 6e 55 73 65 64 20 2b 3d  n);.  *pnUsed +=
0910: 20 6e 49 6e 3b 0a 20 20 77 68 69 6c 65 28 20 28   nIn;.  while( (
0920: 2d 69 57 69 64 74 68 29 3e 6e 49 6e 20 29 7b 20  -iWidth)>nIn ){ 
0930: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
0940: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2b  ] = ' '; iWidth+
0950: 2b 3b 20 7d 0a 20 20 7a 42 75 66 5b 2a 70 6e 55  +; }.  zBuf[*pnU
0960: 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a 73 74 61 74  sed] = 0;.}.stat
0970: 69 63 20 69 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70  ic int lemon_vsp
0980: 72 69 6e 74 66 28 63 68 61 72 20 2a 73 74 72 2c  rintf(char *str,
0990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
09a0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
09b0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
09c0: 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 55 73 65 64  , c;.  int nUsed
09d0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
09e0: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 54  ar *z;.  char zT
09f0: 65 6d 70 5b 35 30 5d 3b 0a 20 20 73 74 72 5b 30  emp[50];.  str[0
0a00: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 6a  ] = 0;.  for(i=j
0a10: 3d 30 3b 20 28 63 20 3d 20 7a 46 6f 72 6d 61 74  =0; (c = zFormat
0a20: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
0a30: 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b     if( c=='%' ){
0a40: 0a 20 20 20 20 20 20 69 6e 74 20 69 57 69 64 74  .      int iWidt
0a50: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65 6d  h = 0;.      lem
0a60: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0a70: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
0a80: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
0a90: 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61 74 5b      c = zFormat[
0aa0: 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ++i];.      if( 
0ab0: 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20 28 63  isdigit(c) || (c
0ac0: 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74  =='-' && isdigit
0ad0: 28 7a 46 6f 72 6d 61 74 5b 69 2b 31 5d 29 29 20  (zFormat[i+1])) 
0ae0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
0af0: 3d 3d 27 2d 27 20 29 20 69 2b 2b 3b 0a 20 20 20  =='-' ) i++;.   
0b00: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
0b10: 67 69 74 28 7a 46 6f 72 6d 61 74 5b 69 5d 29 20  git(zFormat[i]) 
0b20: 29 20 69 57 69 64 74 68 20 3d 20 69 57 69 64 74  ) iWidth = iWidt
0b30: 68 2a 31 30 20 2b 20 7a 46 6f 72 6d 61 74 5b 69  h*10 + zFormat[i
0b40: 2b 2b 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  ++] - '0';.     
0b50: 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 29 20     if( c=='-' ) 
0b60: 69 57 69 64 74 68 20 3d 20 2d 69 57 69 64 74 68  iWidth = -iWidth
0b70: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 46  ;.        c = zF
0b80: 6f 72 6d 61 74 5b 69 5d 3b 0a 20 20 20 20 20 20  ormat[i];.      
0b90: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
0ba0: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d' ){.        in
0bb0: 74 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t v = va_arg(ap,
0bc0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
0bd0: 66 28 20 76 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( v<0 ){.      
0be0: 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78      lemon_addtex
0bf0: 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22  t(str, &nUsed, "
0c00: 2d 22 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a  -", 1, iWidth);.
0c10: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 2d 76            v = -v
0c20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
0c30: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
0c40: 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74        lemon_addt
0c50: 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c  ext(str, &nUsed,
0c60: 20 22 30 22 2c 20 31 2c 20 69 57 69 64 74 68 29   "0", 1, iWidth)
0c70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0c80: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
0c90: 20 20 20 77 68 69 6c 65 28 20 76 3e 30 20 29 7b     while( v>0 ){
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a  .          k++;.
0cb0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
0cc0: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d  sizeof(zTemp)-k]
0cd0: 20 3d 20 28 76 25 31 30 29 20 2b 20 27 30 27 3b   = (v%10) + '0';
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 76 20 2f 3d 20  .          v /= 
0cf0: 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  10;.        }.  
0d00: 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74        lemon_addt
0d10: 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c  ext(str, &nUsed,
0d20: 20 26 7a 54 65 6d 70 5b 73 69 7a 65 6f 66 28 7a   &zTemp[sizeof(z
0d30: 54 65 6d 70 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69  Temp)-k], k, iWi
0d40: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0d50: 65 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a  e if( c=='s' ){.
0d60: 20 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61          z = va_a
0d70: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
0d80: 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  r*);.        lem
0d90: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0da0: 26 6e 55 73 65 64 2c 20 7a 2c 20 2d 31 2c 20 69  &nUsed, z, -1, i
0db0: 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  Width);.      }e
0dc0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2e 27 20 26  lse if( c=='.' &
0dd0: 26 20 6d 65 6d 63 6d 70 28 26 7a 46 6f 72 6d 61  & memcmp(&zForma
0de0: 74 5b 69 5d 2c 20 22 2e 2a 73 22 2c 20 33 29 3d  t[i], ".*s", 3)=
0df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  =0 ){.        i 
0e00: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6b 20  += 2;.        k 
0e10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0e20: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 76  );.        z = v
0e30: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
0e40: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20  char*);.        
0e50: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0e60: 72 2c 20 26 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c  r, &nUsed, z, k,
0e70: 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20   iWidth);.      
0e80: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 25 27  }else if( c=='%'
0e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f   ){.        lemo
0ea0: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0eb0: 6e 55 73 65 64 2c 20 22 25 22 2c 20 31 2c 20 30  nUsed, "%", 1, 0
0ec0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
0ed0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
0ee0: 73 74 64 65 72 72 2c 20 22 69 6c 6c 65 67 61 6c  stderr, "illegal
0ef0: 20 66 6f 72 6d 61 74 5c 6e 22 29 3b 0a 20 20 20   format\n");.   
0f00: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
0f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
0f20: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i+1;.    }.  }. 
0f30: 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73   lemon_addtext(s
0f40: 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 46 6f  tr, &nUsed, &zFo
0f50: 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29  rmat[j], i-j, 0)
0f60: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 55 73 65 64  ;.  return nUsed
0f70: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  ;.}.static int l
0f80: 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 63 68 61  emon_sprintf(cha
0f90: 72 20 2a 73 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *str, const ch
0fa0: 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29  ar *format, ...)
0fb0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
0fc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
0fd0: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
0fe0: 3b 0a 20 20 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76  ;.  rc = lemon_v
0ff0: 73 70 72 69 6e 74 66 28 73 74 72 2c 20 66 6f 72  sprintf(str, for
1000: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1010: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
1020: 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
1030: 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  id lemon_strcpy(
1040: 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e 73  char *dest, cons
1050: 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20 20  t char *src){.  
1060: 77 68 69 6c 65 28 20 28 2a 28 64 65 73 74 2b 2b  while( (*(dest++
1070: 29 20 3d 20 2a 28 73 72 63 2b 2b 29 29 21 3d 30  ) = *(src++))!=0
1080: 20 29 7b 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f   ){}.}.static vo
1090: 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  id lemon_strcat(
10a0: 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e 73  char *dest, cons
10b0: 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20 20  t char *src){.  
10c0: 77 68 69 6c 65 28 20 2a 64 65 73 74 20 29 20 64  while( *dest ) d
10d0: 65 73 74 2b 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73  est++;.  lemon_s
10e0: 74 72 63 70 79 28 64 65 73 74 2c 20 73 72 63 29  trcpy(dest, src)
10f0: 3b 0a 7d 0a 0a 0a 2f 2a 20 61 20 66 65 77 20 66  ;.}.../* a few f
1100: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1110: 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74  ons... */.struct
1120: 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65   rule;.struct le
1130: 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69  mon;.struct acti
1140: 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75  on;..static stru
1150: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
1160: 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61  n_new(void);.sta
1170: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
1180: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73  n *Action_sort(s
1190: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
11a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
11b0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
11c0: 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.h" **********
11d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
11f0: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
1200: 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  nces();.void Fin
1210: 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f  dFirstSets();.vo
1220: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b  id FindStates();
1230: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
1240: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
1250: 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  owSets();.void F
1260: 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f  indActions();../
1270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1280: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
1290: 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.h" *********
12a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43  ********/.void C
12c0: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76  onfiglist_init(v
12d0: 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  oid);.struct con
12e0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
12f0: 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65 20  add(struct rule 
1300: 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20  *, int);.struct 
1310: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1320: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
1330: 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b  ct rule *, int);
1340: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
1350: 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20  _closure(struct 
1360: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43  lemon *);.void C
1370: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76  onfiglist_sort(v
1380: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
1390: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
13a0: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
13b0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
13c0: 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73  _return(void);.s
13d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
13e0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76  nfiglist_basis(v
13f0: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
1400: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
1410: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
1420: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
1430: 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  t(void);../*****
1440: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1450: 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a  le "error.h" ***
1460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1480: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72  ****/.void Error
1490: 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Msg(const char *
14a0: 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  , int,const char
14b0: 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a   *, ...);../****
14c0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
14d0: 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a   "option.h" ****
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1500: 2a 2a 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74  ******/.enum opt
1510: 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46  ion_type { OPT_F
1520: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
1530: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
1540: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
1550: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
1560: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
1570: 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73  _FSTR};.struct s
1580: 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75  _options {.  enu
1590: 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79  m option_type ty
15a0: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
15b0: 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20   *label;.  char 
15c0: 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *arg;.  const ch
15d0: 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a  ar *message;.};.
15e0: 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63  int    OptInit(c
15f0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
1600: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a  ptions*,FILE*);.
1610: 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28  int    OptNArgs(
1620: 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70  void);.char  *Op
1630: 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tArg(int);.void 
1640: 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76    OptErr(int);.v
1650: 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76  oid   OptPrint(v
1660: 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  oid);../********
1670: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1680: 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  parse.h" *******
1690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b0: 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73  **/.void Parse(s
16c0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
16d0: 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  p);../********* 
16e0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
16f0: 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  link.h" ********
1700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1720: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
1730: 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  link_new(void);.
1740: 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
1750: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
1760: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
1770: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  ;.void Plink_cop
1780: 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
1790: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
17a0: 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64  *);.void Plink_d
17b0: 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
17c0: 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nk *);../*******
17d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
17e0: 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a  e "report.h" ***
17f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74  **/.void Reprint
1820: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
1830: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  ;.void ReportOut
1840: 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
1850: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74   *);.void Report
1860: 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d  Table(struct lem
1870: 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64  on *, int);.void
1880: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74   ReportHeader(st
1890: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
18a0: 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  oid CompressTabl
18b0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
18c0: 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  *);.void ResortS
18d0: 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
18e0: 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  on *);../*******
18f0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1900: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1930: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
1940: 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  e(int);         
1950: 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20      /* All sets 
1960: 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20  will be of size 
1970: 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  N */.char *SetNe
1980: 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20  w(void);        
1990: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
19a0: 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20  set for element 
19b0: 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65  0..N */.void  Se
19c0: 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20  tFree(char*);   
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61            /* Dea
19e0: 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
19f0: 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
1a00: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  *,int);         
1a10: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
1a20: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
1a30: 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20  t SetUnion(char 
1a40: 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f 2a  *,char *);    /*
1a50: 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68 72   A <- A U B, thr
1a60: 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23  u element N */.#
1a70: 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28 58  define SetFind(X
1a80: 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20 20  ,Y) (X[Y])      
1a90: 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69 73   /* True if Y is
1aa0: 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a   in set X */../*
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1ac0: 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74 2e  he file "struct.
1ad0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1b00: 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20 73  Principal data s
1b10: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
1b20: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
1b30: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79  enerator..*/..ty
1b40: 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f  pedef enum {LEMO
1b50: 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e  N_FALSE=0, LEMON
1b60: 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a  _TRUE} Boolean;.
1b70: 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72  ./* Symbols (ter
1b80: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
1b90: 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20  rminals) of the 
1ba0: 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72  grammar are stor
1bb0: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  ed.** in the fol
1bc0: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20  lowing: */.enum 
1bd0: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20 20  symbol_type {.  
1be0: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54  TERMINAL,.  NONT
1bf0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49  ERMINAL,.  MULTI
1c00: 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d  TERMINAL.};.enum
1c10: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
1c20: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
1c30: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
1c40: 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  K.};.struct symb
1c50: 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ol {.  const cha
1c60: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1c70: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1c80: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
1c90: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1ca0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1cb0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
1cc0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73 79  bol */.  enum sy
1cd0: 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b 20  mbol_type type; 
1ce0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65    /* Symbols are
1cf0: 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d   all either TERM
1d00: 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a  INALS or NTs */.
1d10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1d20: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
1d30: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c  nked list of rul
1d40: 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20 61  es of this (if a
1d50: 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63  n NT) */.  struc
1d60: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
1d70: 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20  ck; /* fallback 
1d80: 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68  token in case th
1d90: 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74  is token doesn't
1da0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20   parse */.  int 
1db0: 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  prec;           
1dc0: 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e       /* Preceden
1dd0: 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d  ce if defined (-
1de0: 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a  1 otherwise) */.
1df0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 61    enum e_assoc a
1e00: 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41 73  ssoc;      /* As
1e10: 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70  sociativity if p
1e20: 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65 66  recedence is def
1e30: 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ined */.  char *
1e40: 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20  firstset;       
1e50: 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20     /* First-set 
1e60: 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66  for all rules of
1e70: 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a   this symbol */.
1e80: 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61    Boolean lambda
1e90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1ea0: 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e  ue if NT and can
1eb0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70   generate an emp
1ec0: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  ty string */.  i
1ed0: 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20 20  nt useCnt;      
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ef0: 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64 20  r of times used 
1f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
1f10: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
1f20: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
1f30: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1f40: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1f70: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1f80: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1f90: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1fa0: 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20 20  t destLineno;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
1fc0: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
1fd0: 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f  of destructor */
1fe0: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
1ff0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
2000: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
2010: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
2020: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
2050: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
2060: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
2070: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2090: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
20a0: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
20b0: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, the value. 
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
20e0: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
20f0: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
2100: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t of this.      
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
2130: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
2140: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
2150: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54  object */.  /* T
2160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
2170: 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20  lds are used by 
2180: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f  MULTITERMINALs o
2190: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75  nly */.  int nsu
21a0: 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20  bsym;           
21b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
21c0: 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f  onstituent symbo
21d0: 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20  ls in the MULTI 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
21f0: 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a  ol **subsym;  /*
2200: 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69   Array of consti
2210: 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f  tuent symbols */
2220: 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f  .};../* Each pro
2230: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20  duction rule in 
2240: 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73  the grammar is s
2250: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  tored in the fol
2260: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
2270: 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20  ure.  */.struct 
2280: 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20  rule {.  struct 
2290: 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20  symbol *lhs;    
22a0: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
22b0: 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20  ide of the rule 
22c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22d0: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a  *lhsalias;    /*
22e0: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
22f0: 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65  HS (NULL if none
2300: 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74  ) */.  int lhsSt
2310: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
2320: 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d  /* True if left-
2330: 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65  hand side is the
2340: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
2350: 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b  .  int ruleline;
2360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2370: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
2380: 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  he rule */.  int
2390: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
23a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23b0: 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  of RHS symbols *
23c0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23d0: 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20  l **rhs;     /* 
23e0: 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  The RHS symbols 
23f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2400: 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a  **rhsalias;   /*
2410: 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61   An alias for ea
2420: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e  ch RHS symbol (N
2430: 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a  ULL if none) */.
2440: 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20    int line;     
2450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2460: 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69  ne number at whi
2470: 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a  ch code begins *
2480: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2490: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  code;        /* 
24a0: 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65  The code execute
24b0: 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65  d when this rule
24c0: 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20   is reduced */. 
24d0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
24e0: 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65  precsym;  /* Pre
24f0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66  cedence symbol f
2500: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
2510: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
2520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2530: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   index number fo
2540: 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  r this rule */. 
2550: 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75   Boolean canRedu
2560: 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ce;       /* Tru
2570: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69  e if this rule i
2580: 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a  s ever reduced *
2590: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
25a0: 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20  *nextlhs;    /* 
25b0: 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74  Next rule with t
25c0: 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20  he same LHS */. 
25d0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
25e0: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
25f0: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c  t rule in the gl
2600: 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a  obal list */.};.
2610: 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74  ./* A configurat
2620: 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74  ion is a product
2630: 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20  ion rule of the 
2640: 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72  grammar together
2650: 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20   with.** a mark 
2660: 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f  (dot) showing ho
2670: 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72  w much of that r
2680: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ule has been pro
2690: 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a  cessed so far..*
26a0: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  * Configurations
26b0: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20   also contain a 
26c0: 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68  follow-set which
26d0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65   is a list of te
26e0: 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
26f0: 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f  s which are allo
2700: 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65  wed to immediate
2710: 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e  ly follow the en
2720: 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a  d of the rule..*
2730: 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72  * Every configur
2740: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
2750: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
2760: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2770: 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74  g: */.enum cfgst
2780: 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54  atus {.  COMPLET
2790: 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a  E,.  INCOMPLETE.
27a0: 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  };.struct config
27b0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
27c0: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
27d0: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
27e0: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
27f0: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
2800: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2820: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
2830: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2850: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
2860: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
2870: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
2880: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
2890: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
28a0: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
28b0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
28c0: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
28d0: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
28e0: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
28f0: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
2900: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
2910: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
2920: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2930: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
2940: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
2950: 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73    enum cfgstatus
2960: 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73   status;   /* us
2970: 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77  ed during follow
2980: 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f  set and shift co
2990: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
29a0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
29b0: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
29c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
29d0: 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20  n the state */. 
29e0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
29f0: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
2a00: 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66   next basis conf
2a10: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  iguration */.};.
2a20: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b  .enum e_action {
2a30: 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45  .  SHIFT,.  ACCE
2a40: 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20  PT,.  REDUCE,.  
2a50: 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c  ERROR,.  SSCONFL
2a60: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
2a70: 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69    /* A shift/shi
2a80: 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ft conflict */. 
2a90: 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20   SRCONFLICT,    
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
2ab0: 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70   a reduce, but p
2ac0: 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  art of a conflic
2ad0: 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43  t */.  RRCONFLIC
2ae0: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
2af0: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
2b00: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
2b10: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f  onflict */.  SH_
2b20: 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20  RESOLVED,       
2b30: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73        /* Was a s
2b40: 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63  hift.  Precedenc
2b50: 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c  e resolved confl
2b60: 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f  ict */.  RD_RESO
2b70: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
2b80: 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e    /* Was reduce.
2b90: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
2ba0: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
2bb0: 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20  /.  NOT_USED,   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd0: 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72  Deleted by compr
2be0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46  ession */.  SHIF
2bf0: 54 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20  TREDUCE         
2c00: 20 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69       /* Shift fi
2c10: 72 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65  rst, then reduce
2c20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79   */.};../* Every
2c30: 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65   shift or reduce
2c40: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74   operation is st
2c50: 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74  ored as one of t
2c60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
2c70: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a  struct action {.
2c80: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
2c90: 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *sp;       /* Th
2ca0: 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d  e look-ahead sym
2cb0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  bol */.  enum e_
2cc0: 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75  action type;.  u
2cd0: 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63  nion {.    struc
2ce0: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2cf0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61    /* The new sta
2d00: 74 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a  te, if a shift *
2d10: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c  /.    struct rul
2d20: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20  e *rp;       /* 
2d30: 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72  The rule, if a r
2d40: 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a  educe */.  } x;.
2d50: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
2d60: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
2d70: 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  xt action for th
2d80: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74  is state */.  st
2d90: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63 6f 6c  ruct action *col
2da0: 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74 20 61  lide;  /* Next a
2db0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2dc0: 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a  ame hash */.};..
2dd0: 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20 6f 66  /* Each state of
2de0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
2df0: 61 72 73 65 72 27 73 20 66 69 6e 69 74 65 20 73  arser's finite s
2e00: 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a 2a 20  tate machine.** 
2e10: 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e  is encoded as an
2e20: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2e30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2e40: 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20  ture. */.struct 
2e50: 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75 63 74  state {.  struct
2e60: 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20   config *bp;    
2e70: 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20     /* The basis 
2e80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 66  configurations f
2e90: 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f  or this state */
2ea0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
2eb0: 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 41   *cfp;      /* A
2ec0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
2ed0: 73 20 69 6e 20 74 68 69 73 20 73 65 74 20 2a 2f  s in this set */
2ee0: 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75 6d 3b  .  int statenum;
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2f00: 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62 65 72  equential number
2f10: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
2f20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  */.  struct acti
2f30: 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20 2f 2a  on *ap;       /*
2f40: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 6f 6e   Array of action
2f50: 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  s for this state
2f60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e 41 63   */.  int nTknAc
2f70: 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20 20 2f  t, nNtAct;     /
2f80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  * Number of acti
2f90: 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61 6c 73  ons on terminals
2fa0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
2fb0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b 6e 4f  s */.  int iTknO
2fc0: 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20 20 20  fst, iNtOfst;   
2fd0: 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f  /* yy_action[] o
2fe0: 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d 69 6e  ffset for termin
2ff0: 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 73  als and nonterms
3000: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c 74 52   */.  int iDfltR
3010: 65 64 75 63 65 3b 20 20 20 20 20 20 20 20 20 2f  educe;         /
3020: 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  * Default action
3030: 20 69 73 20 74 6f 20 52 45 44 55 43 45 20 62 79   is to REDUCE by
3040: 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20   this rule */.  
3050: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 44 66  struct rule *pDf
3060: 6c 74 52 65 64 75 63 65 3b 2f 2a 20 54 68 65 20  ltReduce;/* The 
3070: 64 65 66 61 75 6c 74 20 52 45 44 55 43 45 20 72  default REDUCE r
3080: 75 6c 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 75  ule. */.  int au
3090: 74 6f 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  toReduce;       
30a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
30b0: 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 72 65  is is an auto-re
30c0: 64 75 63 65 20 73 74 61 74 65 20 2a 2f 0a 7d 3b  duce state */.};
30d0: 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53  .#define NO_OFFS
30e0: 45 54 20 28 2d 32 31 34 37 34 38 33 36 34 37 29  ET (-2147483647)
30f0: 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74  ../* A followset
3100: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
3110: 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  k indicates that
3120: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3130: 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72   one.** configur
3140: 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20  ation followset 
3150: 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67  should be propag
3160: 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20  ated to another 
3170: 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20  whenever.** the 
3180: 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a  first changes. *
3190: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b  /.struct plink {
31a0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
31b0: 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54   *cfp;      /* T
31c0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
31d0: 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64   to which linked
31e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
31f0: 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f  nk *next;      /
3200: 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61  * The next propa
3210: 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a  gate link */.};.
3220: 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76 65  ./* The state ve
3230: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74  ctor for the ent
3240: 69 72 65 20 70 61 72 73 65 72 20 67 65 6e 65 72  ire parser gener
3250: 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64  ator is recorded
3260: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20   as.** follows. 
3270: 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20   (LEMON uses no 
3280: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3290: 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c   and makes littl
32a0: 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74  e use of.** stat
32b0: 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46  ic variables.  F
32c0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c  ields in the fol
32d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
32e0: 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a   can be thought.
32f0: 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67  ** of as begin g
3300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
3310: 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29  in the program.)
3320: 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e   */.struct lemon
3330: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
3340: 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a  e **sorted;   /*
3350: 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73   Table of states
3360: 20 73 6f 72 74 65 64 20 62 79 20 73 74 61 74 65   sorted by state
3370: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72   number */.  str
3380: 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20  uct rule *rule; 
3390: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
33a0: 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20   all rules */.  
33b0: 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20  int nstate;     
33c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33d0: 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a  er of states */.
33e0: 20 20 69 6e 74 20 6e 78 73 74 61 74 65 3b 20 20    int nxstate;  
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 73             /* ns
3400: 74 61 74 65 20 77 69 74 68 20 74 61 69 6c 20 64  tate with tail d
3410: 65 67 65 6e 65 72 61 74 65 20 73 74 61 74 65 73  egenerate states
3420: 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 69 6e   removed */.  in
3430: 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20  t nrule;        
3440: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3450: 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69   of rules */.  i
3460: 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20  nt nsymbol;     
3470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3480: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e  r of terminal an
3490: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79  d nonterminal sy
34a0: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
34b0: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
34c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34d0: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
34e0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  s */.  struct sy
34f0: 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20  mbol **symbols; 
3500: 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20  /* Sorted array 
3510: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
3520: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3530: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
3540: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3550: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74  f errors */.  st
3560: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72  ruct symbol *err
3570: 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72  sym;   /* The er
3580: 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ror symbol */.  
3590: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77  struct symbol *w
35a0: 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65  ildcard; /* Toke
35b0: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
35c0: 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61  nything */.  cha
35d0: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
35e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
35f0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
3600: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
3610: 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  *arg;           
3620: 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69      /* Declarati
3630: 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61 72  on of the 3th ar
3640: 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72  gument to parser
3650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
3660: 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  ntype;         /
3670: 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e  * Type of termin
3680: 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  al symbols in th
3690: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
36a0: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79 70  /.  char *vartyp
36b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
36c0: 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70 65  The default type
36d0: 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
36e0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
36f0: 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20  ar *start;      
3700: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3710: 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  f the start symb
3720: 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  ol for the gramm
3730: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  ar */.  char *st
3740: 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20  acksize;        
3750: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
3760: 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a  parser stack */.
3770: 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b    char *include;
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3790: 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68 65  de to put at the
37a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43 20   start of the C 
37b0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
37c0: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
37d0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
37e0: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
37f0: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
3800: 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b   char *overflow;
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3820: 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20  e to execute on 
3830: 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  a stack overflow
3840: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c   */.  char *fail
3850: 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ure;           /
3860: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3870: 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c  e on parser fail
3880: 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ure */.  char *a
3890: 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20 20  ccept;          
38a0: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
38b0: 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70 61  cute when the pa
38c0: 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a  rser excepts */.
38d0: 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64    char *extracod
38e0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  e;         /* Co
38f0: 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  de appended to t
3900: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c  he generated fil
3910: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
3920: 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  endest;         
3930: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3940: 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f  te to destroy to
3950: 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  ken data */.  ch
3960: 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20  ar *vardest;    
3970: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66         /* Code f
3980: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e  or the default n
3990: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74  on-terminal dest
39a0: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
39b0: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
39c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
39d0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
39e0: 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d  /.  char *outnam
39f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  Name of the curr
3a10: 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20  ent output file 
3a20: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
3a30: 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  prefix;       /*
3a40: 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20   A prefix added 
3a50: 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69  to token names i
3a60: 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f  n the .h file */
3a70: 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74  .  int nconflict
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3a90: 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67  umber of parsing
3aa0: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
3ab0: 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61 62 3b 20  int nactiontab; 
3ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ad0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3ae0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3af0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
3b00: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
3b10: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 61       /* Total ta
3b20: 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ble size of all 
3b30: 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73 20  tables in bytes 
3b40: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c  */.  int basisfl
3b50: 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ag;           /*
3b60: 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69   Print only basi
3b70: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
3b80: 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66 61   */.  int has_fa
3b90: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 2f  llback;        /
3ba0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25 66  * True if any %f
3bb0: 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e 20  allback is seen 
3bc0: 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
3bd0: 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  /.  int nolineno
3be0: 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  sflag;       /* 
3bf0: 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73 74  True if #line st
3c00: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  atements should 
3c10: 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20 2a  not be printed *
3c20: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b  /.  char *argv0;
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 67  Name of the prog
3c50: 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ram */.};..#defi
3c60: 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58  ne MemoryCheck(X
3c70: 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a  ) if((X)==0){ \.
3c80: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
3c90: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a  mory_error(); \.
3ca0: 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
3cb0: 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ; \.}../********
3cc0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
3cd0: 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68 22  e file "table.h"
3ce0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d00: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
3d10: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
3d20: 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
3d30: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
3d40: 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
3d50: 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
3d60: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
3d70: 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
3d80: 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
3d90: 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
3da0: 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
3db0: 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
3dc0: 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
3dd0: 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
3de0: 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
3df0: 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
3e00: 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
3e10: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
3e20: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
3e30: 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
3e40: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
3e50: 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65  r..*/./* Routine
3e60: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61  s for handling a
3e70: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e   strings */..con
3e80: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
3e90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
3ea0: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
3eb0: 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74  it(void);.int St
3ec0: 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e  rsafe_insert(con
3ed0: 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73  st char *);.cons
3ee0: 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  t char *Strsafe_
3ef0: 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20  find(const char 
3f00: 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  *);../* Routines
3f10: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3f20: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3f30: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3f40: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3f50: 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  ew(const char *)
3f60: 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  ;.int Symbolcmpp
3f70: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63  (const void *, c
3f80: 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f  onst void *);.vo
3f90: 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76  id Symbol_init(v
3fa0: 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  oid);.int Symbol
3fb0: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
3fc0: 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63  ymbol *, const c
3fd0: 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  har *);.struct s
3fe0: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
3ff0: 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  nd(const char *)
4000: 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
4010: 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29  *Symbol_Nth(int)
4020: 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75  ;.int Symbol_cou
4030: 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74  nt(void);.struct
4040: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
4050: 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a  _arrayof(void);.
4060: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  ./* Routines to 
4070: 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74 65  manage the state
4080: 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43   table */..int C
4090: 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63  onfigcmp(const c
40a0: 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  har *, const cha
40b0: 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61  r *);.struct sta
40c0: 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f  te *State_new(vo
40d0: 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  id);.void State_
40e0: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20  init(void);.int 
40f0: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72  State_insert(str
4100: 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74 72  uct state *, str
4110: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
4120: 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
4130: 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  te_find(struct c
4140: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
4150: 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
4160: 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a  rrayof(/*  */);.
4170: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65  ./* Routines use
4180: 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79  d for efficiency
4190: 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   in Configlist_a
41a0: 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66  dd */..void Conf
41b0: 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69  igtable_init(voi
41c0: 64 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61  d);.int Configta
41d0: 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ble_insert(struc
41e0: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
41f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
4200: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72  igtable_find(str
4210: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76  uct config *);.v
4220: 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
4230: 63 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72  clear(int(*)(str
4240: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a  uct config *));.
4250: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4260: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
4270: 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a  le "action.c" **
4280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
42a0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72  *.** Routines pr
42b0: 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20  ocessing parser 
42c0: 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  actions in the L
42d0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
42e0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c  rator..*/../* Al
42f0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72  locate a new par
4300: 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74  ser action */.st
4310: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
4320: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76  on *Action_new(v
4330: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
4340: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72  truct action *fr
4350: 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74  eelist = 0;.  st
4360: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77  ruct action *new
4370: 61 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66  action;..  if( f
4380: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
4390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
43a0: 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20   amt = 100;.    
43b0: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
43c0: 63 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c  ct action *)call
43d0: 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73  oc(amt, sizeof(s
43e0: 74 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a  truct action));.
43f0: 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74      if( freelist
4400: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
4410: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
4420: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
4430: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
4440: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22   parser action."
4450: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
4460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
4470: 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b  i=0; i<amt-1; i+
4480: 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  +) freelist[i].n
4490: 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b  ext = &freelist[
44a0: 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69  i+1];.    freeli
44b0: 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
44c0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74   0;.  }.  newact
44d0: 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  ion = freelist;.
44e0: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
44f0: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
4500: 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b  eturn newaction;
4510: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
4520: 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73  wo actions for s
4530: 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
4540: 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
4550: 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70  e, zero, or.** p
4560: 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
4570: 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c  irst action is l
4580: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
4590: 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
45a0: 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  han.** the first
45b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
45c0: 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75  ctioncmp(.  stru
45d0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a  ct action *ap1,.
45e0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
45f0: 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  *ap2.){.  int rc
4600: 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70  ;.  rc = ap1->sp
4610: 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73  ->index - ap2->s
4620: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  p->index;.  if( 
4630: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4640: 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65  = (int)ap1->type
4650: 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70   - (int)ap2->typ
4660: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  e;.  }.  if( rc=
4670: 3d 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65  =0 && (ap1->type
4680: 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d  ==REDUCE || ap1-
4690: 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55  >type==SHIFTREDU
46a0: 43 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  CE) ){.    rc = 
46b0: 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap1->x.rp->index
46c0: 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e   - ap2->x.rp->in
46d0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dex;.  }.  if( r
46e0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
46f0: 20 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70   (int) (ap2 - ap
4700: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
4710: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20   rc;.}../* Sort 
4720: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a  parser actions *
4730: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
4740: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73  action *Action_s
4750: 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63  ort(.  struct ac
4760: 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70  tion *ap.){.  ap
4770: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
4780: 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  n *)msort((char 
4790: 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61  *)ap,(char **)&a
47a0: 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20  p->next,.       
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63         (int(*)(c
47d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
47e0: 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d   char*))actioncm
47f0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b  p);.  return ap;
4800: 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f  .}..void Action_
4810: 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63  add(.  struct ac
4820: 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e  tion **app,.  en
4830: 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65  um e_action type
4840: 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ,.  struct symbo
4850: 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61  l *sp,.  char *a
4860: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61  rg.){.  struct a
4870: 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e  ction *newaction
4880: 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20  ;.  newaction = 
4890: 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20  Action_new();.  
48a0: 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20  newaction->next 
48b0: 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d  = *app;.  *app =
48c0: 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65   newaction;.  ne
48d0: 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20  waction->type = 
48e0: 74 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f  type;.  newactio
48f0: 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66  n->sp = sp;.  if
4900: 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b  ( type==SHIFT ){
4910: 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e  .    newaction->
4920: 78 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74 20  x.stp = (struct 
4930: 73 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d  state *)arg;.  }
4940: 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63 74  else{.    newact
4950: 69 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72  ion->x.rp = (str
4960: 75 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a  uct rule *)arg;.
4970: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65  ************* Ne
4990: 77 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  w code to implem
49a0: 65 6e 74 20 74 68 65 20 22 61 63 74 74 61 62 22  ent the "acttab"
49b0: 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a   module ********
49c0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ***/./*.** This 
49d0: 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  module implement
49e0: 73 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74  s routines use t
49f0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
4a00: 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
4a10: 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e..*/../*.** The
4a20: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 79 79   state of the yy
4a30: 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e  _action table un
4a40: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
4a50: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
4a60: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  of.** the follow
4a70: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
4a80: 2a 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74 69  *.** The yy_acti
4a90: 6f 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74 68  on table maps th
4aa0: 65 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e 75  e pair (state_nu
4ab0: 6d 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29  mber, lookahead)
4ac0: 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69   into an.** acti
4ad0: 6f 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  on_number.  The 
4ae0: 74 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61  table is an arra
4af0: 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70 61  y of integers pa
4b00: 69 72 73 2e 20 20 54 68 65 20 73 74 61 74 65 5f  irs.  The state_
4b10: 6e 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d  number.** determ
4b20: 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 20  ines an initial 
4b30: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
4b40: 79 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e  yy_action array.
4b50: 20 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a    The lookahead.
4b60: 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 6e  ** value is then
4b70: 20 61 64 64 65 64 20 74 6f 20 74 68 69 73 20 69   added to this i
4b80: 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74 6f  nitial offset to
4b90: 20 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58 20   get an index X 
4ba0: 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61  into the.** yy_a
4bb0: 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66 20  ction array. If 
4bc0: 74 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c  the aAction[X].l
4bd0: 6f 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73 20  ookahead equals 
4be0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61  .** of the looka
4c00: 68 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65 6e  head input, then
4c10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4c20: 65 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20  e action_number 
4c30: 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41 63  output is.** aAc
4c40: 74 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20  tion[X].action. 
4c50: 20 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   If the lookahea
4c60: 64 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ds do not match 
4c70: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61  then the.** defa
4c80: 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74  ult action for t
4c90: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20  he state_number 
4ca0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
4cb0: 2a 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61  ** All actions a
4cc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
4cd0: 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75   single state_nu
4ce0: 6d 62 65 72 20 61 72 65 20 66 69 72 73 74 20 65  mber are first e
4cf0: 6e 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  ntered.** into a
4d00: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e  Lookahead[] usin
4d10: 67 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73  g multiple calls
4d20: 20 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f   to acttab_actio
4d30: 6e 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20 0a  n().  Then the .
4d40: 2a 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  ** actions for t
4d50: 68 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65  hat single state
4d60: 5f 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63  _number are plac
4d70: 65 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74  ed into the aAct
4d80: 69 6f 6e 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20  ion[] .** array 
4d90: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61  with a single ca
4da0: 6c 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73  ll to acttab_ins
4db0: 65 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74  ert().  The actt
4dc0: 61 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c  ab_insert() call
4dd0: 0a 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20  .** also resets 
4de0: 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  the aLookahead[]
4df0: 20 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72   array in prepar
4e00: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4e10: 78 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62  xt.** state numb
4e20: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f  er..*/.struct lo
4e30: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b  okahead_action {
4e40: 0a 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64  .  int lookahead
4e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4e60: 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   Value of the lo
4e70: 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f  okahead token */
4e80: 0a 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20  .  int action;  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ea0: 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
4eb0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f  on the given loo
4ec0: 6b 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70  kahead */.};.typ
4ed0: 65 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74  edef struct actt
4ee0: 61 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63  ab acttab;.struc
4ef0: 74 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74  t acttab {.  int
4f00: 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20   nAction;       
4f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4f20: 62 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74  ber of used slot
4f30: 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a  s in aAction[] *
4f40: 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41  /.  int nActionA
4f50: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
4f60: 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61   /* Slots alloca
4f70: 74 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b  ted for aAction[
4f80: 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f  ] */.  struct lo
4f90: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20  okahead_action. 
4fa0: 20 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20     *aAction,    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fc0: 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   The yy_action[]
4fd0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4fe0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
4ff0: 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   *aLookahead;   
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5010: 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e   single new tran
5020: 73 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20  saction set */. 
5030: 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64   int mnLookahead
5040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5050: 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68   Minimum aLookah
5060: 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ead[].lookahead 
5070: 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f  */.  int mnActio
5080: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
5090: 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f    /* Action asso
50a0: 63 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f  ciated with mnLo
50b0: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
50c0: 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   mxLookahead;   
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
50e0: 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  imum aLookahead[
50f0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  ].lookahead */. 
5100: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b   int nLookahead;
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5120: 20 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   Used slots in a
5130: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20  Lookahead[] */. 
5140: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41   int nLookaheadA
5150: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  lloc;         /*
5160: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
5170: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
5180: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72   */.};../* Retur
5190: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
51a0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
51b0: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  y_action table *
51c0: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
51d0: 5f 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e  _size(X) ((X)->n
51e0: 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20  Action)../* The 
51f0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d  value for the N-
5200: 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61  th entry in yy_a
5210: 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ction */.#define
5220: 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
5230: 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63  (X,N)  ((X)->aAc
5240: 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a  tion[N].action).
5250: 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f  ./* The value fo
5260: 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79  r the N-th entry
5270: 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64   in yy_lookahead
5280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
5290: 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58  ab_yylookahead(X
52a0: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
52b0: 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29  on[N].lookahead)
52c0: 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  ../* Free all me
52d0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
52e0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
52f0: 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63  cttab */.void ac
5300: 74 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62  ttab_free(acttab
5310: 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d   *p){.  free( p-
5320: 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72  >aAction );.  fr
5330: 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ee( p->aLookahea
5340: 64 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29  d );.  free( p )
5350: 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
5360: 20 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74   a new acttab st
5370: 72 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61  ructure */.actta
5380: 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28  b *acttab_alloc(
5390: 76 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20  void){.  acttab 
53a0: 2a 70 20 3d 20 28 61 63 74 74 61 62 20 2a 29 20  *p = (acttab *) 
53b0: 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f  calloc( 1, sizeo
53c0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
53d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
53e0: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
53f0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
5400: 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61  mory for a new a
5410: 63 74 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78  cttab.");.    ex
5420: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  it(1);.  }.  mem
5430: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
5440: 28 2a 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (*p));.  return 
5450: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  p;.}../* Add a n
5460: 65 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ew action to the
5470: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
5480: 74 69 6f 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a  tion set.  .**.*
5490: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
54a0: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
54b0: 72 20 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64  r each lookahead
54c0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
54d0: 72 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76  r.** state..*/.v
54e0: 6f 69 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f  oid acttab_actio
54f0: 6e 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74  n(acttab *p, int
5500: 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20   lookahead, int 
5510: 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70  action){.  if( p
5520: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d  ->nLookahead>=p-
5530: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
5540: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b   ){.    p->nLook
5550: 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35  aheadAlloc += 25
5560: 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68  ;.    p->aLookah
5570: 65 61 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f  ead = (struct lo
5580: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a  okahead_action *
5590: 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c  ) realloc( p->aL
55a0: 6f 6f 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20  ookahead,.      
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d         sizeof(p-
55d0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a  >aLookahead[0])*
55e0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
55f0: 6f 63 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  oc );.    if( p-
5600: 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >aLookahead==0 )
5610: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
5620: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
5630: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
5640: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
5650: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f    }.  if( p->nLo
5660: 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20  okahead==0 ){.  
5670: 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64    p->mxLookahead
5680: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
5690: 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64    p->mnLookahead
56a0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
56b0: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
56c0: 61 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b  action;.  }else{
56d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f  .    if( p->mxLo
56e0: 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61  okahead<lookahea
56f0: 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  d ) p->mxLookahe
5700: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
5710: 20 20 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f      if( p->mnLoo
5720: 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64  kahead>lookahead
5730: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c   ){.      p->mnL
5740: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5750: 68 65 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  head;.      p->m
5760: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
5770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
5780: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
5790: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61  Lookahead].looka
57a0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
57b0: 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ;.  p->aLookahea
57c0: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
57d0: 2e 61 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  .action = action
57e0: 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ;.  p->nLookahea
57f0: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  d++;.}../*.** Ad
5800: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
5810: 6e 20 73 65 74 20 62 75 69 6c 74 20 75 70 20 77  n set built up w
5820: 69 74 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20  ith prior calls 
5830: 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  to acttab_action
5840: 28 29 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63  ().** into the c
5850: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
5860: 62 6c 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74  ble.  Then reset
5870: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5880: 20 73 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20   set back.** to 
5890: 61 6e 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20  an empty set in 
58a0: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20  preparation for 
58b0: 61 20 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61  a new round of a
58c0: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63  cttab_action() c
58d0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alls..**.** Retu
58e0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  rn the offset in
58f0: 74 6f 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  to the action ta
5900: 62 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ble of the new t
5910: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
5920: 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  nt acttab_insert
5930: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69  (acttab *p){.  i
5940: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20  nt i, j, k, n;. 
5950: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f   assert( p->nLoo
5960: 6b 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f  kahead>0 );..  /
5970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
5980: 61 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ave enough space
5990: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70   to hold the exp
59a0: 61 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62  anded action tab
59b0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77  le.  ** in the w
59c0: 6f 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20  orst case.  The 
59d0: 77 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72  worst case occur
59e0: 73 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  s if the transac
59f0: 74 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75  tion set.  ** mu
5a00: 73 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  st be appended t
5a10: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63  o the current ac
5a20: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  tion table.  */.
5a30: 20 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    n = p->mxLooka
5a40: 68 65 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20  head + 1;.  if( 
5a50: 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e  p->nAction + n >
5a60: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
5a70: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
5a80: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
5a90: 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e  onAlloc;.    p->
5aa0: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70  nActionAlloc = p
5ab0: 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20  ->nAction + n + 
5ac0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
5ad0: 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63  + 20;.    p->aAc
5ae0: 74 69 6f 6e 20 3d 20 28 73 74 72 75 63 74 20 6c  tion = (struct l
5af0: 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20  ookahead_action 
5b00: 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  *) realloc( p->a
5b10: 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Action,.        
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74    sizeof(p->aAct
5b40: 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69  ion[0])*p->nActi
5b50: 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  onAlloc);.    if
5b60: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20  ( p->aAction==0 
5b70: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
5b80: 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
5b90: 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
5ba0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
5bb0: 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c  .    for(i=oldAl
5bc0: 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f  loc; i<p->nActio
5bd0: 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20  nAlloc; i++){.  
5be0: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
5bf0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31  ].lookahead = -1
5c00: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  ;.      p->aActi
5c10: 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d  on[i].action = -
5c20: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
5c30: 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73  /* Scan the exis
5c40: 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c  ting action tabl
5c50: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e  e looking for an
5c60: 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20   offset that is 
5c70: 61 20 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74  a .  ** duplicat
5c80: 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  e of the current
5c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
5ca0: 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74  .  Fall out of t
5cb0: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20  he loop.  ** if 
5cc0: 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75 70  and when the dup
5cd0: 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e  licate is found.
5ce0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20  .  **.  ** i is 
5cf0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e  the index in p->
5d00: 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20  aAction[] where 
5d10: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69  p->mnLookahead i
5d20: 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  s inserted..  */
5d30: 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74  .  for(i=p->nAct
5d40: 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ion-1; i>=0; i--
5d50: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  ){.    if( p->aA
5d60: 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65  ction[i].lookahe
5d70: 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ad==p->mnLookahe
5d80: 61 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ad ){.      /* A
5d90: 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e  ll lookaheads an
5da0: 64 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  d actions in the
5db0: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
5dc0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
5dd0: 2a 2a 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67  ** must match ag
5de0: 61 69 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64  ainst the candid
5df0: 61 74 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65  ate aAction[i] e
5e00: 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ntry. */.      i
5e10: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
5e20: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63  .action!=p->mnAc
5e30: 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tion ) continue;
5e40: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5e50: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
5e60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
5e70: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
5e80: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
5e90: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
5ea0: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
5eb0: 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63  k<0 || k>=p->nAc
5ec0: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
5ed0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f        if( p->aLo
5ee0: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
5ef0: 68 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e  head!=p->aAction
5f00: 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20  [k].lookahead ) 
5f10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
5f20: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
5f30: 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61  [j].action!=p->a
5f40: 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e  Action[k].action
5f50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5f60: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d  }.      if( j<p-
5f70: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f  >nLookahead ) co
5f80: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f  ntinue;..      /
5f90: 2a 20 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f  * No possible lo
5fa0: 6f 6b 61 68 65 61 64 20 76 61 6c 75 65 20 74 68  okahead value th
5fb0: 61 74 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  at is not in the
5fc0: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20   aLookahead[].  
5fd0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
5fe0: 6f 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  on is allowed to
5ff0: 20 6d 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69   match aAction[i
6000: 5d 20 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30  ] */.      n = 0
6010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
6020: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
6030: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6040: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c   p->aAction[j].l
6050: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e  ookahead<0 ) con
6060: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
6070: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
6080: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
6090: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
60a0: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
60b0: 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c      if( n==p->nL
60c0: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
60d0: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41      break;  /* A
60e0: 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
60f0: 20 66 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74   found at offset
6100: 20 69 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20   i */.      }.  
6110: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6120: 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66   no existing off
6130: 73 65 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74  sets exactly mat
6140: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
6150: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64  ransaction, find
6160: 20 61 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74   an.  ** an empt
6170: 79 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  y offset in the 
6180: 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  aAction[] table 
6190: 69 6e 20 77 68 69 63 68 20 77 65 20 63 61 6e 20  in which we can 
61a0: 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f  add the.  ** aLo
61b0: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
61c0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ction..  */.  if
61d0: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( i<0 ){.    /* 
61e0: 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69  Look for holes i
61f0: 6e 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  n the aAction[] 
6200: 74 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74  table that fit t
6210: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
6220: 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74  * aLookahead[] t
6230: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61  ransaction.  Lea
6240: 76 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20  ve i set to the 
6250: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f  offset of the ho
6260: 6c 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  le..    ** If no
6270: 20 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64   holes are found
6280: 2c 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70  , i is left at p
6290: 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68  ->nAction, which
62a0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a   means the.    *
62b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
62c0: 6c 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  ll be appended. 
62d0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
62e0: 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  i<p->nActionAllo
62f0: 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  c - p->mxLookahe
6300: 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; i++){.      
6310: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
6320: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b  ].lookahead<0 ){
6330: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
6340: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
6350: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
6360: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6370: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6380: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6390: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
63a0: 20 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61    if( k<0 ) brea
63b0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
63c0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c   p->aAction[k].l
63d0: 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72  ookahead>=0 ) br
63e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
63f0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e         if( j<p->
6400: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
6410: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
6420: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63  or(j=0; j<p->nAc
6430: 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  tion; j++){.    
6440: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
6450: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
6460: 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  d==j+p->mnLookah
6470: 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ead-i ) break;. 
6480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6490: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69   if( j==p->nActi
64a0: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
64b0: 62 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20  break;  /* Fits 
64c0: 69 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a  in empty slots *
64d0: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
64e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
64f0: 2f 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61  /* Insert transa
6500: 63 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64  ction set at ind
6510: 65 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a  ex i. */.  for(j
6520: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
6530: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b  ead; j++){.    k
6540: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
6550: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
6560: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
6570: 20 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69   i;.    p->aActi
6580: 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b  on[k] = p->aLook
6590: 61 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66  ahead[j];.    if
65a0: 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( k>=p->nAction 
65b0: 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b  ) p->nAction = k
65c0: 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f  +1;.  }.  p->nLo
65d0: 6f 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20  okahead = 0;..  
65e0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  /* Return the of
65f0: 66 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64  fset that is add
6600: 65 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68  ed to the lookah
6610: 65 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ead in order to 
6620: 67 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  get the.  ** ind
6630: 65 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  ex into yy_actio
6640: 6e 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  n of the action 
6650: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20  */.  return i - 
6660: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a  p->mnLookahead;.
6670: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
6680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
6690: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
66a0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
66b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66c0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
66d0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   to construction
66e0: 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74   the finite stat
66f0: 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
6700: 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65  e LEMON.** parse
6710: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
6720: 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65  ./* Find a prece
6730: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20  dence symbol of 
6740: 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68  every rule in th
6750: 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a  e grammar..** .*
6760: 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68  * Those rules wh
6770: 69 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65  ich have a prece
6780: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64  dence symbol cod
6790: 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a  ed in the input.
67a0: 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67  ** grammar using
67b0: 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20   the "[symbol]" 
67c0: 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61  construct will a
67d0: 6c 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a  lready have the.
67e0: 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66  ** rp->precsym f
67f0: 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74  ield filled.  Ot
6800: 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61  her rules take a
6810: 73 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e  s their preceden
6820: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65  ce.** symbol the
6830: 20 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f   first RHS symbo
6840: 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  l with a defined
6850: 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66   precedence.  If
6860: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
6870: 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69  t RHS symbols wi
6880: 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65  th a defined pre
6890: 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65  cedence, the pre
68a0: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
68b0: 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20  l field is left 
68c0: 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46  blank..*/.void F
68d0: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
68e0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
68f0: 2a 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  *xp).{.  struct 
6900: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28  rule *rp;.  for(
6910: 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=xp->rule; rp;
6920: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
6930: 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73     if( rp->precs
6940: 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ym==0 ){.      i
6950: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66  nt i, j;.      f
6960: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
6970: 68 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79  hs && rp->precsy
6980: 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  m==0; i++){.    
6990: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
69a0: 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
69b0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
69c0: 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
69d0: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
69e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
69f0: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
6a00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6a10: 66 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  f( sp->subsym[j]
6a20: 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
6a30: 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70             rp->p
6a40: 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62  recsym = sp->sub
6a50: 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  sym[j];.        
6a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6a70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6a90: 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65  else if( sp->pre
6aa0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
6ab0: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
6ac0: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
6ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6ae0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6af0: 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c  ;.}../* Find all
6b00: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
6b10: 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ich will generat
6b20: 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  e the empty stri
6b30: 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62  ng..** Then go b
6b40: 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20  ack and compute 
6b50: 74 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f  the first sets o
6b60: 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69  f every nontermi
6b70: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  nal..** The firs
6b80: 74 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74  t set is the set
6b90: 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c   of all terminal
6ba0: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
6bb0: 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74  an begin.** a st
6bc0: 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62  ring generated b
6bd0: 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e  y that nontermin
6be0: 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  al..*/.void Find
6bf0: 46 69 72 73 74 53 65 74 73 28 73 74 72 75 63 74  FirstSets(struct
6c00: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
6c10: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
6c20: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
6c30: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a   int progress;..
6c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
6c50: 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
6c60: 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62  {.    lemp->symb
6c70: 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d  ols[i]->lambda =
6c80: 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
6c90: 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e  }.  for(i=lemp->
6ca0: 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d  nterminal; i<lem
6cb0: 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
6cc0: 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62  {.    lemp->symb
6cd0: 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74  ols[i]->firstset
6ce0: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d   = SetNew();.  }
6cf0: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d  ..  /* First com
6d00: 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73  pute all lambdas
6d10: 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72   */.  do{.    pr
6d20: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
6d30: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
6d40: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
6d50: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  xt){.      if( r
6d60: 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29  p->lhs->lambda )
6d70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
6d90: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
6da0: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
6db0: 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
6dc0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  i];.        asse
6dd0: 72 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  rt( sp->type==NO
6de0: 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d  NTERMINAL || sp-
6df0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
6e00: 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20  ALSE );.        
6e10: 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d  if( sp->lambda==
6e20: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
6e30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6e40: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
6e50: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70  hs ){.        rp
6e60: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20  ->lhs->lambda = 
6e70: 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20  LEMON_TRUE;.    
6e80: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
6e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ea0: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
6eb0: 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ss );..  /* Now 
6ec0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73  compute all firs
6ed0: 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a  t sets */.  do{.
6ee0: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
6ef0: 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20  l *s1, *s2;.    
6f00: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
6f10: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
6f20: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
6f30: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20  next){.      s1 
6f40: 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20  = rp->lhs;.     
6f50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
6f60: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
6f70: 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73      s2 = rp->rhs
6f80: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
6f90: 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   s2->type==TERMI
6fa0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
6fb0: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6fc0: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
6fd0: 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  ,s2->index);.   
6fe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6ff0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7000: 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  s2->type==MULTIT
7010: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
7020: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
7030: 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  s2->nsubsym; j++
7040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
7050: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64  rogress += SetAd
7060: 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  d(s1->firstset,s
7070: 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e  2->subsym[j]->in
7080: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
7090: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
70a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
70b0: 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20   if( s1==s2 ){. 
70c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d           if( s1-
70d0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
70e0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
70f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7100: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
7110: 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e  += SetUnion(s1->
7120: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72  firstset,s2->fir
7130: 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  stset);.        
7140: 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61    if( s2->lambda
7150: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
7160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7180: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
7190: 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  s );.  return;.}
71a0: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
71b0: 20 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f   LR(0) states fo
71c0: 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  r the grammar.  
71d0: 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64  Links.** are add
71e0: 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f  ed to between so
71f0: 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  me states so tha
7200: 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c  t the LR(1) foll
7210: 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62  ow sets.** can b
7220: 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72  e computed later
7230: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  ..*/.PRIVATE str
7240: 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74  uct state *getst
7250: 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ate(struct lemon
7260: 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64   *);  /* forward
7270: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
7280: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 73 74  id FindStates(st
7290: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
72a0: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
72b0: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
72c0: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43  t rule *rp;..  C
72d0: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
72e0: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
72f0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
7300: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
7310: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
7320: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
7330: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
7340: 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   sp==0 ){.      
7350: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
7360: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
7370: 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20  specified start 
7380: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73  symbol \"%s\" is
7390: 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74   not \.in a nont
73a0: 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67  erminal of the g
73b0: 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20  rammar.  \"%s\" 
73c0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20  will be used as 
73d0: 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62  the start \.symb
73e0: 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d  ol instead.",lem
73f0: 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72  p->start,lemp->r
7400: 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ule->lhs->name);
7410: 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
7420: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  orcnt++;.      s
7430: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
7440: 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lhs;.    }.  }el
7450: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
7460: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
7470: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
7480: 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  e the start symb
7490: 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72  ol doesn't occur
74a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
74b0: 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20  nd side of.  ** 
74c0: 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72  any rule.  Repor
74d0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74  t an error if it
74e0: 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f   does.  (YACC wo
74f0: 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e  uld generate a n
7500: 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79  ew.  ** start sy
7510: 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73  mbol in this cas
7520: 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  e.) */.  for(rp=
7530: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7540: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
7550: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
7560: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
7570: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
7580: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70  ( rp->rhs[i]==sp
7590: 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a   ){   /* FIX ME:
75a0: 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74    Deal with mult
75b0: 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  iterminals */.  
75c0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
75d0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
75e0: 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62  ."The start symb
75f0: 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73  ol \"%s\" occurs
7600: 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d   on the \.right-
7610: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72  hand side of a r
7620: 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72  ule. This will r
7630: 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65  esult in a parse
7640: 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e  r which \.does n
7650: 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79  ot work properly
7660: 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  .",sp->name);.  
7670: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
7680: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
7690: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
76a0: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
76b0: 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20  uration set for 
76c0: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a  the first state.
76d0: 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65    ** is all rule
76e0: 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65  s which have the
76f0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73   start symbol as
7700: 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74   their.  ** left
7710: 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20  -hand side */.  
7720: 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b  for(rp=sp->rule;
7730: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
7740: 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74  lhs){.    struct
7750: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b   config *newcfp;
7760: 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72  .    rp->lhsStar
7770: 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66  t = 1;.    newcf
7780: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
7790: 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20  ddbasis(rp,0);. 
77a0: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
77b0: 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ->fws,0);.  }.. 
77c0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
77d0: 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c  first state.  Al
77e0: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77  l other states w
77f0: 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70  ill be.  ** comp
7800: 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  uted automatical
7810: 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ly during the co
7820: 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mputation of the
7830: 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a   first one..  **
7840: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
7850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
7860: 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20  st state is not 
7870: 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  used. */.  (void
7880: 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b  )getstate(lemp);
7890: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
78a0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
78b0: 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69  r to a state whi
78c0: 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ch is described 
78d0: 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  by the configura
78e0: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69  tion.** list whi
78f0: 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c  ch has been buil
7900: 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20  t from calls to 
7910: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a  Configlist_add..
7920: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
7930: 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75  buildshifts(stru
7940: 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75  ct lemon *, stru
7950: 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20  ct state *); /* 
7960: 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49  Forwd ref */.PRI
7970: 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74  VATE struct stat
7980: 65 20 2a 67 65 74 73 74 61 74 65 28 73 74 72 75  e *getstate(stru
7990: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
79a0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
79b0: 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73  g *cfp, *bp;.  s
79c0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
79d0: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
79e0: 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69 73  the sorted basis
79f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61 74   of the new stat
7a00: 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77 61  e.  The basis wa
7a10: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  s constructed.  
7a20: 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c  ** by prior call
7a30: 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74  s to "Configlist
7a40: 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f  _addbasis()". */
7a50: 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  .  Configlist_so
7a60: 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20  rtbasis();.  bp 
7a70: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73  = Configlist_bas
7a80: 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  is();..  /* Get 
7a90: 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  a state with the
7aa0: 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20   same basis */. 
7ab0: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e   stp = State_fin
7ac0: 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70  d(bp);.  if( stp
7ad0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61   ){.    /* A sta
7ae0: 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  te with the same
7af0: 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20 65   basis already e
7b00: 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c  xists!  Copy all
7b10: 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a   the follow-set.
7b20: 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69      ** propagati
7b30: 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68  on links from th
7b40: 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f  e state under co
7b50: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20  nstruction into 
7b60: 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78  the.    ** preex
7b70: 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68  isting state, th
7b80: 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
7b90: 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65 78  ter to the preex
7ba0: 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a  isting state */.
7bb0: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
7bc0: 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f  g *x, *y;.    fo
7bd0: 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62  r(x=bp, y=stp->b
7be0: 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e  p; x && y; x=x->
7bf0: 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20  bp, y=y->bp){.  
7c00: 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26      Plink_copy(&
7c10: 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29  y->bplp,x->bplp)
7c20: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65  ;.      Plink_de
7c30: 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20  lete(x->fplp);. 
7c40: 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78       x->fplp = x
7c50: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
7c60: 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66  }.    cfp = Conf
7c70: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b  iglist_return();
7c80: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
7c90: 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73  eat(cfp);.  }els
7ca0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  e{.    /* This r
7cb0: 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73  eally is a new s
7cc0: 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74  tate.  Construct
7cd0: 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73   all the details
7ce0: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
7cf0: 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29  st_closure(lemp)
7d00: 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;    /* Compute 
7d10: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7d20: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
7d30: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
7d40: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
7d50: 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67   Sort the config
7d60: 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20  uration closure 
7d70: 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e  */.    cfp = Con
7d80: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
7d90: 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ;   /* Get a poi
7da0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66  nter to the conf
7db0: 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73  ig list */.    s
7dc0: 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29  tp = State_new()
7dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
7de0: 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
7df0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f  ture */.    Memo
7e00: 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20  ryCheck(stp);.  
7e10: 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20    stp->bp = bp; 
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
7e40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73  onfiguration bas
7e50: 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63  is */.    stp->c
7e60: 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20  fp = cfp;       
7e70: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62         /* Rememb
7e80: 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  er the configura
7e90: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
7ea0: 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e 75      stp->statenu
7eb0: 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  m = lemp->nstate
7ec0: 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61  ++; /* Every sta
7ed0: 74 65 20 67 65 74 73 20 61 20 73 65 71 75 65 6e  te gets a sequen
7ee0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  ce number */.   
7ef0: 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20   stp->ap = 0;   
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f10: 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74   No actions, yet
7f20: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69  . */.    State_i
7f30: 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62  nsert(stp,stp->b
7f40: 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20  p);   /* Add to 
7f50: 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20  the state table 
7f60: 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66  */.    buildshif
7f70: 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20  ts(lemp,stp);   
7f80: 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65      /* Recursive
7f90: 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65  ly compute succe
7fa0: 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20  ssor states */. 
7fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b   }.  return stp;
7fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7fd0: 20 74 72 75 65 20 69 66 20 74 77 6f 20 73 79 6d   true if two sym
7fe0: 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61 6d  bols are the sam
7ff0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73  e..*/.int same_s
8000: 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79 6d  ymbol(struct sym
8010: 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20 73  bol *a, struct s
8020: 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e  ymbol *b).{.  in
8030: 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20  t i;.  if( a==b 
8040: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
8050: 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  ( a->type!=MULTI
8060: 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72  TERMINAL ) retur
8070: 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79  n 0;.  if( b->ty
8080: 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe!=MULTITERMINA
8090: 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  L ) return 0;.  
80a0: 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d  if( a->nsubsym!=
80b0: 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74  b->nsubsym ) ret
80c0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
80d0: 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20  ; i<a->nsubsym; 
80e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  i++){.    if( a-
80f0: 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73  >subsym[i]!=b->s
8100: 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72  ubsym[i] ) retur
8110: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
8120: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74  n 1;.}../* Const
8130: 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73  ruct all success
8140: 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68 65  or states to the
8150: 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41   given state.  A
8160: 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20   "successor".** 
8170: 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74 61  state is any sta
8180: 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  te which can be 
8190: 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68 69  reached by a shi
81a0: 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52  ft action..*/.PR
81b0: 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64  IVATE void build
81c0: 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65  shifts(struct le
81d0: 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63  mon *lemp, struc
81e0: 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a  t state *stp).{.
81f0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8200: 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  *cfp;  /* For lo
8210: 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63  oping thru the c
8220: 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66  onfig closure of
8230: 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75   "stp" */.  stru
8240: 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b  ct config *bcfp;
8250: 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65   /* For the inne
8260: 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67  r loop on config
8270: 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70   closure of "stp
8280: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  " */.  struct co
8290: 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f  nfig *newcfg;  /
82a0: 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  * */.  struct sy
82b0: 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53  mbol *sp;   /* S
82c0: 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20  ymbol following 
82d0: 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69  the dot in confi
82e0: 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a  guration "cfp" *
82f0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
8300: 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62  l *bsp;  /* Symb
8310: 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ol following the
8320: 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72   dot in configur
8330: 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a  ation "bcfp" */.
8340: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
8350: 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69  newstp; /* A poi
8360: 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73  nter to a succes
8370: 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20  sor state */..  
8380: 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72  /* Each configur
8390: 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f  ation becomes co
83a0: 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20  mplete after it 
83b0: 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20  contibutes to a 
83c0: 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73  successor.  ** s
83d0: 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79  tate.  Initially
83e0: 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  , all configurat
83f0: 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c  ions are incompl
8400: 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70  ete */.  for(cfp
8410: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
8420: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63  cfp=cfp->next) c
8430: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
8440: 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c  OMPLETE;..  /* L
8450: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
8460: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f  configurations o
8470: 66 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  f the state "stp
8480: 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73  " */.  for(cfp=s
8490: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
84a0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
84b0: 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75    if( cfp->statu
84c0: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
84d0: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
84e0: 72 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e  ready used by in
84f0: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ner loop */.    
8500: 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66  if( cfp->dot>=cf
8510: 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  p->rp->nrhs ) co
8520: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27  ntinue;  /* Can'
8530: 74 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e  t shift this con
8540: 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  fig */.    Confi
8550: 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20  glist_reset();  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
8580: 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20   new config set 
8590: 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d  */.    sp = cfp-
85a0: 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f  >rp->rhs[cfp->do
85b0: 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t];             
85c0: 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20  /* Symbol after 
85d0: 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20  the dot */..    
85e0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e  /* For every con
85f0: 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68  figuration in th
8600: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
8610: 69 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62  ich has the symb
8620: 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66  ol "sp".    ** f
8630: 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74  ollowing its dot
8640: 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63  , add the same c
8650: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
8660: 74 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e  the basis set un
8670: 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  der.    ** const
8680: 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68  ruction but with
8690: 20 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64   the dot shifted
86a0: 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74   one symbol to t
86b0: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
86c0: 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62   for(bcfp=cfp; b
86d0: 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e  cfp; bcfp=bcfp->
86e0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
86f0: 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43   bcfp->status==C
8700: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
8710: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
8720: 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  y used */.      
8730: 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62  if( bcfp->dot>=b
8740: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20  cfp->rp->nrhs ) 
8750: 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e  continue; /* Can
8760: 27 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e  't shift this on
8770: 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d  e */.      bsp =
8780: 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62   bcfp->rp->rhs[b
8790: 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20  cfp->dot];      
87a0: 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62       /* Get symb
87b0: 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a  ol after dot */.
87c0: 20 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f        if( !same_
87d0: 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29  symbol(bsp,sp) )
87e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20   continue;      
87f0: 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20  /* Must be same 
8800: 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a  as for "cfp" */.
8810: 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74        bcfp->stat
8820: 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20  us = COMPLETE;  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e  /* Mark this con
8850: 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20  fig as used */. 
8860: 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43 6f       newcfg = Co
8870: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
8880: 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d  s(bcfp->rp,bcfp-
8890: 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50  >dot+1);.      P
88a0: 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66 67  link_add(&newcfg
88b0: 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20  ->bplp,bcfp);.  
88c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
88d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
88e0: 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64   state described
88f0: 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f   by the basis co
8900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a  nfiguration set.
8910: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
8920: 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64  ed in the preced
8930: 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ing loop */.    
8940: 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74  newstp = getstat
8950: 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a  e(lemp);..    /*
8960: 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73   The state "news
8970: 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66  tp" is reached f
8980: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73  rom the state "s
8990: 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61  tp" by a shift a
89a0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20  ction.    ** on 
89b0: 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20  the symbol "sp" 
89c0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  */.    if( sp->t
89d0: 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
89e0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AL ){.      int 
89f0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
8a00: 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; i<sp->nsubsym;
8a10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41   i++){.        A
8a20: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
8a30: 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62  ap,SHIFT,sp->sub
8a40: 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65  sym[i],(char*)ne
8a50: 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wstp);.      }. 
8a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a70: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
8a80: 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68  >ap,SHIFT,sp,(ch
8a90: 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20  ar *)newstp);.  
8aa0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8ab0: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70   Construct the p
8ac0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
8ad0: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  .*/.void FindLin
8ae0: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ks(struct lemon 
8af0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
8b00: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
8b10: 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a  g *cfp, *other;.
8b20: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
8b30: 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  stp;.  struct pl
8b40: 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20  ink *plp;..  /* 
8b50: 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74  Housekeeping det
8b60: 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f  ail:.  ** Add to
8b70: 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65   every propagate
8b80: 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20   link a pointer 
8b90: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74  back to the stat
8ba0: 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20  e to.  ** which 
8bb0: 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61  the link is atta
8bc0: 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ched. */.  for(i
8bd0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8be0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
8bf0: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
8c00: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
8c10: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
8c20: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
8c30: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d        cfp->stp =
8c40: 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   stp;.    }.  }.
8c50: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c  .  /* Convert al
8c60: 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f  l backlinks into
8c70: 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20   forward links. 
8c80: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72   Only the forwar
8c90: 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65  d.  ** links are
8ca0: 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c   used in the fol
8cb0: 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74  low-set computat
8cc0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
8cd0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8ce0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
8cf0: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8d00: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
8d10: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
8d20: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
8d30: 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70       for(plp=cfp
8d40: 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70  ->bplp; plp; plp
8d50: 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =plp->next){.   
8d60: 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70       other = plp
8d70: 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50  ->cfp;.        P
8d80: 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d  link_add(&other-
8d90: 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20  >fplp,cfp);.    
8da0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
8db0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
8dc0: 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a  followsets..**.*
8dd0: 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73  * A followset is
8de0: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
8df0: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
8e00: 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65  n come immediate
8e10: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f  ly.** after a co
8e20: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  nfiguration..*/.
8e30: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
8e40: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
8e50: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
8e60: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
8e70: 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
8e80: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20  t plink *plp;.  
8e90: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20  int progress;.  
8ea0: 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66  int change;..  f
8eb0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
8ec0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
8ed0: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
8ee0: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
8ef0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
8f00: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
8f10: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
8f20: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ETE;.    }.  }. 
8f30: 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67   .  do{.    prog
8f40: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
8f50: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
8f60: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
8f70: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
8f80: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
8f90: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
8fa0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
8fb0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
8fc0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
8fd0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
8fe0: 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70  plp=cfp->fplp; p
8ff0: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
9000: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  t){.          ch
9010: 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28  ange = SetUnion(
9020: 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66  plp->cfp->fws,cf
9030: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20  p->fws);.       
9040: 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b     if( change ){
9050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70  .            plp
9060: 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20  ->cfp->status = 
9070: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
9080: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
9090: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
90a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
90b0: 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20      cfp->status 
90c0: 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  = COMPLETE;.    
90d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
90e0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
90f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  }..static int re
9100: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73  solve_conflict(s
9110: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73  truct action *,s
9120: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
9130: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  ../* Compute the
9140: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c   reduce actions,
9150: 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e   and resolve con
9160: 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  flicts..*/.void 
9170: 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75  FindActions(stru
9180: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
9190: 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73  {.  int i,j;.  s
91a0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
91b0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
91c0: 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
91d0: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
91e0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
91f0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66  .  /* Add all of
9200: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
9210: 6f 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75  ons .  ** A redu
9220: 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64  ce action is add
9230: 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d  ed for each elem
9240: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ent of the follo
9250: 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63  wset of.  ** a c
9260: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69  onfiguration whi
9270: 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61  ch has its dot a
9280: 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  t the extreme ri
9290: 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ght..  */.  for(
92a0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
92b0: 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20  ate; i++){   /* 
92c0: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74  Loop over all st
92d0: 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20  ates */.    stp 
92e0: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
92f0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
9300: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
9310: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f  p=cfp->next){  /
9320: 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
9330: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
9340: 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d  /.      if( cfp-
9350: 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e  >rp->nrhs==cfp->
9360: 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a  dot ){        /*
9370: 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65   Is dot at extre
9380: 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20  me right? */.   
9390: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
93a0: 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
93b0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
93c0: 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70   if( SetFind(cfp
93d0: 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20  ->fws,j) ){.    
93e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
93f0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74   reduce action t
9400: 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  o the state "stp
9410: 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64  " which will red
9420: 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20  uce by the.     
9430: 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22         ** rule "
9440: 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20  cfp->rp" if the 
9450: 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c  lookahead symbol
9460: 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f   is "lemp->symbo
9470: 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20  ls[j]" */.      
9480: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
9490: 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45  (&stp->ap,REDUCE
94a0: 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  ,lemp->symbols[j
94b0: 5d 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72  ],(char *)cfp->r
94c0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
94d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
94e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
94f0: 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74  * Add the accept
9500: 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ing token */.  i
9510: 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29  f( lemp->start )
9520: 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f  {.    sp = Symbo
9530: 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61  l_find(lemp->sta
9540: 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  rt);.    if( sp=
9550: 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) sp = lemp->
9560: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c  rule->lhs;.  }el
9570: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
9580: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
9590: 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  }.  /* Add to th
95a0: 65 20 66 69 72 73 74 20 73 74 61 74 65 20 28 77  e first state (w
95b0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 74  hich is always t
95c0: 68 65 20 73 74 61 72 74 69 6e 67 20 73 74 61 74  he starting stat
95d0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  e of the.  ** fi
95e0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
95f0: 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f  ne) an action to
9600: 20 41 43 43 45 50 54 20 69 66 20 74 68 65 20 6c   ACCEPT if the l
9610: 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a  ookahead is the.
9620: 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65    ** start nonte
9630: 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63  rminal.  */.  Ac
9640: 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e  tion_add(&lemp->
9650: 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43  sorted[0]->ap,AC
9660: 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f  CEPT,sp,0);..  /
9670: 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69  * Resolve confli
9680: 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  cts */.  for(i=0
9690: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
96a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
96b0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a  ct action *ap, *
96c0: 6e 61 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  nap;.    stp = l
96d0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
96e0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73      /* assert( s
96f0: 74 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20  tp->ap ); */.   
9700: 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f   stp->ap = Actio
9710: 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b  n_sort(stp->ap);
9720: 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
9730: 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e  >ap; ap && ap->n
9740: 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74  ext; ap=ap->next
9750: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70  ){.      for(nap
9760: 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26  =ap->next; nap &
9770: 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73  & nap->sp==ap->s
9780: 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74  p; nap=nap->next
9790: 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ){.         /* T
97a0: 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22  he two actions "
97b0: 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61  ap" and "nap" ha
97c0: 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b  ve the same look
97d0: 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20  ahead..         
97e0: 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  ** Figure out wh
97f0: 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62  ich one should b
9800: 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  e used */.      
9810: 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69     lemp->nconfli
9820: 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f  ct += resolve_co
9830: 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b 0a  nflict(ap,nap);.
9840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9850: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61  }..  /* Report a
9860: 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68  n error for each
9870: 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e   rule that can n
9880: 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e  ever be reduced.
9890: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
98a0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
98b0: 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61  rp->next) rp->ca
98c0: 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  nReduce = LEMON_
98d0: 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30  FALSE;.  for(i=0
98e0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
98f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
9900: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
9910: 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e     for(ap=lemp->
9920: 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61  sorted[i]->ap; a
9930: 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
9940: 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
9950: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70  ype==REDUCE ) ap
9960: 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63  ->x.rp->canReduc
9970: 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a  e = LEMON_TRUE;.
9980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9990: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
99a0: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
99b0: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61 6e  .    if( rp->can
99c0: 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e 75  Reduce ) continu
99d0: 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  e;.    ErrorMsg(
99e0: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
99f0: 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69  p->ruleline,"Thi
9a00: 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62  s rule can not b
9a10: 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a  e reduced.\n");.
9a20: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
9a30: 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  nt++;.  }.}../* 
9a40: 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69  Resolve a confli
9a50: 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ct between the t
9a60: 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e 73  wo given actions
9a70: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e  .  If the.** con
9a80: 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20 72  flict can't be r
9a90: 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e 20  esolved, return 
9aa0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
9ab0: 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a  NO LONGER TRUE:.
9ac0: 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65 20  **   To resolve 
9ad0: 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73  a conflict, firs
9ae0: 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  t look to see if
9af0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a   either action.*
9b00: 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72 72  *   is on an err
9b10: 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68 61  or rule.  In tha
9b20: 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68 65  t case, take the
9b30: 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a   action which.**
9b40: 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63 69     is not associ
9b50: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65 72  ated with the er
9b60: 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e 65  ror rule.  If ne
9b70: 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a  ither or both.**
9b80: 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20 61     actions are a
9b90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
9ba0: 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74 68  n error rule, th
9bb0: 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75  en try to.**   u
9bc0: 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f  se precedence to
9bd0: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e   resolve the con
9be0: 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  flict..**.** If 
9bf0: 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69 73  either action is
9c00: 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20 69   a SHIFT, then i
9c10: 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20 20  t must be apx.  
9c20: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
9c30: 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20 61   won't work if a
9c40: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
9c50: 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d   and apy->type==
9c60: 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  SHIFT..*/.static
9c70: 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e   int resolve_con
9c80: 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74 20  flict(.  struct 
9c90: 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20 73  action *apx,.  s
9ca0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
9cb0: 79 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79  y.){.  struct sy
9cc0: 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b  mbol *spx, *spy;
9cd0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
9ce0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78  0;.  assert( apx
9cf0: 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b  ->sp==apy->sp );
9d00: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74    /* Otherwise t
9d10: 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f  here would be no
9d20: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
9d30: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48  f( apx->type==SH
9d40: 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65  IFT && apy->type
9d50: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61  ==SHIFT ){.    a
9d60: 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e  py->type = SSCON
9d70: 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e  FLICT;.    errcn
9d80: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  t++;.  }.  if( a
9d90: 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  px->type==SHIFT 
9da0: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
9db0: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
9dc0: 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73  = apx->sp;.    s
9dd0: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
9de0: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
9df0: 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e   spy==0 || spx->
9e00: 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70  prec<0 || spy->p
9e10: 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  rec<0 ){.      /
9e20: 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65  * Not enough pre
9e30: 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  cedence informat
9e40: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70  ion. */.      ap
9e50: 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46  y->type = SRCONF
9e60: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
9e70: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
9e80: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
9e90: 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a  y->prec ){    /*
9ea0: 20 68 69 67 68 65 72 20 70 72 65 63 65 64 65 6e   higher preceden
9eb0: 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20  ce wins */.     
9ec0: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
9ed0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
9ee0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
9ef0: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
9f00: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9f10: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
9f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
9f30: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
9f40: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
9f50: 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20  RIGHT ){ /* Use 
9f60: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9f70: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
9f80: 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20  _RESOLVED;      
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69         /* associ
9fb0: 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d  ativity */.    }
9fc0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9fd0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
9fe0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46   spx->assoc==LEF
9ff0: 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61  T ){  /* to brea
a000: 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61  k tie */.      a
a010: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
a020: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
a030: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
a040: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
a050: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
a060: 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20  soc==NONE );.   
a070: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 45     apx->type = E
a080: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  RROR;.    }.  }e
a090: 6c 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70  lse if( apx->typ
a0a0: 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 79  e==REDUCE && apy
a0b0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
a0c0: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
a0d0: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
a0e0: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
a0f0: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
a100: 20 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20    if( spx==0 || 
a110: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
a120: 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79  rec<0 ||.    spy
a130: 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d  ->prec<0 || spx-
a140: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
a150: 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ){.      apy->t
a160: 79 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54  ype = RRCONFLICT
a170: 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b  ;.      errcnt++
a180: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a190: 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70  spx->prec>spy->p
a1a0: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79  rec ){.      apy
a1b0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
a1c0: 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LVED;.    }else 
a1d0: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70  if( spx->prec<sp
a1e0: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
a1f0: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apx->type = RD_
a200: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a  RESOLVED;.    }.
a210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
a220: 65 72 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d  ert( .      apx-
a230: 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56  >type==SH_RESOLV
a240: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d  ED ||.      apx-
a250: 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56  >type==RD_RESOLV
a260: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d  ED ||.      apx-
a270: 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43  >type==SSCONFLIC
a280: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  T ||.      apx->
a290: 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54  type==SRCONFLICT
a2a0: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
a2b0: 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20  ype==RRCONFLICT 
a2c0: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a2d0: 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20  pe==SH_RESOLVED 
a2e0: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a2f0: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
a300: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a310: 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c  pe==SSCONFLICT |
a320: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a330: 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==SRCONFLICT ||
a340: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a350: 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20  ==RRCONFLICT.   
a360: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52   );.    /* The R
a370: 45 44 55 43 45 2f 53 48 49 46 54 20 63 61 73 65  EDUCE/SHIFT case
a380: 20 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62   cannot happen b
a390: 65 63 61 75 73 65 20 53 48 49 46 54 73 20 63 6f  ecause SHIFTs co
a3a0: 6d 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  me before.    **
a3b0: 20 52 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20   REDUCEs on the 
a3c0: 6c 69 73 74 2e 20 20 49 66 20 77 65 20 72 65 61  list.  If we rea
a3d0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
a3e0: 20 6d 75 73 74 20 62 65 20 62 65 63 61 75 73 65   must be because
a3f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73  .    ** the pars
a400: 65 72 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20  er conflict had 
a410: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 73  already been res
a420: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20  olved. */.  }.  
a430: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
a440: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a450: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
a460: 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73   file "configlis
a470: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
a480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
a490: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
a4a0: 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63  o processing a c
a4b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a4c0: 74 20 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61  t and building a
a4d0: 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65   state.** in the
a4e0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
a4f0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61  nerator..*/..sta
a500: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
a510: 67 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  g *freelist = 0;
a520: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a530: 20 66 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74   free configurat
a540: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
a550: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75  truct config *cu
a560: 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  rrent = 0;      
a570: 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20   /* Top of list 
a580: 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  of configuration
a590: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
a5a0: 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72  ct config **curr
a5b0: 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a  entend = 0;   /*
a5c0: 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66   Last on list of
a5d0: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
a5e0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
a5f0: 20 2a 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20   *basis = 0;    
a600: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
a610: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
a620: 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  figs */.static s
a630: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62  truct config **b
a640: 61 73 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20  asisend = 0;    
a650: 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20   /* End of list 
a660: 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73  of basis configs
a670: 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61   */../* Return a
a680: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   pointer to a ne
a690: 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  w configuration 
a6a0: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
a6b0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e  t config *newcon
a6c0: 66 69 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20  fig(){.  struct 
a6d0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a  config *newcfg;.
a6e0: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
a6f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
a700: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b      int amt = 3;
a710: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
a720: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
a730: 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69  )calloc( amt, si
a740: 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66  zeof(struct conf
a750: 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66  ig) );.    if( f
a760: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
a770: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
a780: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
a790: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
a7a0: 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  r a new configur
a7b0: 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ation.");.      
a7c0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
a7d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
a7e0: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
a7f0: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
a800: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
a810: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
a820: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
a830: 20 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69   newcfg = freeli
a840: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
a850: 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b   freelist->next;
a860: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67  .  return newcfg
a870: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66  ;.}../* The conf
a880: 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20  iguration "old" 
a890: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  is no longer use
a8a0: 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  d */.PRIVATE voi
a8b0: 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73  d deleteconfig(s
a8c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
a8d0: 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74  d).{.  old->next
a8e0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
a8f0: 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d  reelist = old;.}
a900: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
a910: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
a920: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
a930: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
a940: 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72  st_init(){.  cur
a950: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
a960: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
a970: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
a980: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
a990: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
a9a0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
a9b0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
a9c0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
a9d0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
a9e0: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
a9f0: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29  nfiglist_reset()
aa00: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
aa10: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
aa20: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
aa30: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
aa40: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
aa50: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
aa60: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
aa70: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
aa80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
aa90: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
aaa0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
aab0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
aac0: 6c 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75  list_add(.  stru
aad0: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20  ct rule *rp,    
aae0: 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20  /* The rule */. 
aaf0: 20 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20   int dot        
ab00: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
ab10: 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  to the RHS of th
ab20: 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65  e rule where the
ab30: 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a   dot goes */.){.
ab40: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
ab50: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
ab60: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
ab70: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
ab80: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
ab90: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
aba0: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
abb0: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
abc0: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
abd0: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
abe0: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
abf0: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
ac00: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
ac10: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
ac20: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
ac30: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
ac40: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
ac50: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
ac60: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
ac70: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
ac80: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
ac90: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
aca0: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
acb0: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
acc0: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
acd0: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
ace0: 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63  /* Add a basis c
acf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
ad00: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
ad10: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
ad20: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
ad30: 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72  ist_addbasis(str
ad40: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e  uct rule *rp, in
ad50: 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63  t dot).{.  struc
ad60: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d  t config *cfp, m
ad70: 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  odel;..  assert(
ad80: 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a   basisend!=0 );.
ad90: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
ada0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
adb0: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
adc0: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
add0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
ade0: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
adf0: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
ae00: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
ae10: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
ae20: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
ae30: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
ae40: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
ae50: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
ae60: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
ae70: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
ae80: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
ae90: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
aea0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
aeb0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
aec0: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
aed0: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
aee0: 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20      *basisend = 
aef0: 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e  cfp;.    basisen
af00: 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20  d = &cfp->bp;.  
af10: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
af20: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
af30: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
af40: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
af50: 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f  losure of the co
af60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
af70: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
af80: 69 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75  ist_closure(stru
af90: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
afa0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
afb0: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
afc0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
afd0: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
afe0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
aff0: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
b000: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
b010: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b020: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
b030: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
b040: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
b050: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
b060: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
b070: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
b080: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
b090: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
b0a0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
b0b0: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
b0c0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
b0d0: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
b0e0: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
b0f0: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
b100: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
b110: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
b120: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
b130: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
b140: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
b150: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
b160: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
b170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b180: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
b190: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
b1a0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
b1b0: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
b1c0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
b1d0: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
b1e0: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
b1f0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
b200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
b210: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
b220: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
b230: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
b240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b250: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
b260: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
b270: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b280: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
b290: 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65  se if( xsp->type
b2a0: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
b2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
b2c0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
b2d0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70    for(k=0; k<xsp
b2e0: 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
b300: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
b310: 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b  s, xsp->subsym[k
b320: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
b330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b350: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b360: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
b370: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
b380: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
b390: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
b3a0: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
b3b0: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
b3c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
b3e0: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
b3f0: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
b400: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
b410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b420: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
b430: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
b440: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
b450: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
b460: 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  ort(){.  current
b470: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
b480: 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a 29  g*)msort((char*)
b490: 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a 29  current,(char**)
b4a0: 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29  &(current->next)
b4b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a      Configcmp);.
b4e0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
b4f0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b500: 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73  * Sort the basis
b510: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
b520: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
b530: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
b540: 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73  (){.  basis = (s
b550: 74 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73  truct config*)ms
b560: 6f 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65  ort((char*)curre
b570: 6e 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72  nt,(char**)&(cur
b580: 72 65 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20  rent->bp),.     
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
b5b0: 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e  gcmp);.  basisen
b5c0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
b5d0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
b5e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
b5f0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
b600: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
b610: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
b620: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
b630: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
b640: 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72  _return(){.  str
b650: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
b660: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
b670: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
b680: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
b690: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
b6a0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
b6b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
b6c0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
b6d0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
b6e0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
b6f0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
b700: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
b710: 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75  _basis(){.  stru
b720: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
b730: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
b740: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
b750: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
b760: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
b770: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
b780: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
b790: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b7a0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
b7b0: 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20  list_eat(struct 
b7c0: 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
b7d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b7e0: 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b  nextcfp;.  for(;
b7f0: 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66   cfp; cfp=nextcf
b800: 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20  p){.    nextcfp 
b810: 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = cfp->next;.   
b820: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70   assert( cfp->fp
b830: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  lp==0 );.    ass
b840: 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d  ert( cfp->bplp==
b850: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70  0 );.    if( cfp
b860: 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28  ->fws ) SetFree(
b870: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64  cfp->fws);.    d
b880: 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29  eleteconfig(cfp)
b890: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
b8a0: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
b8b0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
b8c0: 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a  le "error.c" ***
b8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
b8f0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
b900: 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65  rinting error me
b910: 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20  ssage..*/..void 
b920: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
b930: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69  har *filename, i
b940: 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
b950: 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e   char *format, .
b960: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
b970: 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  p;.  fprintf(std
b980: 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20  err, "%s:%d: ", 
b990: 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f  filename, lineno
b9a0: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
b9b0: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70  , format);.  vfp
b9c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f 72  rintf(stderr,for
b9d0: 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mat,ap);.  va_en
b9e0: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
b9f0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
ba00: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
ba10: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ba20: 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a  e "main.c" *****
ba30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
ba50: 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67  ./*.** Main prog
ba60: 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ram file for the
ba70: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
ba80: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
ba90: 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66  Report an out-of
baa0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
bab0: 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68  n and abort.  Th
bac0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
bad0: 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79  s used mostly by
bae0: 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63   the "MemoryChec
baf0: 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75  k" macro in stru
bb00: 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ct.h.*/.void mem
bb10: 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20 66  ory_error(){.  f
bb20: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
bb30: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 41  ut of memory.  A
bb40: 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a  borting...\n");.
bb50: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74    exit(1);.}..st
bb60: 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e 65  atic int nDefine
bb70: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
bb80: 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69 6f  mber of -D optio
bb90: 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ns on the comman
bba0: 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69 63  d line */.static
bbb0: 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e 65   char **azDefine
bbc0: 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f   = 0;  /* Name o
bbd0: 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73 20  f the -D macros 
bbe0: 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74  */../* This rout
bbf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
bc00: 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  th the argument 
bc10: 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d 61  to each -D comma
bc20: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a  nd-line option..
bc30: 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72 6f  ** Add the macro
bc40: 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65 20   defined to the 
bc50: 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e 0a  azDefine array..
bc60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
bc70: 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28 63  andle_D_option(c
bc80: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
bc90: 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e 65  **paz;.  nDefine
bca0: 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20 3d  ++;.  azDefine =
bcb0: 20 28 63 68 61 72 20 2a 2a 29 20 72 65 61 6c 6c   (char **) reall
bcc0: 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a  oc(azDefine, siz
bcd0: 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29  eof(azDefine[0])
bce0: 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28  *nDefine);.  if(
bcf0: 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a   azDefine==0 ){.
bd00: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
bd10: 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"out of memor
bd20: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
bd30: 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20  1);.  }.  paz = 
bd40: 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e  &azDefine[nDefin
bd50: 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 28  e-1];.  *paz = (
bd60: 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20  char *) malloc( 
bd70: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31  lemonStrlen(z)+1
bd80: 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d   );.  if( *paz==
bd90: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
bda0: 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20  (stderr,"out of 
bdb0: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
bdc0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6c  exit(1);.  }.  l
bdd0: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 2a 70 61 7a  emon_strcpy(*paz
bde0: 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70  , z);.  for(z=*p
bdf0: 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d  az; *z && *z!='=
be00: 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d  '; z++){}.  *z =
be10: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68   0;.}..static ch
be20: 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c 61 74  ar *user_templat
be30: 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74  ename = NULL;.st
be40: 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65  atic void handle
be50: 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a  _T_option(char *
be60: 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d 70 6c  z){.  user_templ
be70: 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 20  atename = (char 
be80: 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  *) malloc( lemon
be90: 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20  Strlen(z)+1 );. 
bea0: 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70 6c 61   if( user_templa
beb0: 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  tename==0 ){.   
bec0: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
bed0: 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
bee0: 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  cpy(user_templat
bef0: 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a  ename, z);.}../*
bf00: 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   forward referen
bf10: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ce */.static con
bf20: 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d  st char *minimum
bf30: 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c  _size_type(int l
bf40: 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e 74  wr, int upr, int
bf50: 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20 50   *pnByte);../* P
bf60: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6c 69  rint a single li
bf70: 6e 65 20 6f 66 20 74 68 65 20 22 50 61 72 73 65  ne of the "Parse
bf80: 72 20 53 74 61 74 73 22 20 6f 75 74 70 75 74 0a  r Stats" output.
bf90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
bfa0: 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73 74 20  tats_line(const 
bfb0: 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 69 6e  char *zLabel, in
bfc0: 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74  t iValue){.  int
bfd0: 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e 53   nLabel = lemonS
bfe0: 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a 20  trlen(zLabel);. 
bff0: 20 70 72 69 6e 74 66 28 22 20 20 25 73 25 2e 2a   printf("  %s%.*
c000: 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62 65 6c  s %5d\n", zLabel
c010: 2c 0a 20 20 20 20 20 20 20 20 20 33 35 2d 6e 4c  ,.         35-nL
c020: 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e  abel, ".........
c030: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c040: 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20 20  .......",.      
c050: 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f     iValue);.}../
c060: 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  * The main progr
c070: 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63  am.  Parse the c
c080: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20  ommand line and 
c090: 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20  do it... */.int 
c0a0: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
c0b0: 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20  har **argv).{.  
c0c0: 73 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69  static int versi
c0d0: 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  on = 0;.  static
c0e0: 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b   int rpflag = 0;
c0f0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61  .  static int ba
c100: 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73  sisflag = 0;.  s
c110: 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65  tatic int compre
c120: 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ss = 0;.  static
c130: 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a   int quiet = 0;.
c140: 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61    static int sta
c150: 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73  tistics = 0;.  s
c160: 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67  tatic int mhflag
c170: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
c180: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
c190: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
c1a0: 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20 30 3b  nt noResort = 0;
c1b0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
c1c0: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
c1d0: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
c1e0: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
c1f0: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
c200: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
c210: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
c220: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
c230: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
c240: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
c250: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
c260: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
c270: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44     {OPT_FSTR, "D
c280: 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65  ", (char*)handle
c290: 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69  _D_option, "Defi
c2a0: 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63  ne an %ifdef mac
c2b0: 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ro."},.    {OPT_
c2c0: 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20 22 49  FSTR, "f", 0, "I
c2d0: 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68  gnored.  (Placeh
c2e0: 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63 6f 6d  older for -f com
c2f0: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22  piler options.)"
c300: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
c310: 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72  , "g", (char*)&r
c320: 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72  pflag, "Print gr
c330: 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63  ammar without ac
c340: 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f  tions."},.    {O
c350: 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20 30 2c  PT_FSTR, "I", 0,
c360: 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61   "Ignored.  (Pla
c370: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 49  ceholder for '-I
c380: 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  ' compiler optio
c390: 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ns.)"},.    {OPT
c3a0: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
c3b0: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
c3c0: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
c3d0: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
c3e0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
c3f0: 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a  LAG, "l", (char*
c400: 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c  )&nolinenosflag,
c410: 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23   "Do not print #
c420: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  line statements.
c430: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
c440: 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e 6f  R, "O", 0, "Igno
c450: 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64  red.  (Placehold
c460: 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d 70  er for '-O' comp
c470: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d  iler options.)"}
c480: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
c490: 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73 68   "p", (char*)&sh
c4a0: 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66  owPrecedenceConf
c4b0: 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  lict,.          
c4c0: 20 20 20 20 20 20 20 20 20 20 22 53 68 6f 77 20            "Show 
c4d0: 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c 76  conflicts resolv
c4e0: 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
c4f0: 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b 4f   rules"},.    {O
c500: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
c510: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
c520: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
c530: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
c540: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
c550: 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72 2a  LAG, "r", (char*
c560: 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f 20  )&noResort, "Do 
c570: 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e 75  not sort or renu
c580: 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a 20  mber states"},. 
c590: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73     {OPT_FLAG, "s
c5a0: 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 69  ", (char*)&stati
c5b0: 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20 20  stics,.         
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5d0: 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e 74            "Print
c5e0: 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f   parser stats to
c5f0: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
c600: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
c610: 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29  AG, "x", (char*)
c620: 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74  &version, "Print
c630: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
c640: 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ber."},.    {OPT
c650: 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61  _FSTR, "T", (cha
c660: 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69  r*)handle_T_opti
c670: 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20 74  on, "Specify a t
c680: 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c  emplate file."},
c690: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
c6a0: 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64  "W", 0, "Ignored
c6b0: 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20  .  (Placeholder 
c6c0: 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c 65  for '-W' compile
c6d0: 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20  r options.)"},. 
c6e0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30     {OPT_FLAG,0,0
c6f0: 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  ,0}.  };.  int i
c700: 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65  ;.  int exitcode
c710: 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ;.  struct lemon
c720: 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74   lem;..  OptInit
c730: 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74  (argv,options,st
c740: 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72  derr);.  if( ver
c750: 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69  sion ){.     pri
c760: 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69  ntf("Lemon versi
c770: 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20  on 1.0\n");.    
c780: 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20   exit(0); .  }. 
c790: 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21   if( OptNArgs()!
c7a0: 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =1 ){.    fprint
c7b0: 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c  f(stderr,"Exactl
c7c0: 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61  y one filename a
c7d0: 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69  rgument is requi
c7e0: 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  red.\n");.    ex
c7f0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  it(1);.  }.  mem
c800: 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a  set(&lem, 0, siz
c810: 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d  eof(lem));.  lem
c820: 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a  .errorcnt = 0;..
c830: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
c840: 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  the machine */. 
c850: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b   Strsafe_init();
c860: 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  .  Symbol_init()
c870: 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29  ;.  State_init()
c880: 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20  ;.  lem.argv0 = 
c890: 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66  argv[0];.  lem.f
c8a0: 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67  ilename = OptArg
c8b0: 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73  (0);.  lem.basis
c8c0: 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67  flag = basisflag
c8d0: 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f  ;.  lem.nolineno
c8e0: 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f  sflag = nolineno
c8f0: 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f  sflag;.  Symbol_
c900: 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e  new("$");.  lem.
c910: 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  errsym = Symbol_
c920: 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20  new("error");.  
c930: 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43  lem.errsym->useC
c940: 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61  nt = 0;..  /* Pa
c950: 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  rse the input fi
c960: 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c  le */.  Parse(&l
c970: 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65  em);.  if( lem.e
c980: 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c  rrorcnt ) exit(l
c990: 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20  em.errorcnt);.  
c9a0: 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30  if( lem.nrule==0
c9b0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
c9c0: 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72  stderr,"Empty gr
c9d0: 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20  ammar.\n");.    
c9e0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
c9f0: 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64  /* Count and ind
ca00: 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f  ex the symbols o
ca10: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
ca20: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b  .  Symbol_new("{
ca30: 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65  default}");.  le
ca40: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62  m.nsymbol = Symb
ca50: 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c 65  ol_count();.  le
ca60: 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62  m.symbols = Symb
ca70: 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20  ol_arrayof();.  
ca80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e  for(i=0; i<lem.n
ca90: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d  symbol; i++) lem
caa0: 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64  .symbols[i]->ind
cab0: 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28  ex = i;.  qsort(
cac0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e  lem.symbols,lem.
cad0: 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28 73  nsymbol,sizeof(s
cae0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 20  truct symbol*), 
caf0: 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66  Symbolcmpp);.  f
cb00: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73  or(i=0; i<lem.ns
cb10: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
cb20: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
cb30: 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28 20  x = i;.  while( 
cb40: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d  lem.symbols[i-1]
cb50: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
cb60: 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d 0a  MINAL ){ i--; }.
cb70: 20 20 61 73 73 65 72 74 28 20 73 74 72 63 6d 70    assert( strcmp
cb80: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31  (lem.symbols[i-1
cb90: 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75 6c  ]->name,"{defaul
cba0: 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65 6d  t}")==0 );.  lem
cbb0: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20 31  .nsymbol = i - 1
cbc0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75  ;.  for(i=1; isu
cbd0: 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  pper(lem.symbols
cbe0: 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69  [i]->name[0]); i
cbf0: 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d  ++);.  lem.nterm
cc00: 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20  inal = i;..  /* 
cc10: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69  Generate a repri
cc20: 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  nt of the gramma
cc30: 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  r, if requested 
cc40: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
cc50: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66  ine */.  if( rpf
cc60: 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69  lag ){.    Repri
cc70: 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73  nt(&lem);.  }els
cc80: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
cc90: 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f  lize the size fo
cca0: 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64  r all follow and
ccb0: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
ccc0: 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e     SetSize(lem.n
ccd0: 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20  terminal+1);..  
cce0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72    /* Find the pr
ccf0: 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65  ecedence for eve
cd00: 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ry production ru
cd10: 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65  le (that has one
cd20: 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c  ) */.    FindRul
cd30: 65 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65  ePrecedences(&le
cd40: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
cd50: 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e  ute the lambda-n
cd60: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  onterminals and 
cd70: 74 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66  the first-sets f
cd80: 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20  or every.    ** 
cd90: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20  nonterminal */. 
cda0: 20 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73     FindFirstSets
cdb0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
cdc0: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
cdd0: 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20  ) states.  Also 
cde0: 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65  record follow-se
cdf0: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20  t propagation.  
ce00: 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68    ** links so th
ce10: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  at the follow-se
ce20: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  t can be compute
ce30: 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c  d later */.    l
ce40: 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20  em.nstate = 0;. 
ce50: 20 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c     FindStates(&l
ce60: 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72  em);.    lem.sor
ce70: 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61  ted = State_arra
ce80: 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  yof();..    /* T
ce90: 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73  ie up loose ends
cea0: 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74   on the propagat
ceb0: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20  ion links */.   
cec0: 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29   FindLinks(&lem)
ced0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
cee0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74  e the follow set
cef0: 20 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69   of every reduci
cf00: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
cf10: 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c  n */.    FindFol
cf20: 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  lowSets(&lem);..
cf30: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
cf40: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
cf50: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69   */.    FindActi
cf60: 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ons(&lem);..    
cf70: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20  /* Compress the 
cf80: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
cf90: 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73  .    if( compres
cfa0: 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54  s==0 ) CompressT
cfb0: 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ables(&lem);..  
cfc0: 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64    /* Reorder and
cfd0: 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74   renumber the st
cfe0: 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
cff0: 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
d000: 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63  hoices.    ** oc
d010: 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
d020: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
d030: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65  mization that he
d040: 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  lps make the.   
d050: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61   ** generated pa
d060: 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c  rser tables smal
d070: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ler. */.    if( 
d080: 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65  noResort==0 ) Re
d090: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
d0a0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
d0b0: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
d0c0: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
d0d0: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
d0e0: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
d0f0: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
d100: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
d110: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
d120: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
d130: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
d140: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
d150: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
d160: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
d170: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
d180: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
d190: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
d1a0: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
d1b0: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
d1c0: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
d1d0: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
d1e0: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
d1f0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
d200: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
d210: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
d220: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
d230: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
d240: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
d250: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
d260: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c  ser statistics:\
d270: 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  n");.    stats_l
d280: 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79  ine("terminal sy
d290: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72  mbols", lem.nter
d2a0: 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74  minal);.    stat
d2b0: 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d  s_line("non-term
d2c0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  inal symbols", l
d2d0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
d2e0: 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20  .nterminal);.   
d2f0: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74   stats_line("tot
d300: 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d  al symbols", lem
d310: 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73  .nsymbol);.    s
d320: 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73  tats_line("rules
d330: 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  ", lem.nrule);. 
d340: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73     stats_line("s
d350: 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74  tates", lem.nxst
d360: 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  ate);.    stats_
d370: 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22  line("conflicts"
d380: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
d390: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
d3a0: 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65  ("action table e
d3b0: 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63  ntries", lem.nac
d3c0: 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74  tiontab);.    st
d3d0: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
d3e0: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
d3f0: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
d400: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
d410: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
d420: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
d430: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
d440: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
d450: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
d460: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
d470: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
d480: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
d490: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
d4a0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
d4b0: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
d4c0: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
d4d0: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
d4e0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
d4f0: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
d500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d510: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
d520: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
d530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
d550: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
d560: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
d570: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
d580: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
d590: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
d5a0: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
d5b0: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
d5c0: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
d5d0: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
d5e0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
d5f0: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
d600: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
d610: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
d620: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
d630: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
d640: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
d650: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
d660: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
d670: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
d680: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
d690: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
d6a0: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
d6b0: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
d6c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
d6d0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
d6e0: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
d6f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
d700: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
d710: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
d720: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
d730: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
d740: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
d750: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
d760: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
d770: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
d780: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
d790: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
d7a0: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
d7b0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
d7c0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
d7d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
d7e0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
d7f0: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
d800: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
d810: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
d820: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
d830: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
d840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
d850: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d860: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
d870: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
d880: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
d890: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
d8a0: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
d8b0: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
d8c0: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
d8d0: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
d8e0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
d8f0: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
d900: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
d910: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
d920: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
d930: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
d940: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
d950: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
d960: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
d970: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
d980: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
d990: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
d9a0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
d9b0: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
d9c0: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
d9d0: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
d9e0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
d9f0: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
da00: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
da10: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
da20: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
da30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
da40: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
da50: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
da60: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
da70: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
da80: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
da90: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
daa0: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
dab0: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
dac0: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
dad0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
dae0: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
daf0: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
db00: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
db10: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
db20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
db30: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
db40: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
db50: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
db60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
db70: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
db80: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
db90: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
dba0: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
dbb0: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
dbc0: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
dbd0: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
dbe0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
dbf0: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
dc00: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
dc10: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
dc20: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
dc30: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
dc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
dc50: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
dc60: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
dc70: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
dc80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dc90: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
dca0: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
dcb0: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
dcc0: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
dcd0: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
dce0: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
dcf0: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
dd00: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
dd10: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
dd20: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
dd30: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
dd40: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
dd50: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
dd60: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
dd70: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
dd80: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
dd90: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
dda0: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
ddb0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
ddc0: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
ddd0: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
dde0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
ddf0: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
de00: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
de10: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
de20: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
de30: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
de40: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
de50: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
de60: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
de70: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
de80: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
de90: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
dea0: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
deb0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
dec0: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
ded0: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
dee0: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
def0: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
df00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
df10: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
df20: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
df30: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
df40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
df50: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
df60: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
df70: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
df80: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
df90: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
dfa0: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
dfb0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
dfc0: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
dfd0: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
dfe0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
dff0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
e000: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
e010: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
e020: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
e030: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
e040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
e050: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
e060: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
e070: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
e080: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
e090: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
e0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0b0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
e0c0: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
e0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0e0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
e0f0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
e100: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
e110: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
e120: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
e130: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
e140: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
e150: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
e160: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
e170: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
e180: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
e190: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
e1a0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
e1b0: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
e1c0: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
e1d0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
e1e0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
e1f0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
e200: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
e210: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
e220: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
e230: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
e240: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
e250: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
e260: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
e270: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
e280: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
e290: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
e2a0: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
e2b0: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
e2c0: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
e2d0: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
e2e0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
e2f0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
e300: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
e310: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
e320: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
e330: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
e340: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
e350: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
e360: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
e370: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
e380: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
e390: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
e3a0: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
e3b0: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
e3c0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
e3d0: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
e3e0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
e3f0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
e400: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
e410: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
e420: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
e430: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
e440: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
e450: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
e460: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
e470: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
e480: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e490: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
e4a0: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
e4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e4c0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
e4d0: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
e4e0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
e4f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
e500: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
e510: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
e520: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
e530: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
e540: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
e550: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
e560: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
e570: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
e580: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
e590: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
e5a0: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
e5b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
e5c0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
e5d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
e5e0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
e5f0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
e600: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
e610: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
e620: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
e630: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
e640: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
e650: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
e660: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e670: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e680: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
e690: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
e6a0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
e6b0: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
e6c0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
e6d0: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
e6e0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
e6f0: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
e700: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
e710: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
e720: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
e730: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
e740: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
e750: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
e760: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
e770: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
e780: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
e790: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
e7a0: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
e7b0: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
e7c0: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
e7d0: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
e7e0: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
e7f0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
e800: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
e810: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
e820: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
e830: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
e840: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
e850: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
e860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
e870: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
e880: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
e890: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
e8a0: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
e8b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
e8c0: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
e8d0: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
e8e0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
e8f0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
e900: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
e910: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
e920: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
e930: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
e940: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
e950: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
e960: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
e970: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
e980: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
e990: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
e9a0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
e9b0: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
e9c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
e9d0: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
e9e0: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
e9f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
ea00: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ea10: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
ea20: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
ea30: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
ea40: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
ea50: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
ea60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
ea70: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
ea80: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
ea90: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
eaa0: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
eab0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
eac0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
ead0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
eae0: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
eaf0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
eb00: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
eb10: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
eb20: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
eb30: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
eb40: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
eb50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
eb60: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
eb70: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
eb80: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
eb90: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
eba0: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
ebb0: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
ebc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
ebd0: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
ebe0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
ebf0: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
ec00: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
ec10: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
ec20: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
ec30: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
ec40: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
ec50: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ec70: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
ec80: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
ec90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eca0: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
ecb0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
ecc0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
ecd0: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
ece0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
ecf0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
ed00: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
ed10: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
ed20: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
ed30: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
ed40: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
ed50: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
ed60: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
ed70: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
ed80: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
ed90: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
eda0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
edb0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
edc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
edd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
ede0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
edf0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
ee00: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
ee10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ee20: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
ee30: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
ee40: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
ee50: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
ee60: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
ee70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ee80: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
ee90: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
eea0: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
eeb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
eec0: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
eed0: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
eee0: 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
eef0: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
ef00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ef10: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
ef20: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
ef30: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
ef40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef50: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
ef60: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
ef70: 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
ef80: 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
ef90: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
efa0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
efb0: 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
efc0: 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
efd0: 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
efe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
eff0: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
f000: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
f010: 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
f020: 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
f030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
f050: 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
f060: 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
f070: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
f080: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
f090: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
f0a0: 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
f0b0: 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
f0c0: 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
f0d0: 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
f0e0: 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
f0f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
f100: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
f110: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
f120: 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
f130: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
f140: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
f150: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
f160: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
f170: 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
f180: 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
f190: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
f1a0: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
f1b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f1c0: 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
f1d0: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
f1e0: 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
f1f0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
f200: 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
f210: 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
f220: 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
f230: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
f240: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
f250: 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20  tNArgs(){.  int 
f260: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64  cnt = 0;.  int d
f270: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
f280: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  nt i;.  if( argv
f290: 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d  !=0 && argv[0]!=
f2a0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 ){.    for(i=1
f2b0: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  ; argv[i]; i++){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64  .      if( dashd
f2d0: 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72  ash || !ISOPT(ar
f2e0: 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a  gv[i]) ) cnt++;.
f2f0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
f300: 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d  (argv[i],"--")==
f310: 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31  0 ) dashdash = 1
f320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f330: 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61  turn cnt;.}..cha
f340: 72 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29  r *OptArg(int n)
f350: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
f360: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
f370: 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61   return i>=0 ? a
f380: 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76  rgv[i] : 0;.}..v
f390: 6f 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e  oid OptErr(int n
f3a0: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
f3b0: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
f3c0: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72    if( i>=0 ) err
f3d0: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65  line(i,0,errstre
f3e0: 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  am);.}..void Opt
f3f0: 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69  Print(){.  int i
f400: 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e  ;.  int max, len
f410: 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66  ;.  max = 0;.  f
f420: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
f430: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bel; i++){.    l
f440: 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
f450: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20  (op[i].label) + 
f460: 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  1;.    switch( o
f470: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
f480: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
f490: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
f4a0: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
f4b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f4c0: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
f4d0: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
f4e0: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39          len += 9
f4f0: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
f500: 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22  h of "<integer>"
f510: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
f520: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f530: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
f540: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
f550: 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20      len += 6;   
f560: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
f570: 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20   "<real>" */.   
f580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f590: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
f5a0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
f5b0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  STR:.        len
f5c0: 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20   += 8;       /* 
f5d0: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69  length of "<stri
f5e0: 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng>" */.        
f5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f600: 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d   if( len>max ) m
f610: 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  ax = len;.  }.  
f620: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
f630: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
f640: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
f650: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
f660: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
f670: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
f680: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
f690: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
f6a0: 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f  -*s  %s\n",max,o
f6b0: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d  p[i].label,op[i]
f6c0: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
f6d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f6e0: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
f6f0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
f700: 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  T:.        fprin
f710: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
f720: 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20  -%s<integer>%*s 
f730: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
f740: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  el,.          (i
f750: 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72  nt)(max-lemonStr
f760: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
f770: 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -9),"",op[i].mes
f780: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
f790: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f7a0: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
f7b0: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
f7c0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
f7d0: 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c  rrstream,"  -%s<
f7e0: 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  real>%*s  %s\n",
f7f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
f800: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
f810: 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  -lemonStrlen(op[
f820: 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c  i].label)-6),"",
f830: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
f840: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f850: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
f860: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
f870: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
f880: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
f890: 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e  m,"  -%s<string>
f8a0: 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
f8b0: 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
f8c0: 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f    (int)(max-lemo
f8d0: 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  nStrlen(op[i].la
f8e0: 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-8),"",op[i]
f8f0: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
f900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f910: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
f920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
f930: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
f940: 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.c" *********
f950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f960: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  ***/./*.** Input
f970: 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72   file parser for
f980: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
f990: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
f9a0: 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  ./* The state of
f9b0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65   the parser */.e
f9c0: 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20  num e_state {.  
f9d0: 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41  INITIALIZE,.  WA
f9e0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
f9f0: 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e  R_RULE,.  WAITIN
fa00: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
fa10: 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RD,.  WAITING_FO
fa20: 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41  R_DECL_ARG,.  WA
fa30: 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
fa40: 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  ENCE_SYMBOL,.  W
fa50: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
fa60: 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48  ,.  IN_RHS,.  LH
fa70: 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53  S_ALIAS_1,.  LHS
fa80: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f  _ALIAS_2,.  LHS_
fa90: 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41  ALIAS_3,.  RHS_A
faa0: 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_1,.  RHS_AL
fab0: 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45  IAS_2,.  PRECEDE
fac0: 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52  NCE_MARK_1,.  PR
fad0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
fae0: 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  .  RESYNC_AFTER_
faf0: 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45  RULE_ERROR,.  RE
fb00: 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
fb10: 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47  ERROR,.  WAITING
fb20: 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
fb30: 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e  SYMBOL,.  WAITIN
fb40: 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
fb50: 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
fb60: 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
fb70: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
fb80: 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57  WILDCARD_ID,.  W
fb90: 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
fba0: 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
fbb0: 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d  OR_CLASS_TOKEN.}
fbc0: 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20  ;.struct pstate 
fbd0: 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  {.  char *filena
fbe0: 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
fbf0: 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
fc00: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b  ile */.  int tok
fc10: 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f  enlineno;      /
fc20: 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20  * Linenumber at 
fc30: 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f  which current to
fc40: 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20  ken starts */.  
fc50: 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20  int errorcnt;   
fc60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fc70: 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72  of errors so far
fc80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
fc90: 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54  nstart;     /* T
fca0: 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ext of current t
fcb0: 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  oken */.  struct
fcc0: 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20   lemon *gp;     
fcd0: 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20  /* Global state 
fce0: 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d  vector */.  enum
fcf0: 20 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20   e_state state; 
fd00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
fd10: 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ate of the parse
fd20: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  r */.  struct sy
fd30: 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
fd40: 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63    /* The fallbac
fd50: 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72  k token */.  str
fd60: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c  uct symbol *tkcl
fd70: 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ass;    /* Token
fd80: 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f   class symbol */
fd90: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
fda0: 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a   *lhs;        /*
fdb0: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
fdc0: 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20  of current rule 
fdd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fde0: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20  *lhsalias;      
fdf0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
fe00: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72   LHS */.  int nr
fe10: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
fe20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fe30: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  f right-hand sid
fe40: 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a  e symbols seen *
fe50: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
fe60: 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20  l *rhs[MAXRHS]; 
fe70: 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   /* RHS symbols 
fe80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fe90: 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20  *alias[MAXRHS]; 
fea0: 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65  /* Aliases for e
feb0: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
fec0: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74  or NULL) */.  st
fed0: 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72  ruct rule *prevr
fee0: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76  ule;     /* Prev
fef0: 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64  ious rule parsed
ff00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ff10: 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20   *declkeyword;  
ff20: 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61   /* Keyword of a
ff30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
ff40: 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67    char **declarg
ff50: 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  slot;        /* 
ff60: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
ff70: 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73  ation argument s
ff80: 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a  hould be put */.
ff90: 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65    int insertLine
ffa0: 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20  Macro;       /* 
ffb0: 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65  Add #line before
ffc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73   declaration ins
ffd0: 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65  ert */.  int *de
ffe0: 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20  cllinenoslot;   
fff0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
10000 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f  write declaratio
10010 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  n line number */
10020 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
10030 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a  declassoc;    /*
10040 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73   Assign this ass
10050 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c  ociation to decl
10060 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
10070 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b  int preccounter;
10080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
10090 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64  sign this preced
100a0 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67  ence to decl arg
100b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75  uments */.  stru
100c0 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75  ct rule *firstru
100d0 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  le;    /* Pointe
100e0 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20  r to first rule 
100f0 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
10100 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
10110 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f  *lastrule;     /
10120 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
10130 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
10140 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b  arsed rule */.};
10150 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e  ../* Parse a sin
10160 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61  gle token */.sta
10170 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e  tic void parseon
10180 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73  etoken(struct ps
10190 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63  tate *psp).{.  c
101a0 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20  onst char *x;.  
101b0 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d  x = Strsafe(psp-
101c0 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20  >tokenstart);   
101d0 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f    /* Save the to
101e0 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20  ken permanently 
101f0 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74  */.#if 0.  print
10200 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d  f("%s:%d: Token=
10210 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22  [%s] state=%d\n"
10220 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  ,psp->filename,p
10230 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10240 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74  .    x,psp->stat
10250 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69  e);.#endif.  swi
10260 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20  tch( psp->state 
10270 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54  ){.    case INIT
10280 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73  IALIZE:.      ps
10290 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
102a0 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63  .      psp->prec
102b0 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20  counter = 0;.   
102c0 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c     psp->firstrul
102d0 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c  e = psp->lastrul
102e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
102f0 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b  ->gp->nrule = 0;
10300 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
10310 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65  hru to next case
10320 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49   */.    case WAI
10330 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10340 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  _RULE:.      if(
10350 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20   x[0]=='%' ){.  
10360 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10370 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10380 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
10390 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c     }else if( isl
103a0 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  ower(x[0]) ){.  
103b0 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d        psp->lhs =
103c0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
103d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
103e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
103f0 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30  sp->lhsalias = 0
10400 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10410 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10420 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20  OR_ARROW;.      
10430 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
10440 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '{' ){.        i
10450 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
10460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10470 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10480 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10490 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65  enlineno,."There
104a0 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
104b0 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20  e upon which to 
104c0 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20  attach the code 
104d0 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68  \.fragment which
104e0 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20   begins on this 
104f0 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  line.");.       
10500 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10510 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
10520 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
10530 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a  ule->code!=0 ){.
10540 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
10550 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10560 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10570 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e  o,."Code fragmen
10580 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74  t beginning on t
10590 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
105a0 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
105b0 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
105c0 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
105d0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
105e0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
105f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10600 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c  psp->prevrule->l
10610 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
10620 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
10630 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
10640 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20  >code = &x[1];. 
10650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10660 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
10670 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
10680 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
10690 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
106a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
106b0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
106c0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
106d0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
106e0 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
106f0 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
10700 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
10710 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
10720 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
10730 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10740 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10750 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10760 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
10770 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
10780 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
10790 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
107a0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
107b0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
107c0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
107d0 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
107e0 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
107f0 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
10800 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10810 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10820 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
10830 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
10840 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10850 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10860 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10870 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
10880 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
10890 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
108a0 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
108b0 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
108c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
108d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
108e0 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
108f0 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
10900 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10910 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10920 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
10930 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
10940 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
10950 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
10960 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
10970 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
10980 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10990 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
109a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
109b0 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
109c0 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
109d0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
109e0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
109f0 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
10a00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10a10 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
10a20 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
10a30 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
10a40 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10a50 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10a60 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10a70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
10a80 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
10a90 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
10aa0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10ab0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10ac0 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
10ad0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10ae0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
10af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10b00 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10b10 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
10b20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
10b30 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
10b40 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
10b50 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10b60 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
10b70 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
10b80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
10b90 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
10ba0 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
10bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
10bc0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10bd0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10be0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10bf0 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
10c00 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
10c10 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
10c20 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
10c30 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
10c40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
10c50 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10c60 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10c70 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
10c80 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
10c90 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10ca0 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
10cb0 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
10cc0 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
10cd0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10ce0 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
10cf0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10d00 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
10d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10d20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10d30 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10d40 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10d50 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
10d60 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
10d70 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
10d80 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
10d90 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
10da0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
10db0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10dc0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10dd0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10de0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10e00 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
10e10 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
10e20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
10e30 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
10e40 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
10e50 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
10e60 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10e70 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10e80 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10e90 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
10ea0 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
10eb0 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
10ec0 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
10ed0 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
10ee0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10ef0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
10f00 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10f10 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10f20 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10f30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10f40 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
10f50 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
10f60 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
10f70 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
10f80 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10f90 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
10fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10fb0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10fc0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10fd0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10fe0 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
10ff0 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
11000 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
11010 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
11020 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
11030 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
11040 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11050 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11060 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
11070 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
11080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11090 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
110a0 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
110b0 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
110c0 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
110d0 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
110e0 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
110f0 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
11100 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
11120 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
11130 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
11140 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
11150 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
11160 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
11170 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11180 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11190 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
111a0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
111b0 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
111c0 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
111d0 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
111e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
111f0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11200 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
11210 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ule = 0;.       
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11230 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
11240 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20     rp->ruleline 
11250 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
11260 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  no;.          rp
11270 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20  ->rhs = (struct 
11280 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b  symbol**)&rp[1];
11290 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
112a0 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74  hsalias = (const
112b0 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68   char**)&(rp->rh
112c0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20  s[psp->nrhs]);. 
112d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
112e0 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69  ; i<psp->nrhs; i
112f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
11300 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73   rp->rhs[i] = ps
11310 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
11320 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
11330 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c  ias[i] = psp->al
11340 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ias[i];.        
11350 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70    }.          rp
11360 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73  ->lhs = psp->lhs
11370 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
11380 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e  lhsalias = psp->
11390 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20  lhsalias;.      
113a0 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70      rp->nrhs = p
113b0 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20  sp->nrhs;.      
113c0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
113d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
113e0 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
113f0 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
11400 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
11410 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
11420 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
11430 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
11440 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
11450 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
11460 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
11470 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11480 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
11490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
114a0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
114b0 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
114c0 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
114d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
114e0 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
114f0 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20  ->next = rp;.   
11500 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
11510 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
11520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11530 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
11540 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d   = rp;.        }
11550 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11560 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11570 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
11580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11590 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
115a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
115b0 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
115c0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
115d0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
115e0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
115f0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
11600 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
11610 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
11620 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
11630 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
11640 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
11650 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11660 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11670 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11680 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11690 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
116a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
116b0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
116c0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
116d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
116e0 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
116f0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
11700 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20   psp->nrhs++;.  
11710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
11720 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27  lse if( (x[0]=='
11730 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29  |' || x[0]=='/')
11740 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
11750 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
11760 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
11770 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
11780 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs-1];.        i
11790 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55  f( msp->type!=MU
117a0 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
117b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
117c0 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d  symbol *origsp =
117d0 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20   msp;.          
117e0 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79  msp = (struct sy
117f0 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31  mbol *) calloc(1
11800 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
11810 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
11820 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
11830 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
11840 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
11850 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
11860 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
11870 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
11880 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
11890 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
118a0 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  **) calloc(1,siz
118b0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
118c0 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
118d0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
118e0 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
118f0 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
11900 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
11910 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
11920 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
11930 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
11940 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
11950 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
11960 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
11970 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
11980 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
11990 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
119a0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
119b0 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
119c0 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
119d0 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
119e0 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
119f0 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
11a00 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72       if( islower
11a10 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65  (x[1]) || islowe
11a20 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  r(msp->subsym[0]
11a30 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
11a40 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11a50 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11a60 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
11a80 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
11a90 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
11aa0 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
11ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11ac0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11ae0 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
11af0 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
11b00 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11b10 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
11b20 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
11b30 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11b40 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11b50 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11b60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
11b70 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
11b80 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
11b90 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
11ba0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11bb0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11bc0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11bd0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11be0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11c00 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
11c10 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
11c20 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11c30 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
11c40 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
11c50 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11c60 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
11c70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11c80 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11c90 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ca0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11cb0 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
11cc0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
11cd0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
11ce0 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
11cf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
11d00 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
11d10 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
11d20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11d30 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11d40 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11d50 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11d60 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11d80 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
11d90 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
11da0 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
11db0 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
11dc0 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
11dd0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11de0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11df0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11e00 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
11e10 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
11e20 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
11e30 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
11e40 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
11e50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11e60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11e70 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11e80 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11e90 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11eb0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
11ec0 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
11ed0 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
11ee0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
11ef0 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
11f00 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
11f10 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11f20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
11f30 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
11f40 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
11f50 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11f60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
11f70 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11f80 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
11f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
11fa0 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
11fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11fc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11fd0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
11fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11ff0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12000 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12010 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12020 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
12030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12040 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12050 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
12060 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
12070 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12080 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
12090 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
120a0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
120b0 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
120c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
120d0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
120e0 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
120f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12100 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12110 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
12120 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
12130 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12140 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
12150 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
12160 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12170 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
12180 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
12190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
121a0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
121b0 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
121c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
121d0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
121e0 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
121f0 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
12200 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12210 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12220 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12230 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
12240 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
12250 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12260 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12270 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
12280 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12290 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
122a0 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
122b0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
122c0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
122d0 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
122e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
122f0 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61  rcmp(x,"parse_fa
12300 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ilure")==0 ){.  
12310 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12320 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
12330 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a  ->gp->failure);.
12340 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12350 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
12360 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
12370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12380 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12390 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
123a0 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
123b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
123c0 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
123d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
123e0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
123f0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12400 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
12410 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
12420 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
12430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12440 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
12450 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
12460 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12470 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12480 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
12490 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
124a0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
124b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
124c0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
124d0 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
124e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
124f0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12500 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
12510 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
12520 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12530 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12540 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12550 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
12560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12570 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12580 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12590 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
125a0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
125b0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
125c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
125d0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
125e0 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
125f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12600 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12610 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
12620 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12630 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12640 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12650 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12660 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
12670 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
12680 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
12690 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
126a0 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
126b0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
126c0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
126d0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
126e0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
126f0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
12700 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
12710 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
12720 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
12730 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
12740 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
12750 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12760 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12770 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
12780 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
12790 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
127a0 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
127b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
127c0 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
127d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
127e0 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
127f0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
12800 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12810 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
12820 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
12830 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12840 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
12850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12860 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12870 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
12880 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
12890 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
128a0 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
128c0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
128d0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
128e0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
128f0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12900 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
12910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12920 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
12930 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12940 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12950 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
12960 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12970 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
12980 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
12990 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
129a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
129b0 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
129c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
129d0 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
129e0 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20  class")==0 ){.  
129f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12a00 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12a10 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20  _CLASS_ID;.     
12a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a30 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12a40 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
12a50 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12a60 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77           "Unknow
12a70 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  n declaration ke
12a80 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e  yword: \"%%%s\".
12a90 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",x);.          
12aa0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12ab0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12ac0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12ad0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
12ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12b10 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12b20 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12b30 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c     "Illegal decl
12b40 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a  aration keyword:
12b50 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
12b60 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12b70 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12b80 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12b90 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
12ba0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12bb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12bc0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
12bd0 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c  ESTRUCTOR_SYMBOL
12be0 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  :.      if( !isa
12bf0 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
12c00 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12c10 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12c20 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12c30 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
12c40 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66   name missing af
12c50 74 65 72 20 25 25 64 65 73 74 72 75 63 74 6f 72  ter %%destructor
12c60 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
12c70 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12c80 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
12c90 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
12ca0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
12cb0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
12cc0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
12cd0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
12ce0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
12cf0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12d00 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
12d10 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  uctor;.        p
12d20 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12d30 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69  ot = &sp->destLi
12d40 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73  neno;.        ps
12d50 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12d60 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
12d70 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12d80 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
12d90 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
12da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12db0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
12dc0 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  ATYPE_SYMBOL:.  
12dd0 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
12de0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12df0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12e00 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12e10 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12e20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
12e30 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
12e40 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29  %%type keyword")
12e50 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
12e60 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
12e70 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12e80 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
12e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
12ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
12eb0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
12ec0 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  = Symbol_find(x)
12ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28 73 70  ;.        if((sp
12ee0 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79  ) && (sp->dataty
12ef0 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pe)){.          
12f00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12f10 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12f20 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12f30 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74       "Symbol %%t
12f40 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ype \"%s\" alrea
12f50 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b  dy defined", x);
12f60 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12f70 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12f80 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12f90 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
12fa0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
12fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fc0 20 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20       if (!sp){. 
12fd0 20 20 20 20 20 20 20 20 20 20 20 73 70 20 3d 20             sp = 
12fe0 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
12ff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13000 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13010 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74  gslot = &sp->dat
13020 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  atype;.         
13030 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
13040 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
13050 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13060 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
13070 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
13080 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13090 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
130a0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
130b0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
130c0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
130d0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
130e0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
130f0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
13100 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
13110 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
13120 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
13130 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
13140 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
13150 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
13160 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
13170 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
13180 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13190 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
131a0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
131b0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
131c0 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
131d0 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
131e0 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
131f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13200 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
13210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13220 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70    sp->prec = psp
13230 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20  ->preccounter;. 
13240 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73           sp->ass
13250 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73  oc = psp->declas
13260 73 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  soc;.        }. 
13270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13280 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13290 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
132a0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
132b0 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73         "Can't as
132c0 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63  sign a precedenc
132d0 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29  e to \"%s\".",x)
132e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
132f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13300 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13310 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
13320 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20  _FOR_DECL_ARG:. 
13330 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
13340 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27  {' || x[0]=='\"'
13350 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d   || isalnum(x[0]
13360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
13370 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a  st char *zOld, *
13380 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68  zNew;.        ch
13390 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20  ar *zBuf, *z;.  
133a0 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20        int nOld, 
133b0 6e 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e  n, nLine = 0, nN
133c0 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20  ew, nBack;.     
133d0 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61     int addLineMa
133e0 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61  cro;.        cha
133f0 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20  r zLine[50];.   
13400 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20       zNew = x;. 
13410 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b         if( zNew[
13420 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b  0]=='"' || zNew[
13430 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b  0]=='{' ) zNew++
13440 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d  ;.        nNew =
13450 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65   lemonStrlen(zNe
13460 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
13470 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
13480 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
13490 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c  Old = *psp->decl
134a0 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20  argslot;.       
134b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
134c0 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20    zOld = "";.   
134d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
134e0 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  Old = lemonStrle
134f0 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  n(zOld);.       
13500 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77   n = nOld + nNew
13510 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61   + 20;.        a
13520 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70  ddLineMacro = !p
13530 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  sp->gp->nolineno
13540 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e  sflag && psp->in
13550 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26  sertLineMacro &&
13560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13570 20 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64           (psp->d
13580 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30  ecllinenoslot==0
13590 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e   || psp->decllin
135a0 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a  enoslot[0]!=0);.
135b0 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c          if( addL
135c0 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20  ineMacro ){.    
135d0 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d        for(z=psp-
135e0 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b  >filename, nBack
135f0 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  =0; *z; z++){.  
13600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
13610 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b  =='\\' ) nBack++
13620 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13630 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70          lemon_sp
13640 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c  rintf(zLine, "#l
13650 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74  ine %d ", psp->t
13660 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  okenlineno);.   
13670 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c         nLine = l
13680 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65  emonStrlen(zLine
13690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b  );.          n +
136a0 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53  = nLine + lemonS
136b0 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e  trlen(psp->filen
136c0 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20  ame) + nBack;.  
136d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
136e0 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
136f0 74 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61  t = (char *) rea
13700 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61  lloc(*psp->decla
13710 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20  rgslot, n);.    
13720 20 20 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d      zBuf = *psp-
13730 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e  >declargslot + n
13740 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
13750 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
13760 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
13770 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
13780 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
13790 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
137a0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
137b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
137c0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
137d0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
137e0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
137f0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
13800 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
13810 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
13820 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
13830 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
13840 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
13850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13860 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
13870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
13880 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
13890 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
138a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
138b0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
138c0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
138d0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
138e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
138f0 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
13900 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
13910 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
13920 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
13930 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
13940 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
13950 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
13960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13970 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
13980 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
13990 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
139a0 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
139b0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
139c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
139d0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
139e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
139f0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13a00 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
13a10 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
13a20 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
13a30 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
13a40 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
13a50 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
13a60 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13a70 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
13a80 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
13a90 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
13aa0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
13ab0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
13ac0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
13ad0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
13ae0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
13af0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
13b00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13b10 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
13b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13b30 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
13b40 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13b50 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13b60 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
13b70 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13b80 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
13b90 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
13ba0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
13bb0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13bc0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13be0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
13bf0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
13c00 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
13c10 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
13c20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13c30 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
13c40 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
13c50 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
13c60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
13c70 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13c80 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
13c90 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13ca0 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
13cb0 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
13cc0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
13cd0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
13ce0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13cf0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
13d00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
13d10 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
13d20 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
13d30 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
13d40 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
13d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13d60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d70 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13d80 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a  OR_WILDCARD_ID:.
13d90 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
13da0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
13db0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
13dc0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
13dd0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
13de0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
13df0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
13e00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
13e10 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
13e20 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
13e30 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20      "%%wildcard 
13e40 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
13e50 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
13e60 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
13e70 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13e90 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
13ea0 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
13eb0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
13ec0 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69   if( psp->gp->wi
13ed0 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20  ldcard==0 ){.   
13ee0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
13ef0 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20  wildcard = sp;. 
13f00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13f10 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13f20 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
13f30 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ,.            "E
13f50 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f  xtra wildcard to
13f60 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b   token: %s", x);
13f70 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13f80 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13f90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13fa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13fb0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
13fc0 43 4c 41 53 53 5f 49 44 3a 0a 20 20 20 20 20 20  CLASS_ID:.      
13fd0 69 66 28 20 21 69 73 6c 6f 77 65 72 28 78 5b 30  if( !islower(x[0
13fe0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
13ff0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14000 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
14010 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14020 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73    "%%token_class
14030 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
14040 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69  d by an identifi
14050 65 72 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20 20  er: ", x);.     
14060 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14070 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
14080 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
14090 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
140a0 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ;.     }else if(
140b0 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20   Symbol_find(x) 
140c0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
140d0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
140e0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
140f0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
14100 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c  Symbol \"%s\" al
14110 72 65 61 64 79 20 75 73 65 64 22 2c 20 78 29 3b  ready used", x);
14120 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
14130 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14140 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
14150 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
14160 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
14170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
14180 2d 3e 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62  ->tkclass = Symb
14190 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
141a0 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d     psp->tkclass-
141b0 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52  >type = MULTITER
141c0 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70  MINAL;.        p
141d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
141e0 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f  ING_FOR_CLASS_TO
141f0 4b 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KEN;.      }.   
14200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14210 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43  se WAITING_FOR_C
14220 4c 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20  LASS_TOKEN:.    
14230 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
14240 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
14250 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14260 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
14270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14280 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20  ( isupper(x[0]) 
14290 7c 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  || ((x[0]=='|' |
142a0 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
142b0 69 73 75 70 70 65 72 28 78 5b 31 5d 29 29 20 29  isupper(x[1])) )
142c0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
142d0 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70   symbol *msp = p
142e0 73 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20  sp->tkclass;.   
142f0 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
14300 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  m++;.        msp
14310 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75  ->subsym = (stru
14320 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65  ct symbol **) re
14330 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79  alloc(msp->subsy
14340 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a  m,.          siz
14350 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
14360 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  l*)*msp->nsubsym
14370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
14380 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 20  isupper(x[0]) ) 
14390 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  x++;.        msp
143a0 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73  ->subsym[msp->ns
143b0 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f  ubsym-1] = Symbo
143c0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
143d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
143e0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
143f0 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
14400 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14410 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73     "%%token_clas
14420 73 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c  s argument \"%s\
14430 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f  " should be a to
14440 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ken", x);.      
14450 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14460 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
14470 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
14480 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
14490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
144a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
144b0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
144c0 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20  _ERROR:./*      
144d0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
144e0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
144f0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
14500 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62  _RULE;.**      b
14510 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73  reak; */.    cas
14520 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  e RESYNC_AFTER_D
14530 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  ECL_ERROR:.     
14540 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
14550 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14560 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14570 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66  R_RULE;.      if
14580 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73  ( x[0]=='%' ) ps
14590 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
145a0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
145b0 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ORD;.      break
145c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20  ;.  }.}../* Run 
145d0 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72  the preprocessor
145e0 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20   over the input 
145f0 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20  file text.  The 
14600 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
14610 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20  .** azDefine[0] 
14620 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65  through azDefine
14630 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74  [nDefine-1] cont
14640 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
14650 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a  f all defined.**
14660 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72   macros.  This r
14670 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72  outine looks for
14680 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25   "%ifdef" and "%
14690 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e  ifndef" and "%en
146a0 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d  dif" and.** comm
146b0 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20  ents them out.  
146c0 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20  Text in between 
146d0 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
146e0 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72  d out as appropr
146f0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
14700 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f  void preprocess_
14710 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a  input(char *z){.
14720 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e    int i, j, k, n
14730 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20  ;.  int exclude 
14740 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  = 0;.  int start
14750 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65   = 0;.  int line
14760 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74  no = 1;.  int st
14770 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  art_lineno = 1;.
14780 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
14790 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
147a0 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  [i]=='\n' ) line
147b0 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b  no++;.    if( z[
147c0 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20  i]!='%' || (i>0 
147d0 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29  && z[i-1]!='\n')
147e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
147f0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b   if( strncmp(&z[
14800 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d  i],"%endif",6)==
14810 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
14820 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  +6]) ){.      if
14830 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
14840 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a       exclude--;.
14850 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c          if( excl
14860 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ude==0 ){.      
14870 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b      for(j=start;
14880 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a   j<i; j++) if( z
14890 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d  [j]!='\n' ) z[j]
148a0 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
148b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
148c0 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
148d0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
148e0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
148f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72    }else if( (str
14900 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64  ncmp(&z[i],"%ifd
14910 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  ef",6)==0 && iss
14920 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20  pace(z[i+6])).  
14930 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e          || (strn
14940 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64  cmp(&z[i],"%ifnd
14950 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73  ef",7)==0 && iss
14960 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b  pace(z[i+7])) ){
14970 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
14980 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
14990 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  clude++;.      }
149a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
149b0 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65  r(j=i+7; isspace
149c0 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20  (z[j]); j++){}. 
149d0 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20         for(n=0; 
149e0 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61  z[j+n] && !isspa
149f0 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29  ce(z[j+n]); n++)
14a00 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75  {}.        exclu
14a10 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
14a20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69  for(k=0; k<nDefi
14a30 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ne; k++){.      
14a40 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
14a50 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a  azDefine[k],&z[j
14a60 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e  ],n)==0 && lemon
14a70 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b  Strlen(azDefine[
14a80 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20  k])==n ){.      
14a90 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20        exclude = 
14aa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  0;.            b
14ab0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14ac0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14ad0 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d      if( z[i+3]==
14ae0 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20  'n' ) exclude = 
14af0 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20  !exclude;.      
14b00 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b    if( exclude ){
14b10 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
14b20 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
14b30 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c  start_lineno = l
14b40 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
14b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
14b60 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20  or(j=i; z[j] && 
14b70 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29  z[j]!='\n'; j++)
14b80 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
14b90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63   }.  }.  if( exc
14ba0 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69  lude ){.    fpri
14bb0 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65  ntf(stderr,"unte
14bc0 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65 66  rminated %%ifdef
14bd0 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e   starting on lin
14be0 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c  e %d\n", start_l
14bf0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74  ineno);.    exit
14c00 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49  (1);.  }.}../* I
14c10 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e  n spite of its n
14c20 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ame, this functi
14c30 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  on is really a s
14c40 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64  canner.  It read
14c50 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72  .** in the entir
14c60 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c  e input file (al
14c70 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20  l at once) then 
14c80 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45  tokenizes it.  E
14c90 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20  ach.** token is 
14ca0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66 75  passed to the fu
14cb0 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65  nction "parseone
14cc0 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69  token" which bui
14cd0 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61  lds all.** the a
14ce0 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 20  ppropriate data 
14cf0 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
14d00 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  e global state v
14d10 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76  ector "gp"..*/.v
14d20 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74  oid Parse(struct
14d30 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20   lemon *gp).{.  
14d40 73 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73  struct pstate ps
14d50 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20  ;.  FILE *fp;.  
14d60 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20  char *filebuf;. 
14d70 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69   unsigned int fi
14d80 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
14d90 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
14da0 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
14db0 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
14dc0 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
14dd0 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
14de0 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
14df0 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
14e00 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
14e10 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
14e20 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
14e30 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
14e40 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
14e50 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
14e60 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
14e70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
14e80 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
14e90 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
14ea0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14eb0 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
14ec0 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
14ed0 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
14ee0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
14ef0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14f00 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
14f10 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
14f20 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
14f30 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
14f40 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
14f50 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
14f60 0a 20 20 69 66 28 20 66 69 6c 65 73 69 7a 65 3e  .  if( filesize>
14f70 31 30 30 30 30 30 30 30 30 20 7c 7c 20 66 69 6c  100000000 || fil
14f80 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ebuf==0 ){.    E
14f90 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14fa0 61 6d 65 2c 30 2c 22 49 6e 70 75 74 20 66 69 6c  ame,0,"Input fil
14fb0 65 20 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b 0a  e too large.");.
14fc0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
14fd0 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66  ++;.    fclose(f
14fe0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  p);.    return;.
14ff0 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28    }.  if( fread(
15000 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69  filebuf,1,filesi
15010 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65  ze,fp)!=filesize
15020 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
15030 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
15040 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c  Can't read in al
15050 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68  l %d bytes of th
15060 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20  is file.",.     
15070 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20   filesize);.    
15080 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20  free(filebuf);. 
15090 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
150a0 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  +;.    fclose(fp
150b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
150c0 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b   }.  fclose(fp);
150d0 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73  .  filebuf[files
150e0 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ize] = 0;..  /* 
150f0 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  Make an initial 
15100 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65  pass through the
15110 20 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20   file to handle 
15120 25 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64  %ifdef and %ifnd
15130 65 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65  ef */.  preproce
15140 73 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66  ss_input(filebuf
15150 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61  );..  /* Now sca
15160 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  n the text of th
15170 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
15180 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
15190 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20  for(cp=filebuf; 
151a0 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a  (c= *cp)!=0; ){.
151b0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
151c0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20  ) lineno++;     
151d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70           /* Keep
151e0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
151f0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  ne number */.   
15200 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
15210 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75  ){ cp++; continu
15220 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c  e; }  /* Skip al
15230 6c 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f  l white space */
15240 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20  .    if( c=='/' 
15250 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b  && cp[1]=='/' ){
15260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
15270 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
15280 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
15290 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
152a0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
152b0 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
152c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
152d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
152e0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
152f0 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '*' ){          
15300 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20  /* Skip C style 
15310 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
15320 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77    cp+=2;.      w
15330 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
15340 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
15350 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a  cp[-1]!='*') ){.
15360 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
15370 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
15380 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
15390 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
153a0 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  c ) cp++;.      
153b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
153c0 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72      ps.tokenstar
153d0 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20  t = cp;         
153e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74         /* Mark t
153f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
15400 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
15410 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20   ps.tokenlineno 
15420 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  = lineno;       
15430 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65      /* Linenumbe
15440 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e  r on which token
15450 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69   begins */.    i
15460 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  f( c=='\"' ){   
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65    /* String lite
15490 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  rals */.      cp
154a0 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
154b0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
154c0 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20  c!='\"' ){.     
154d0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
154e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
154f0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d     cp++;.      }
15500 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
15510 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
15520 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
15530 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69  startline,."Stri
15540 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74  ng starting on t
15550 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
15560 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72  terminated befor
15570 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
15580 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   file.");.      
15590 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b    ps.errorcnt++;
155a0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
155b0 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = cp;.      }els
155c0 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  e{.        nextc
155d0 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20  p = cp+1;.      
155e0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
155f0 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20  c=='{' ){       
15600 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f          /* A blo
15610 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a  ck of C code */.
15620 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b        int level;
15630 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
15640 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20     for(level=1; 
15650 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
15660 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d  level>1 || c!='}
15670 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  '); cp++){.     
15680 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
15690 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
156a0 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
156b0 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20  {' ) level++;.  
156c0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
156d0 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b  =='}' ) level--;
156e0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
156f0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
15700 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='*' ){  /* Sk
15710 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  ip comments */. 
15720 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65           int pre
15730 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70  vc;.          cp
15740 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20   = &cp[2];.     
15750 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a       prevc = 0;.
15760 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
15770 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15780 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63  (c!='/' || prevc
15790 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  !='*') ){.      
157a0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
157b0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
157c0 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
157d0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = c;.           
157e0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   cp++;.         
157f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
15800 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
15810 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a  p[1]=='/' ){  /*
15820 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20   Skip C++ style 
15830 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a  comments too */.
15840 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
15850 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
15860 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
15870 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
15880 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   cp++;.         
15890 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b   if( c ) lineno+
158a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
158b0 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
158c0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
158d0 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
158e0 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
158f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
15900 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
15910 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
15920 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
15930 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
15940 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
15950 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
15960 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
15970 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
15980 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
15990 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
159a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
159b0 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
159c0 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
159d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
159e0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
159f0 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20    prevc = c;.   
15a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15a20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
15a30 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
15a40 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b  .filename,ps.tok
15a50 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64  enlineno,."C cod
15a60 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  e starting on th
15a70 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
15a80 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
15a90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15aa0 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
15ab0 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
15ac0 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
15ad0 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
15ae0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
15af0 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
15b00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
15b10 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20  salnum(c) ){    
15b20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66        /* Identif
15b30 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68  iers */.      wh
15b40 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
15b50 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20   && (isalnum(c) 
15b60 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
15b70 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
15b80 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
15b90 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70  if( c==':' && cp
15ba0 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32  [1]==':' && cp[2
15bb0 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65  ]=='=' ){ /* The
15bc0 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20   operator "::=" 
15bd0 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33  */.      cp += 3
15be0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
15bf0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
15c00 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  f( (c=='/' || c=
15c10 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61  ='|') && isalpha
15c20 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  (cp[1]) ){.     
15c30 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   cp += 2;.      
15c40 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29  while( (c = *cp)
15c50 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
15c60 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
15c70 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
15c80 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
15c90 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15cb0 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
15cc0 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
15cd0 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
15ce0 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
15cf0 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
15d00 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
15d10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d30 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
15d40 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
15d50 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
15d60 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
15d70 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
15d80 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
15d90 28 63 68 61 72 29 63 3b 20 20 20 20 20 20 20 20  (char)c;        
15da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15db0 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
15dc0 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
15dd0 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
15de0 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
15df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15e00 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
15e10 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
15e20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
15e30 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
15e40 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
15e50 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
15e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
15e80 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
15e90 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
15ea0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
15eb0 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
15ec0 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
15ed0 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
15ee0 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
15ef0 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
15f00 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
15f10 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
15f20 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
15f30 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
15f40 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
15f50 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
15f60 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
15f70 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
15f80 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20  nk *newlink;..  
15f90 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
15fa0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
15fb0 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
15fc0 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
15fd0 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
15fe0 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c  uct plink *)call
15ff0 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
16000 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b  struct plink) );
16010 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66  .    if( plink_f
16020 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
16030 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16040 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c  rr,.      "Unabl
16050 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
16060 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66  mory for a new f
16070 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
16080 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b  ation link.\n");
16090 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
160a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
160b0 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
160c0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
160d0 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b  i].next = &plink
160e0 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  _freelist[i+1];.
160f0 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
16100 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
16110 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e   0;.  }.  newlin
16120 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  k = plink_freeli
16130 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
16140 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
16150 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
16160 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d  eturn newlink;.}
16170 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b  ../* Add a plink
16180 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74   to a plink list
16190 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61   */.void Plink_a
161a0 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  dd(struct plink 
161b0 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63  **plpp, struct c
161c0 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
161d0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
161e0 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b  wlink;.  newlink
161f0 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a   = Plink_new();.
16200 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20    newlink->next 
16210 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
16220 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65   = newlink;.  ne
16230 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70  wlink->cfp = cfp
16240 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
16250 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
16260 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
16270 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
16280 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
16290 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
162a0 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c   **to, struct pl
162b0 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73  ink *from).{.  s
162c0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
162d0 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72  tpl;.  while( fr
162e0 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  om ){.    nextpl
162f0 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20   = from->next;. 
16300 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20     from->next = 
16310 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66  *to;.    *to = f
16320 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20  rom;.    from = 
16330 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nextpl;.  }.}../
16340 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70  * Delete every p
16350 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
16360 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64   */.void Plink_d
16370 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
16380 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72  nk *plp).{.  str
16390 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
163a0 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
163b0 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
163c0 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
163d0 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
163e0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
163f0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
16400 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
16410 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
16420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16430 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
16440 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
16450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
16470 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
16480 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
16490 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
164a0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
164b0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
164c0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
164d0 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
164e0 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
164f0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
16500 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
16510 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
16520 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
16530 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
16540 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
16550 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
16560 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75  le_makename(stru
16570 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
16580 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
16590 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61  ix).{.  char *na
165a0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
165b0 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  .  name = (char*
165c0 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
165d0 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rlen(lemp->filen
165e0 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  ame) + lemonStrl
165f0 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29  en(suffix) + 5 )
16600 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20  ;.  if( name==0 
16610 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
16620 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c  tderr,"Can't all
16630 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
16640 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b  a filename.\n");
16650 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
16660 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79  }.  lemon_strcpy
16670 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  (name,lemp->file
16680 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74  name);.  cp = st
16690 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b  rrchr(name,'.');
166a0 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20  .  if( cp ) *cp 
166b0 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  = 0;.  lemon_str
166c0 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29  cat(name,suffix)
166d0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b  ;.  return name;
166e0 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
166f0 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62  le with a name b
16700 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65  ased on the name
16710 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
16720 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20  le,.** but with 
16730 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65  a different (spe
16740 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20  cified) suffix, 
16750 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
16760 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  nter.** to the s
16770 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45  tream */.PRIVATE
16780 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e   FILE *file_open
16790 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (.  struct lemon
167a0 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20   *lemp,.  const 
167b0 63 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20  char *suffix,.  
167c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
167d0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  .){.  FILE *fp;.
167e0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
167f0 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
16800 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
16810 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
16820 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
16830 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
16840 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
16850 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
16860 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
16870 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
16880 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
16890 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
168a0 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
168b0 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
168c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
168d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
168e0 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
168f0 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
16900 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
16910 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
16920 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
16930 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  s .** on rules *
16940 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
16950 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
16960 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p).{.  struct ru
16970 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
16980 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69   symbol *sp;.  i
16990 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c  nt i, j, maxlen,
169a0 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20   len, ncolumns, 
169b0 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22  skip;.  printf("
169c0 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e  // Reprint of in
169d0 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  put file \"%s\".
169e0 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22  \n// Symbols:\n"
169f0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
16a00 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b  ;.  maxlen = 10;
16a10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
16a20 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
16a30 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  ){.    sp = lemp
16a40 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
16a50 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
16a60 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
16a70 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
16a80 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
16a90 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73  ;.  }.  ncolumns
16aa0 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29   = 76/(maxlen+5)
16ab0 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73  ;.  if( ncolumns
16ac0 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20  <1 ) ncolumns = 
16ad0 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d  1;.  skip = (lem
16ae0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f  p->nsymbol + nco
16af0 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75  lumns - 1)/ncolu
16b00 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mns;.  for(i=0; 
16b10 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<skip; i++){.  
16b20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a    printf("//");.
16b30 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c      for(j=i; j<l
16b40 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
16b50 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70  =skip){.      sp
16b60 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
16b70 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
16b80 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20  t( sp->index==j 
16b90 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
16ba0 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c  " %3d %-*.*s",j,
16bb0 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70  maxlen,maxlen,sp
16bc0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
16bd0 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
16be0 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
16bf0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
16c00 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
16c10 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e  printf("%s",rp->
16c20 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
16c30 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68  /*    if( rp->lh
16c40 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28  salias ) printf(
16c50 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c  "(%s)",rp->lhsal
16c60 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ias); */.    pri
16c70 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20  ntf(" ::=");.   
16c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
16c90 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
16ca0 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69    sp = rp->rhs[i
16cb0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ];.      if( sp-
16cc0 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
16cd0 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
16ce0 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70  printf(" %s", sp
16cf0 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
16d00 65 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  e);.        for(
16d10 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73  j=1; j<sp->nsubs
16d20 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
16d30 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22      printf("|%s"
16d40 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  , sp->subsym[j]-
16d50 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
16d60 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16d70 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
16d80 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
16d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
16da0 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
16db0 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28  s[i] ) printf("(
16dc0 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61  %s)",rp->rhsalia
16dd0 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a  s[i]); */.    }.
16de0 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b      printf(".");
16df0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65  .    if( rp->pre
16e00 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20  csym ) printf(" 
16e10 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79  [%s]",rp->precsy
16e20 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  m->name);.    /*
16e30 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20   if( rp->code ) 
16e40 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73  printf("\n    %s
16e50 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a  ",rp->code); */.
16e60 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
16e70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  ;.  }.}../* Prin
16e80 74 20 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e  t a single rule.
16e90 0a 2a 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69  .*/.void RulePri
16ea0 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72  nt(FILE *fp, str
16eb0 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e  uct rule *rp, in
16ec0 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74  t iCursor){.  st
16ed0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
16ee0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
16ef0 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a  printf(fp,"%s ::
16f00 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  =",rp->lhs->name
16f10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
16f20 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  =rp->nrhs; i++){
16f30 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72  .    if( i==iCur
16f40 73 6f 72 20 29 20 66 70 72 69 6e 74 66 28 66 70  sor ) fprintf(fp
16f50 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20  ," *");.    if( 
16f60 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72  i==rp->nrhs ) br
16f70 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  eak;.    sp = rp
16f80 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66  ->rhs[i];.    if
16f90 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
16fa0 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
16fb0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
16fc0 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
16fd0 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  0]->name);.     
16fe0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e   for(j=1; j<sp->
16ff0 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
17000 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
17010 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73  p,"|%s",sp->subs
17020 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
17030 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
17040 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17050 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  p," %s", sp->nam
17060 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
17070 0a 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75  ./* Print the ru
17080 6c 65 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75  le for a configu
17090 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
170a0 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45  ConfigPrint(FILE
170b0 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e   *fp, struct con
170c0 66 69 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c  fig *cfp){.  Rul
170d0 65 50 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e  ePrint(fp, cfp->
170e0 72 70 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d  rp, cfp->dot);.}
170f0 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53  ../* #define TES
17100 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72  T */.#if 0./* Pr
17110 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49  int a set */.PRI
17120 56 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69  VATE void SetPri
17130 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29  nt(out,set,lemp)
17140 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72  .FILE *out;.char
17150 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65   *set;.struct le
17160 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
17170 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70  nt i;.  char *sp
17180 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d  acer;.  spacer =
17190 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   "";.  fprintf(o
171a0 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a  ut,"%12s[","");.
171b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
171c0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
171d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46  +){.    if( SetF
171e0 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20  ind(set,i) ){.  
171f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17200 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65  "%s%s",spacer,le
17210 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
17220 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61  name);.      spa
17230 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d  cer = " ";.    }
17240 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
17250 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  ut,"]\n");.}../*
17260 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63   Print a plink c
17270 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  hain */.PRIVATE 
17280 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28  void PlinkPrint(
17290 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c  out,plp,tag).FIL
172a0 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70  E *out;.struct p
172b0 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20  link *plp;.char 
172c0 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28  *tag;.{.  while(
172d0 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69   plp ){.    fpri
172e0 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20  ntf(out,"%12s%s 
172f0 28 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22  (state %2d) ",""
17300 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73  ,tag,plp->cfp->s
17310 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
17320 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f     ConfigPrint(o
17330 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20  ut,plp->cfp);.  
17340 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
17350 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70  n");.    plp = p
17360 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  lp->next;.  }.}.
17370 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74  #endif../* Print
17380 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68   an action to th
17390 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
173a0 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
173b0 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74   FALSE if.** not
173c0 68 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c  hing was actuall
173d0 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  y printed..*/.in
173e0 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20  t PrintAction(. 
173f0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
17400 61 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ap,          /* 
17410 54 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72  The action to pr
17420 69 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66  int */.  FILE *f
17430 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17440 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68       /* Print th
17450 65 20 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f  e action here */
17460 0a 20 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20  .  int indent   
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17480 2a 20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73  * Indent by this
17490 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20   amount */.){.  
174a0 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a  int result = 1;.
174b0 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
174c0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
174d0 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74  HIFT: {.      st
174e0 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 20  ruct state *stp 
174f0 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20  = ap->x.stp;.   
17500 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
17510 2a 73 20 73 68 69 66 74 20 20 20 20 20 20 20 20  *s shift        
17520 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  %-7d",indent,ap-
17530 3e 73 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73  >sp->name,stp->s
17540 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20  tatenum);.      
17550 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17560 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a   case REDUCE: {.
17570 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c        struct rul
17580 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70  e *rp = ap->x.rp
17590 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
175a0 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20  fp,"%*s reduce  
175b0 20 20 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e       %-7d",inden
175c0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72  t,ap->sp->name,r
175d0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
175e0 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72   RulePrint(fp, r
175f0 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  p, -1);.      br
17600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17610 61 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a  ase SHIFTREDUCE:
17620 20 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20   {.      struct 
17630 72 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78  rule *rp = ap->x
17640 2e 72 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  .rp;.      fprin
17650 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
17660 2d 72 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e  -reduce %-7d",in
17670 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17680 65 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  e,rp->index);.  
17690 20 20 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70      RulePrint(fp
176a0 2c 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20  , rp, -1);.     
176b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
176c0 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20    case ACCEPT:. 
176d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
176e0 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64  "%*s accept",ind
176f0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17710 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a      case ERROR:.
17720 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17730 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64  ,"%*s error",ind
17740 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17750 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17760 20 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c      case SRCONFL
17770 49 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52  ICT:.    case RR
17780 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
17790 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
177a0 72 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37  reduce       %-7
177b0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
177c0 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20  flict **",.     
177d0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
177e0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
177f0 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
17800 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
17810 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20  SCONFLICT:.     
17820 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17830 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d   shift        %-
17840 37 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f  7d ** Parsing co
17850 6e 66 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20  nflict **", .   
17860 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
17870 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
17880 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
17890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
178a0 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44  case SH_RESOLVED
178b0 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77  :.      if( show
178c0 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69  PrecedenceConfli
178d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ct ){.        fp
178e0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68  rintf(fp,"%*s sh
178f0 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 20  ift        %-7d 
17900 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72  -- dropped by pr
17910 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20  ecedence",.     
17920 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e             inden
17930 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
17940 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
17950 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  um);.      }else
17960 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
17970 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
17990 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a  ase RD_RESOLVED:
179a0 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50  .      if( showP
179b0 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63  recedenceConflic
179c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  t ){.        fpr
179d0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64  intf(fp,"%*s red
179e0 75 63 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70  uce %-7d -- drop
179f0 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ped by precedenc
17a00 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
17a10 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
17a20 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70  p->name,ap->x.rp
17a30 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
17a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17a50 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
17a60 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
17a70 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45      case NOT_USE
17a80 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20  D:.      result 
17a90 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
17aa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17ab0 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
17ac0 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74  erate the "*.out
17ad0 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
17ae0 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
17af0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17b00 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
17b10 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
17b20 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  tp;.  struct con
17b30 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
17b40 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
17b50 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70   FILE *fp;..  fp
17b60 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
17b70 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a  p,".out","wb");.
17b80 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65    if( fp==0 ) re
17b90 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
17ba0 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
17bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
17bc0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
17bd0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
17be0 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
17bf0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
17c00 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
17c10 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
17c20 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
17c50 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
17c60 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
17c70 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
17c80 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
17c90 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
17ca0 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
17cb0 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
17cc0 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
17cd0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17ce0 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
17cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17d00 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
17d10 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
17d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
17d30 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
17d40 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
17d50 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a  fp,"\n");.#if 0.
17d60 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66        SetPrint(f
17d70 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29  p,cfp->fws,lemp)
17d80 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
17d90 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c  nt(fp,cfp->fplp,
17da0 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50  "To  ");.      P
17db0 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
17dc0 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a  ->bplp,"From");.
17dd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
17de0 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
17df0 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a   ) cfp=cfp->bp;.
17e00 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
17e10 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d              cfp=
17e20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d  cfp->next;.    }
17e30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
17e40 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  "\n");.    for(a
17e50 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
17e60 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
17e70 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69     if( PrintActi
17e80 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66  on(ap,fp,30) ) f
17e90 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
17ea0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
17eb0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d  tf(fp,"\n");.  }
17ec0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
17ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f00 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69  ----\n");.  fpri
17f10 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73  ntf(fp, "Symbols
17f20 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  :\n");.  for(i=0
17f30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
17f40 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
17f50 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   j;.    struct s
17f60 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20  ymbol *sp;..    
17f70 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
17f80 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ls[i];.    fprin
17f90 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25  tf(fp, "  %3d: %
17fa0 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29  s", i, sp->name)
17fb0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
17fc0 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
17fd0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17fe0 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20  (fp, ":");.     
17ff0 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20   if( sp->lambda 
18000 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18010 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61  tf(fp, " <lambda
18020 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >");.      }.   
18030 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
18040 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
18050 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18060 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26   sp->firstset &&
18070 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72   SetFind(sp->fir
18080 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20  stset, j) ){.   
18090 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
180a0 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e  p, " %s", lemp->
180b0 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65  symbols[j]->name
180c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
180d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
180e0 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29  printf(fp, "\n")
180f0 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
18100 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
18110 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
18120 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
18130 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
18140 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
18150 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
18160 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
18170 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63  ar *pathsearch(c
18180 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72  har *argv0, char
18190 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65   *name, int mode
181a0 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  mask).{.  const 
181b0 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
181c0 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70    char *pathbufp
181d0 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  tr;.  char *path
181e0 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74  buf;.  char *pat
181f0 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b  h,*cp;.  char c;
18200 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32  ..#ifdef __WIN32
18210 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  __.  cp = strrch
18220 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23  r(argv0,'\\');.#
18230 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72  else.  cp = strr
18240 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a  chr(argv0,'/');.
18250 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20  #endif.  if( cp 
18260 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a  ){.    c = *cp;.
18270 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
18280 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29   path = (char *)
18290 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
182a0 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d  len(argv0) + lem
182b0 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  onStrlen(name) +
182c0 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
182d0 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  th ) lemon_sprin
182e0 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c  tf(path,"%s/%s",
182f0 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20  argv0,name);.   
18300 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73   *cp = c;.  }els
18310 65 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  e{.    pathlist 
18320 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
18330 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
18340 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
18350 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
18360 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62 75  bin";.    pathbu
18370 66 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  f = (char *) mal
18380 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
18390 28 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20 29  (pathlist) + 1 )
183a0 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  ;.    path = (ch
183b0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
183c0 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
183d0 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e  t)+lemonStrlen(n
183e0 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66  ame)+2 );.    if
183f0 28 20 28 70 61 74 68 62 75 66 20 21 3d 20 30 29  ( (pathbuf != 0)
18400 20 26 26 20 28 70 61 74 68 21 3d 30 29 20 29 7b   && (path!=0) ){
18410 0a 20 20 20 20 20 20 70 61 74 68 62 75 66 70 74  .      pathbufpt
18420 72 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20 20  r = pathbuf;.   
18430 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
18440 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73  pathbuf, pathlis
18450 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
18460 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20   *pathbuf ){.   
18470 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72       cp = strchr
18480 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20  (pathbuf,':');. 
18490 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30         if( cp==0
184a0 20 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66   ) cp = &pathbuf
184b0 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
184c0 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20  hbuf)];.        
184d0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
184e0 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
184f0 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
18500 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74  path,"%s/%s",pat
18510 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  hbuf,name);.    
18520 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
18530 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
18540 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a  pathbuf[0] = 0;.
18550 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74          else pat
18560 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  hbuf = &cp[1];. 
18570 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
18580 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
18590 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
185a0 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
185b0 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20  pathbufptr);.   
185c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
185d0 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
185e0 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
185f0 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
18600 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
18610 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
18620 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
18630 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
18640 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
18650 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
18660 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
18670 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
18680 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
18690 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
186a0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74  ompute_action(st
186b0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
186c0 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  , struct action 
186d0 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74  *ap).{.  int act
186e0 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
186f0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
18700 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61   SHIFT:  act = a
18710 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
18720 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
18730 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
18740 3b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  ;.    case SHIFT
18750 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70  REDUCE: act = ap
18760 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20  ->x.rp->index + 
18770 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 20 20  lemp->nstate;   
18780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18790 63 61 73 65 20 52 45 44 55 43 45 3a 20 61 63 74  case REDUCE: act
187a0 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64   = ap->x.rp->ind
187b0 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ex + lemp->nstat
187c0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62  e+lemp->nrule; b
187d0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45  reak;.    case E
187e0 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d  RROR:  act = lem
187f0 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
18800 2d 3e 6e 72 75 6c 65 2a 32 3b 20 20 20 20 20 20  ->nrule*2;      
18810 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
18820 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
18830 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
18840 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
18850 65 2a 32 20 2b 20 31 3b 20 20 20 20 20 20 20 20  e*2 + 1;        
18860 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
18870 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d  fault:     act =
18880 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   -1; break;.  }.
18890 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a    return act;.}.
188a0 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a  .#define LINESIZ
188b0 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65  E 1000./* The ne
188c0 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f  xt cluster of ro
188d0 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72  utines are for r
188e0 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c  eading the templ
188f0 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ate file.** and 
18900 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75  writing the resu
18910 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72  lts to the gener
18920 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f  ated parser */./
18930 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63  * The first func
18940 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64  tion transfers d
18950 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f  ata from "in" to
18960 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20   "out" until.** 
18970 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77  a line is seen w
18980 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68  hich begins with
18990 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65   "%%".  The line
189a0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72   number is.** tr
189b0 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  acked..**.** if 
189c0 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e  name!=0, then an
189d0 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69  y word that begi
189e0 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69  n with "Parse" i
189f0 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20  s changed to.** 
18a00 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65  begin with *name
18a10 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49   instead..*/.PRI
18a20 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78  VATE void tplt_x
18a30 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20  fer(char *name, 
18a40 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a  FILE *in, FILE *
18a50 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  out, int *lineno
18a60 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  ).{.  int i, iSt
18a70 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  art;.  char line
18a80 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68  [LINESIZE];.  wh
18a90 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c  ile( fgets(line,
18aa0 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20  LINESIZE,in) && 
18ab0 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c  (line[0]!='%' ||
18ac0 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29   line[1]!='%') )
18ad0 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  {.    (*lineno)+
18ae0 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20  +;.    iStart = 
18af0 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20  0;.    if( name 
18b00 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
18b10 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b  ; line[i]; i++){
18b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e  .        if( lin
18b30 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72  e[i]=='P' && str
18b40 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50  ncmp(&line[i],"P
18b50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  arse",5)==0.    
18b60 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c        && (i==0 |
18b70 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b  | !isalpha(line[
18b80 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29  i-1])).        )
18b90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
18ba0 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e  i>iStart ) fprin
18bb0 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d  tf(out,"%.*s",i-
18bc0 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74  iStart,&line[iSt
18bd0 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  art]);.         
18be0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
18bf0 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ",name);.       
18c00 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
18c10 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b       iStart = i+
18c20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
18c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
18c40 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
18c50 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
18c60 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65    }.}../* The ne
18c70 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  xt function find
18c80 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  s the template f
18c90 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74  ile and opens it
18ca0 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  , returning.** a
18cb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18cc0 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a  opened file. */.
18cd0 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70  PRIVATE FILE *tp
18ce0 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c  lt_open(struct l
18cf0 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
18d00 73 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70  static char temp
18d10 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65  latename[] = "le
18d20 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20  mpar.c";.  char 
18d30 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c  buf[1000];.  FIL
18d40 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74  E *in;.  char *t
18d50 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  pltname;.  char 
18d60 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74  *cp;..  /* first
18d70 2c 20 73 65 65 20 69 66 20 75 73 65 72 20 73 70  , see if user sp
18d80 65 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61  ecified a templa
18d90 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74  te filename on t
18da0 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e  he command line.
18db0 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74   */.  if (user_t
18dc0 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30  emplatename != 0
18dd0 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ) {.    if( acce
18de0 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  ss(user_template
18df0 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b  name,004)==-1 ){
18e00 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
18e10 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
18e20 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
18e30 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
18e40 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
18e50 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
18e60 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
18e70 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
18e80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
18e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
18ea0 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70   fopen(user_temp
18eb0 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  latename,"rb");.
18ec0 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
18ed0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
18ee0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
18ef0 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
18f00 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
18f20 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  er_templatename)
18f30 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
18f40 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
18f50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
18f60 20 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20      return in;. 
18f70 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63   }..  cp = strrc
18f80 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  hr(lemp->filenam
18f90 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
18fa0 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70   ){.    lemon_sp
18fb0 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e  rintf(buf,"%.*s.
18fc0 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d  lt",(int)(cp-lem
18fd0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d  p->filename),lem
18fe0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
18ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e  }else{.    lemon
19000 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73  _sprintf(buf,"%s
19010 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  .lt",lemp->filen
19020 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
19030 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d  access(buf,004)=
19040 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
19050 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73  me = buf;.  }els
19060 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d  e if( access(tem
19070 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d  platename,004)==
19080 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
19090 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  e = templatename
190a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
190b0 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65  pltname = pathse
190c0 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30  arch(lemp->argv0
190d0 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29  ,templatename,0)
190e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74  ;.  }.  if( tplt
190f0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  name==0 ){.    f
19100 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
19110 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
19120 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
19130 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
19140 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61  .\n",.    templa
19150 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
19160 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
19170 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19180 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70  .  in = fopen(tp
19190 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  ltname,"rb");.  
191a0 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
191b0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
191c0 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20  "Can't open the 
191d0 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
191e0 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74  %s\".\n",templat
191f0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  ename);.    lemp
19200 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
19210 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19220 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a    return in;.}..
19230 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e 65  /* Print a #line
19240 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65 20   directive line 
19250 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  to the output fi
19260 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  le. */.PRIVATE v
19270 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  oid tplt_linedir
19280 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
19290 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a 66 69  lineno, char *fi
192a0 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70 72 69  lename).{.  fpri
192b0 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
192c0 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  d \"",lineno);. 
192d0 20 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d   while( *filenam
192e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69  e ){.    if( *fi
192f0 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29  lename == '\\' )
19300 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b   putc('\\',out);
19310 0a 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e  .    putc(*filen
19320 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69  ame,out);.    fi
19330 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20  lename++;.  }.  
19340 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c  fprintf(out,"\"\
19350 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  n");.}../* Print
19360 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65   a string to the
19370 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74   file and keep t
19380 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70  he linenumber up
19390 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56   to date */.PRIV
193a0 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72  ATE void tplt_pr
193b0 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  int(FILE *out, s
193c0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
193d0 70 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e  p, char *str, in
193e0 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69  t *lineno).{.  i
193f0 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75  f( str==0 ) retu
19400 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74  rn;.  while( *st
19410 72 20 29 7b 0a 20 20 20 20 70 75 74 63 28 2a 73  r ){.    putc(*s
19420 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69 66 28  tr,out);.    if(
19430 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a   *str=='\n' ) (*
19440 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73  lineno)++;.    s
19450 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tr++;.  }.  if( 
19460 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b  str[-1]!='\n' ){
19470 0a 20 20 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f  .    putc('\n',o
19480 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  ut);.    (*linen
19490 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28  o)++;.  }.  if (
194a0 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
194b0 66 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69  flag) {.    (*li
194c0 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
194d0 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
194e0 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
194f0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  ; .  }.  return;
19500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
19510 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
19520 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74  emits code for t
19530 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
19540 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  r the.** symbol 
19550 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f  sp.*/.void emit_
19560 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
19570 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
19580 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
19590 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  p,.  struct lemo
195a0 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a  n *lemp,.  int *
195b0 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72 20  lineno.){. char 
195c0 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20 73  *cp = 0;.. if( s
195d0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
195e0 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  L ){.   cp = lem
195f0 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20  p->tokendest;.  
19600 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
19610 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
19620 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
19630 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20  neno)++;. }else 
19640 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74  if( sp->destruct
19650 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70  or ){.   cp = sp
19660 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
19670 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
19680 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
19690 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e  ;.   if( !lemp->
196a0 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b  nolinenosflag ){
196b0 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  .     (*lineno)+
196c0 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e  +;.     tplt_lin
196d0 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73  edir(out,sp->des
196e0 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69  tLineno,lemp->fi
196f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d  lename);.   }. }
19700 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76  else if( lemp->v
19710 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20  ardest ){.   cp 
19720 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b  = lemp->vardest;
19730 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
19740 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
19750 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
19760 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
19770 73 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30  se{.   assert( 0
19780 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
19790 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72  appen */. }. for
197a0 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  (; *cp; cp++){. 
197b0 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26    if( *cp=='$' &
197c0 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a  & cp[1]=='$' ){.
197d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
197e0 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25  ,"(yypminor->yy%
197f0 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a  d)",sp->dtnum);.
19800 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
19810 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20  continue;.   }. 
19820 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
19830 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ) (*lineno)++;. 
19840 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29    fputc(*cp,out)
19850 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75  ;. }. fprintf(ou
19860 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  t,"\n"); (*linen
19870 6f 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70  o)++;. if (!lemp
19880 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
19890 20 7b 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   { .   (*lineno)
198a0 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
198b0 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
198c0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d  p->outname); . }
198d0 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d  . fprintf(out,"}
198e0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
198f0 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  +;. return;.}../
19900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
19910 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
19920 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20  he given symbol 
19930 68 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72  has a destructor
19940 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73  ..*/.int has_des
19950 74 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73  tructor(struct s
19960 79 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63  ymbol *sp, struc
19970 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
19980 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66  .  int ret;.  if
19990 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
199a0 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20  INAL ){.    ret 
199b0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
199c0 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t!=0;.  }else{. 
199d0 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76     ret = lemp->v
199e0 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d  ardest!=0 || sp-
199f0 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a  >destructor!=0;.
19a00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
19a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
19a20 64 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61  d text to a dyna
19a30 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
19a40 64 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54  d string.  If zT
19a50 65 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a  ext is 0 then.**
19a60 20 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e   reset the strin
19a70 67 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67  g to be empty ag
19a80 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ain.  Always ret
19a90 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  urn the complete
19aa0 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20   text.** of the 
19ab0 73 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73  string (which is
19ac0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
19ad0 68 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a  h each call)..**
19ae0 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a  .** n bytes of z
19af0 54 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e  Text are stored.
19b00 20 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61    If n==0 then a
19b10 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74  ll of zText up t
19b20 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c  o the first.** \
19b30 30 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69  000 terminator i
19b40 73 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74  s stored.  zText
19b50 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20   can contain up 
19b60 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  to two instances
19b70 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20   of.** %d.  The 
19b80 76 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64  values of p1 and
19b90 20 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20   p2 are written 
19ba0 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  into the first a
19bb0 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e  nd second.** %d.
19bc0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c  .**.** If n==-1,
19bd0 20 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f   then the previo
19be0 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20  us character is 
19bf0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a  overwritten..*/.
19c00 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70  PRIVATE char *ap
19c10 70 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63  pend_str(const c
19c20 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
19c30 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  n, int p1, int p
19c40 32 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  2){.  static cha
19c50 72 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30  r empty[1] = { 0
19c60 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   };.  static cha
19c70 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74  r *z = 0;.  stat
19c80 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d  ic int alloced =
19c90 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
19ca0 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74   used = 0;.  int
19cb0 20 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b   c;.  char zInt[
19cc0 34 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74  40];.  if( zText
19cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20  ==0 ){.    used 
19ce0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
19cf0 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d  z;.  }.  if( n<=
19d00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30  0 ){.    if( n<0
19d10 20 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b   ){.      used +
19d20 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = n;.      asser
19d30 74 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20  t( used>=0 );.  
19d40 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f    }.    n = lemo
19d50 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a  nStrlen(zText);.
19d60 20 20 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20    }.  if( (int) 
19d70 28 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a  (n+sizeof(zInt)*
19d80 32 2b 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63  2+used) >= alloc
19d90 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65  ed ){.    alloce
19da0 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a  d = n + sizeof(z
19db0 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20  Int)*2 + used + 
19dc0 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  200;.    z = (ch
19dd0 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c  ar *) realloc(z,
19de0 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a    alloced);.  }.
19df0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
19e00 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69  urn empty;.  whi
19e10 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
19e20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b     c = *(zText++
19e30 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25  );.    if( c=='%
19e40 27 20 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78  ' && n>0 && zTex
19e50 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20  t[0]=='d' ){.   
19e60 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
19e70 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29  (zInt, "%d", p1)
19e80 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b  ;.      p1 = p2;
19e90 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
19ea0 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49  cpy(&z[used], zI
19eb0 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20  nt);.      used 
19ec0 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26  += lemonStrlen(&
19ed0 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20  z[used]);.      
19ee0 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e  zText++;.      n
19ef0 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
19f00 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d       z[used++] =
19f10 20 28 63 68 61 72 29 63 3b 0a 20 20 20 20 7d 0a   (char)c;.    }.
19f20 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20    }.  z[used] = 
19f30 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  0;.  return z;.}
19f40 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69 73  ../*.** zCode is
19f50 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
19f60 73 20 74 68 65 20 61 63 74 69 6f 6e 20 61 73 73  s the action ass
19f70 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 72  ociated with a r
19f80 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a 2a 2a 20  ule.  Expand.** 
19f90 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  the symbols in t
19fa0 68 69 73 20 73 74 72 69 6e 67 20 73 6f 20 74 68  his string so th
19fb0 61 74 20 74 68 65 20 72 65 66 65 72 20 74 6f 20  at the refer to 
19fc0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
19fd0 70 61 72 73 65 72 0a 2a 2a 20 73 74 61 63 6b 2e  parser.** stack.
19fe0 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
19ff0 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
1a000 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1a010 6d 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  mp, struct rule 
1a020 2a 72 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70  *rp){.  char *cp
1a030 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  , *xp;.  int i;.
1a040 20 20 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d    char lhsused =
1a050 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69   0;    /* True i
1a060 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e  f the LHS elemen
1a070 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
1a080 2a 2f 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d  */.  char used[M
1a090 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75  AXRHS];   /* Tru
1a0a0 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
1a0b0 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
1a0c0 75 73 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  used */..  for(i
1a0d0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
1a0e0 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30  i++) used[i] = 0
1a0f0 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  ;.  lhsused = 0;
1a100 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  ..  if( rp->code
1a110 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
1a120 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73 74  c char newlinest
1a130 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20 27  r[2] = { '\n', '
1a140 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e 63  \0' };.    rp->c
1a150 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74 72  ode = newlinestr
1a160 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d  ;.    rp->line =
1a170 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20   rp->ruleline;. 
1a180 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72   }..  append_str
1a190 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a  (0,0,0,0);..  /*
1a1a0 20 54 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74   This const cast
1a1b0 20 69 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61   is wrong but ha
1a1c0 72 6d 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65  rmless, if we're
1a1d0 20 63 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66   careful. */.  f
1a1e0 6f 72 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70  or(cp=(char *)rp
1a1f0 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
1a200 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61 6c  +){.    if( isal
1a210 70 68 61 28 2a 63 70 29 20 26 26 20 28 63 70 3d  pha(*cp) && (cp=
1a220 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 69  =rp->code || (!i
1a230 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20 26  salnum(cp[-1]) &
1a240 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20  & cp[-1]!='_')) 
1a250 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73 61  ){.      char sa
1a260 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 78  ved;.      for(x
1a270 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e  p= &cp[1]; isaln
1a280 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d  um(*xp) || *xp==
1a290 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20  '_'; xp++);.    
1a2a0 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20    saved = *xp;. 
1a2b0 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20       *xp = 0;.  
1a2c0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
1a2d0 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 63  lias && strcmp(c
1a2e0 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d  p,rp->lhsalias)=
1a2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
1a300 70 65 6e 64 5f 73 74 72 28 22 79 79 67 6f 74 6f  pend_str("yygoto
1a310 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72 70  minor.yy%d",0,rp
1a320 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b  ->lhs->dtnum,0);
1a330 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70  .        cp = xp
1a340 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65  ;.        lhsuse
1a350 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
1a360 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
1a370 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1a380 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1a390 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
1a3a0 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63  s[i] && strcmp(c
1a3b0 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  p,rp->rhsalias[i
1a3c0 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1a3d0 20 20 20 20 20 69 66 28 20 63 70 21 3d 72 70 2d       if( cp!=rp-
1a3e0 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d  >code && cp[-1]=
1a3f0 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='@' ){.        
1a400 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1a410 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74  argument is of t
1a420 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e 20  he form @X then 
1a430 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20 20  substituted.    
1a440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1a450 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66   token number of
1a460 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75   X, not the valu
1a470 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20 20  e of X */.      
1a480 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
1a490 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61  tr("yymsp[%d].ma
1a4a0 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72  jor",-1,i-rp->nr
1a4b0 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20 20  hs+1,0);.       
1a4c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a4d0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1a4e0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
1a4f0 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
1a500 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e 75          int dtnu
1a510 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
1a520 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
1a530 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73  dtnum = sp->subs
1a560 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20  ym[0]->dtnum;.  
1a570 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1a580 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1a590 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64     dtnum = sp->d
1a5a0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
1a5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a5c0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1a5d0 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e  yymsp[%d].minor.
1a5e0 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72  yy%d",0,i-rp->nr
1a5f0 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20  hs+1, dtnum);.  
1a600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a610 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
1a620 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  .            use
1a630 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  d[i] = 1;.      
1a640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a660 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1a670 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20   *xp = saved;.  
1a680 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f 73    }.    append_s
1a690 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b  tr(cp, 1, 0, 0);
1a6a0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70  .  } /* End loop
1a6b0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
1a6c0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
1a6d0 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73   LHS has been us
1a6e0 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e  ed */.  if( rp->
1a6f0 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
1a700 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f  used ){.    Erro
1a710 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1a720 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1a730 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c  ,.      "Label \
1a740 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25  "%s\" for \"%s(%
1a750 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
1a760 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70  ed.",.        rp
1a770 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
1a780 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
1a790 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70  alias);.    lemp
1a7a0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1a7b0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1a7c0 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65   destructor code
1a7d0 20 66 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73   for RHS symbols
1a7e0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
1a7f0 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
1a800 72 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20  reduce code */. 
1a810 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
1a820 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
1a830 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1a840 5b 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20  [i] && !used[i] 
1a850 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
1a860 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
1a870 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
1a880 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
1a890 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
1a8a0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
1a8b0 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73  .        rp->rhs
1a8c0 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73  alias[i],rp->rhs
1a8d0 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68  [i]->name,rp->rh
1a8e0 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20  salias[i]);.    
1a8f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1a900 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
1a910 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1a920 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
1a930 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
1a940 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70  (rp->rhs[i],lemp
1a950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ) ){.        app
1a960 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65  end_str("  yy_de
1a970 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73  structor(yypPars
1a980 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d  er,%d,&yymsp[%d]
1a990 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a  .minor);\n", 0,.
1a9a0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
1a9b0 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72  hs[i]->index,i-r
1a9c0 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20  p->nrhs+1);.    
1a9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a9e0 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75 63 74 6f   /* No destructo
1a9f0 72 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68  r defined for th
1aa00 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  is term */.     
1aa10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1aa20 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20  f( rp->code ){. 
1aa30 20 20 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73     cp = append_s
1aa40 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  tr(0,0,0,0);.   
1aa50 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73   rp->code = Strs
1aa60 61 66 65 28 63 70 3f 63 70 3a 22 22 29 3b 0a 20  afe(cp?cp:"");. 
1aa70 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e   }.}../* .** Gen
1aa80 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1aa90 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
1aaa0 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73 20  he rule "rp" is 
1aab0 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a  reduced.  Write.
1aac0 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22  ** the code to "
1aad0 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65  out".  Make sure
1aae0 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70   lineno stays up
1aaf0 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49  -to-date..*/.PRI
1ab00 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63  VATE void emit_c
1ab10 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ode(.  FILE *out
1ab20 2c 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ,.  struct rule 
1ab30 2a 72 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65  *rp,.  struct le
1ab40 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
1ab50 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e   *lineno.){. con
1ab60 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f  st char *cp;.. /
1ab70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ab80 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
1ab90 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
1aba0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69  rp->code ){.   i
1abb0 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1abc0 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1abd0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1abe0 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1abf0 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70  ut,rp->line,lemp
1ac00 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ->filename);.   
1ac10 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  }.   fprintf(out
1ac20 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29  ,"{%s",rp->code)
1ac30 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
1ac40 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
1ac50 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d  {.     if( *cp==
1ac60 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
1ac70 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20  ++;.   } /* End 
1ac80 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e  loop */.   fprin
1ac90 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28  tf(out,"}\n"); (
1aca0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69  *lineno)++;.   i
1acb0 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1acc0 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1acd0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1ace0 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1acf0 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
1ad00 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a  >outname);.   }.
1ad10 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70   } /* End if( rp
1ad20 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65  ->code ) */.. re
1ad30 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  turn;.}../*.** P
1ad40 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74  rint the definit
1ad50 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e  ion of the union
1ad60 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61   used for the pa
1ad70 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63  rser's data stac
1ad80 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e  k..** This union
1ad90 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73   contains fields
1ada0 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
1adb0 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f  ble data type fo
1adc0 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20  r tokens.** and 
1add0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  nonterminals.  I
1ade0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  n the process of
1adf0 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70   computing and p
1ae00 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20  rinting this.** 
1ae10 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20  union, also set 
1ae20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  the ".dtnum" fie
1ae30 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d  ld of every term
1ae40 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
1ae50 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a  inal.** symbol..
1ae60 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74  */.void print_st
1ae70 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c  ack_union(.  FIL
1ae80 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20  E *out,         
1ae90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1aea0 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f  output stream */
1aeb0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
1aec0 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f  *lemp,         /
1aed0 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20  * The main info 
1aee0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
1aef0 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69  is parser */.  i
1af00 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20  nt *plineno,    
1af10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1af20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e  inter to the lin
1af30 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1af40 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20  t mhflag        
1af50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1af60 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20  e if generating 
1af70 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70  makeheaders outp
1af80 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c  ut */.){.  int l
1af90 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f  ineno = *plineno
1afa0 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65  ;    /* The line
1afb0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f   number of the o
1afc0 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20  utput */.  char 
1afd0 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20  **types;        
1afe0 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74       /* A hash t
1aff0 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
1b000 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79  s */.  int array
1b010 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1b020 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b030 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f  "types" array */
1b040 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67  .  int maxdtleng
1b050 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
1b060 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
1b070 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65  f any ".datatype
1b080 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68  " field. */.  ch
1b090 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20  ar *stddt;      
1b0a0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64          /* Stand
1b0b0 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72  ardized name for
1b0c0 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20   a datatype */. 
1b0d0 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20   int i,j;       
1b0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1b0f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1b100 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b 20   unsigned hash; 
1b110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1b120 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61  r hashing the na
1b130 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a  me of a type */.
1b140 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
1b150 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me;         /* N
1b160 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ame of the parse
1b170 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  r */..  /* Alloc
1b180 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1b190 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61  ze types[] and a
1b1a0 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20  llocate stddt[] 
1b1b0 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d  */.  arraysize =
1b1c0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a   lemp->nsymbol *
1b1d0 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63   2;.  types = (c
1b1e0 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72  har**)calloc( ar
1b1f0 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  raysize, sizeof(
1b200 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20  char*) );.  if( 
1b210 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  types==0 ){.    
1b220 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1b230 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
1b240 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
1b250 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1b260 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
1b270 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a  ) types[i] = 0;.
1b280 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20    maxdtlength = 
1b290 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76  0;.  if( lemp->v
1b2a0 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61  artype ){.    ma
1b2b0 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f  xdtlength = lemo
1b2c0 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61  nStrlen(lemp->va
1b2d0 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  rtype);.  }.  fo
1b2e0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1b2f0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1b300 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73    int len;.    s
1b310 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1b320 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1b330 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
1b340 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63  >datatype==0 ) c
1b350 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e  ontinue;.    len
1b360 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73   = lemonStrlen(s
1b370 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20  p->datatype);.  
1b380 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c    if( len>maxdtl
1b390 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e  ength ) maxdtlen
1b3a0 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  gth = len;.  }. 
1b3b0 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29   stddt = (char*)
1b3c0 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e  malloc( maxdtlen
1b3d0 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69  gth*2 + 1 );.  i
1b3e0 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20  f( stddt==0 ){. 
1b3f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1b400 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
1b410 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
1b420 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  1);.  }..  /* Bu
1b430 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65  ild a hash table
1b440 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54   of datatypes. T
1b450 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
1b460 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c  d of each symbol
1b470 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  .  ** is filled 
1b480 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68  in with the hash
1b490 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20   index plus 1.  
1b4a0 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65  A ".dtnum" value
1b4b0 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73   of 0 is.  ** us
1b4c0 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20  ed for terminal 
1b4d0 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65  symbols.  If the
1b4e0 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c  re is no %defaul
1b4f0 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20 74  t_type defined t
1b500 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c  hen.  ** 0 is al
1b510 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20 2e  so used as the .
1b520 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20  dtnum value for 
1b530 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
1b540 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66  ch do not specif
1b550 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70  y.  ** a datatyp
1b560 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70  e using the %typ
1b570 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a  e directive..  *
1b580 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1b590 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
1b5a0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
1b5b0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1b5c0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1b5d0 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20    char *cp;.    
1b5e0 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72  if( sp==lemp->er
1b5f0 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70  rsym ){.      sp
1b600 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73  ->dtnum = arrays
1b610 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e  ize+1;.      con
1b620 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1b630 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e   if( sp->type!=N
1b640 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73  ONTERMINAL || (s
1b650 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26  p->datatype==0 &
1b660 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d  & lemp->vartype=
1b670 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  =0) ){.      sp-
1b680 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  >dtnum = 0;.    
1b690 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b6a0 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64  }.    cp = sp->d
1b6b0 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28  atatype;.    if(
1b6c0 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65   cp==0 ) cp = le
1b6d0 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20  mp->vartype;.   
1b6e0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   j = 0;.    whil
1b6f0 65 28 20 69 73 73 70 61 63 65 28 2a 63 70 29 20  e( isspace(*cp) 
1b700 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  ) cp++;.    whil
1b710 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a  e( *cp ) stddt[j
1b720 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20  ++] = *cp++;.   
1b730 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69   while( j>0 && i
1b740 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a 2d 31  sspace(stddt[j-1
1b750 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74  ]) ) j--;.    st
1b760 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ddt[j] = 0;.    
1b770 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  if( lemp->tokent
1b780 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73 74  ype && strcmp(st
1b790 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ddt, lemp->token
1b7a0 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  type)==0 ){.    
1b7b0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
1b7c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1b7d0 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
1b7e0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1b7f0 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29  ; stddt[j]; j++)
1b800 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20 68  {.      hash = h
1b810 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a  ash*53 + stddt[j
1b820 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  ];.    }.    has
1b830 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37 66  h = (hash & 0x7f
1b840 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69 7a  ffffff)%arraysiz
1b850 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79  e;.    while( ty
1b860 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20  pes[hash] ){.   
1b870 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74 79     if( strcmp(ty
1b880 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29  pes[hash],stddt)
1b890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1b8a0 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
1b8b0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  + 1;.        bre
1b8c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b8d0 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20    hash++;.      
1b8e0 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69 67  if( hash>=(unsig
1b8f0 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20 29 20  ned)arraysize ) 
1b900 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hash = 0;.    }.
1b910 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
1b920 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
1b930 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
1b940 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65   + 1;.      type
1b950 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a  s[hash] = (char*
1b960 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
1b970 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b  rlen(stddt)+1 );
1b980 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73  .      if( types
1b990 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
1b9a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1b9b0 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
1b9c0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ry.\n");.       
1b9d0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1b9e0 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74  }.      lemon_st
1b9f0 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d  rcpy(types[hash]
1ba00 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20  ,stddt);.    }. 
1ba10 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f   }..  /* Print o
1ba20 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ut the definitio
1ba30 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45  n of YYTOKENTYPE
1ba40 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45   and YYMINORTYPE
1ba50 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d   */.  name = lem
1ba60 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e  p->name ? lemp->
1ba70 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a  name : "Parse";.
1ba80 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e    lineno = *plin
1ba90 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  eno;.  if( mhfla
1baa0 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
1bab0 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
1bac0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
1bad0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1bae0 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54  #define %sTOKENT
1baf0 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a  YPE %s\n",name,.
1bb00 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74      lemp->tokent
1bb10 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  ype?lemp->tokent
1bb20 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c  ype:"void*");  l
1bb30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d  ineno++;.  if( m
1bb40 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
1bb50 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
1bb60 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
1bb70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70  fprintf(out,"typ
1bb80 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29  edef union {\n")
1bb90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1bba0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
1bbb0 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69   yyinit;\n"); li
1bbc0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1bbd0 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e  f(out,"  %sTOKEN
1bbe0 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d  TYPE yy0;\n",nam
1bbf0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1bc00 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
1bc10 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
1bc20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20  if( types[i]==0 
1bc30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1bc40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1bc50 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73  s yy%d;\n",types
1bc60 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f  [i],i+1); lineno
1bc70 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70  ++;.    free(typ
1bc80 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  es[i]);.  }.  if
1bc90 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ( lemp->errsym->
1bca0 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
1bcb0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
1bcc0 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e   yy%d;\n",lemp->
1bcd0 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
1bce0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1bcf0 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66  free(stddt);.  f
1bd00 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70  ree(types);.  fp
1bd10 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d  rintf(out,"} YYM
1bd20 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c  INORTYPE;\n"); l
1bd30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e  ineno++;.  *plin
1bd40 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a  eno = lineno;.}.
1bd50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bd60 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61  e name of a C da
1bd70 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72  tatype able to r
1bd80 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20  epresent values 
1bd90 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61  between.** lwr a
1bda0 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76  nd upr, inclusiv
1bdb0 65 2e 20 20 49 66 20 70 6e 42 79 74 65 21 3d 4e  e.  If pnByte!=N
1bdc0 55 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ULL then also wr
1bdd0 69 74 65 20 74 68 65 20 73 69 7a 65 6f 66 0a 2a  ite the sizeof.*
1bde0 2a 20 66 6f 72 20 74 68 61 74 20 74 79 70 65 20  * for that type 
1bdf0 28 31 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e 74  (1, 2, or 4) int
1be00 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74  o *pnByte..*/.st
1be10 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1be20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79  *minimum_size_ty
1be30 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20  pe(int lwr, int 
1be40 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65  upr, int *pnByte
1be50 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1be60 2a 7a 54 79 70 65 20 3d 20 22 69 6e 74 22 3b 0a  *zType = "int";.
1be70 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 34 3b    int nByte = 4;
1be80 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b  .  if( lwr>=0 ){
1be90 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35  .    if( upr<=25
1bea0 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  5 ){.      zType
1beb0 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61   = "unsigned cha
1bec0 72 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  r";.      nByte 
1bed0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1bee0 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a  f( upr<65535 ){.
1bef0 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75        zType = "u
1bf00 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
1bf10 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  t";.      nByte 
1bf20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 2;.    }else{.
1bf30 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75        zType = "u
1bf40 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20  nsigned int";.  
1bf50 20 20 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20      nByte = 4;. 
1bf60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1bf70 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70   lwr>=-127 && up
1bf80 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a 54  r<=127 ){.    zT
1bf90 79 70 65 20 3d 20 22 73 69 67 6e 65 64 20 63 68  ype = "signed ch
1bfa0 61 72 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  ar";.    nByte =
1bfb0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1bfc0 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75  lwr>=-32767 && u
1bfd0 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20  pr<32767 ){.    
1bfe0 7a 54 79 70 65 20 3d 20 22 73 68 6f 72 74 22 3b  zType = "short";
1bff0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a  .    nByte = 2;.
1c000 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79 74 65    }.  if( pnByte
1c010 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42 79   ) *pnByte = nBy
1c020 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  te;.  return zTy
1c030 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  pe;.}../*.** Eac
1c040 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73  h state contains
1c050 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20   a set of token 
1c060 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1c070 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74  a set of.** nont
1c080 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74  erminal transact
1c090 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74  ions.  Each of t
1c0a0 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20  hese sets makes 
1c0b0 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
1c0c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c0d0 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61  structure.  An a
1c0e0 72 72 61 79 20 6f 66 20 74 68 65 73 65 20 73 74  rray of these st
1c0f0 72 75 63 74 75 72 65 73 20 69 73 20 75 73 65 64  ructures is used
1c100 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65  .** to order the
1c110 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74   creation of ent
1c120 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
1c130 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a  ction[] table..*
1c140 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74 20 7b  /.struct axset {
1c150 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1c160 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69  *stp;   /* A poi
1c170 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20  nter to a state 
1c180 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20  */.  int isTkn; 
1c190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c1a0 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e  e to use tokens.
1c1b0 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d    False for non-
1c1c0 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
1c1d0 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
1c1e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c1f0 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   actions */.  in
1c200 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20  t iOrder;       
1c210 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f     /* Original o
1c220 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73  rder of action s
1c230 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ets */.};../*.**
1c240 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65   Compare to axse
1c250 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  t structures for
1c260 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
1c270 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1c280 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f  axset_compare(co
1c290 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
1c2a0 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73  st void *b){.  s
1c2b0 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20  truct axset *p1 
1c2c0 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
1c2d0 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73  )a;.  struct axs
1c2e0 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74  et *p2 = (struct
1c2f0 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74   axset*)b;.  int
1c300 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41   c;.  c = p2->nA
1c310 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74  ction - p1->nAct
1c320 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20  ion;.  if( c==0 
1c330 29 7b 0a 20 20 20 20 63 20 3d 20 70 32 2d 3e 69  ){.    c = p2->i
1c340 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69 4f 72 64  Order - p1->iOrd
1c350 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  er;.  }.  assert
1c360 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32  ( c!=0 || p1==p2
1c370 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a   );.  return c;.
1c380 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
1c390 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61  ext on "out" tha
1c3a0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
1c3b0 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74  rule "rp"..*/.st
1c3c0 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 52  atic void writeR
1c3d0 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75  uleText(FILE *ou
1c3e0 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t, struct rule *
1c3f0 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  rp){.  int j;.  
1c400 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20  fprintf(out,"%s 
1c410 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e  ::=", rp->lhs->n
1c420 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  ame);.  for(j=0;
1c430 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b   j<rp->nrhs; j++
1c440 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1c450 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
1c460 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73  hs[j];.    if( s
1c470 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  p->type!=MULTITE
1c480 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
1c490 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73  fprintf(out," %s
1c4a0 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
1c4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c4c0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69  nt k;.      fpri
1c4d0 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73  ntf(out," %s", s
1c4e0 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
1c4f0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  me);.      for(k
1c500 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; k<sp->nsubsy
1c510 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; k++){.       
1c520 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25   fprintf(out,"|%
1c530 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  s",sp->subsym[k]
1c540 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
1c550 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
1c560 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75  * Generate C sou
1c570 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
1c580 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1c590 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73  ReportTable(.  s
1c5a0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1c5b0 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20  p,.  int mhflag 
1c5c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e      /* Output in
1c5d0 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72   makeheaders for
1c5e0 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  mat if true */.)
1c5f0 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
1c600 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  in;.  char line[
1c610 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
1c620 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75    lineno;.  stru
1c630 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1c640 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1c650 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
1c660 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
1c670 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b  acttab *pActtab;
1c680 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20  .  int i, j, n, 
1c690 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74 69  sz;.  int szActi
1c6a0 6f 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 73  onType;     /* s
1c6b0 69 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e 54 59  izeof(YYACTIONTY
1c6c0 50 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  PE) */.  int szC
1c6d0 6f 64 65 54 79 70 65 3b 20 20 20 20 20 20 20 2f  odeType;       /
1c6e0 2a 20 73 69 7a 65 6f 66 28 59 59 43 4f 44 45 54  * sizeof(YYCODET
1c6f0 59 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e 73  YPE)   */.  cons
1c700 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20  t char *name;.  
1c710 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d  int mnTknOfst, m
1c720 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20  xTknOfst;.  int 
1c730 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66  mnNtOfst, mxNtOf
1c740 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73  st;.  struct axs
1c750 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20  et *ax;..  in = 
1c760 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b  tplt_open(lemp);
1c770 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1c780 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66  eturn;.  out = f
1c790 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1c7a0 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20  c","wb");.  if( 
1c7b0 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63  out==0 ){.    fc
1c7c0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65  lose(in);.    re
1c7d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65  turn;.  }.  line
1c7e0 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78  no = 1;.  tplt_x
1c7f0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c800 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c810 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1c820 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c  he include code,
1c830 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c   if any */.  tpl
1c840 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1c850 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26  ,lemp->include,&
1c860 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d  lineno);.  if( m
1c870 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
1c880 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66 69 6c  r *incName = fil
1c890 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
1c8a0 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69   ".h");.    fpri
1c8b0 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64  ntf(out,"#includ
1c8c0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69 6e 63  e \"%s\"\n", inc
1c8d0 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Name); lineno++;
1c8e0 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e 61 6d  .    free(incNam
1c8f0 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
1c900 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c910 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c920 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
1c930 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
1c940 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
1c950 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f  mhflag ){.    co
1c960 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78  nst char *prefix
1c970 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c980 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1c990 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c9a0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
1c9b0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1c9c0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1c9d0 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65  prefix;.    else
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
1ca00 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1ca10 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
1ca20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
1ca30 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1ca40 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
1ca50 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
1ca60 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1ca70 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  );.      lineno+
1ca80 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  +;.    }.    fpr
1ca90 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1caa0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1cab0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1cac0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cad0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cae0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 64  * Generate the d
1caf0 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69  efines */.  fpri
1cb00 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1cb10 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e   YYCODETYPE %s\n
1cb20 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
1cb30 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70  ize_type(0, lemp
1cb40 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 2c 20 26 73 7a  ->nsymbol+1, &sz
1cb50 43 6f 64 65 54 79 70 65 29 29 3b 20 6c 69 6e 65  CodeType)); line
1cb60 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1cb70 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1cb80 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  OCODE %d\n",lemp
1cb90 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c  ->nsymbol+1);  l
1cba0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1cbb0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1cbc0 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c  YYACTIONTYPE %s\
1cbd0 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  n",.    minimum_
1cbe0 73 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65 6d 70  size_type(0,lemp
1cbf0 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e  ->nstate+lemp->n
1cc00 72 75 6c 65 2a 32 2b 35 2c 26 73 7a 41 63 74 69  rule*2+5,&szActi
1cc10 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f  onType)); lineno
1cc20 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1cc30 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
1cc40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1cc50 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20  fine YYWILDCARD 
1cc60 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65  %d\n",.       le
1cc70 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e  mp->wildcard->in
1cc80 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1cc90 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63    }.  print_stac
1cca0 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
1ccb0 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
1ccc0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1ccd0 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43   "#ifndef YYSTAC
1cce0 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65  KDEPTH\n"); line
1ccf0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1cd00 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20  ->stacksize ){. 
1cd10 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1cd20 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1cd30 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d  EPTH %s\n",lemp-
1cd40 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69  >stacksize);  li
1cd50 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1cd60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1cd70 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1cd80 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20  KDEPTH 100\n"); 
1cd90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1cda0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1cdb0 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1cdc0 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1cdd0 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1cde0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1cdf0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1ce00 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20  +;.  }.  name = 
1ce10 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
1ce20 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
1ce30 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61  ";.  if( lemp->a
1ce40 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b  rg && lemp->arg[
1ce50 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c 65  0] ){.    i = le
1ce60 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
1ce70 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  arg);.    while(
1ce80 20 69 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65   i>=1 && isspace
1ce90 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
1cea0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c   ) i--;.    whil
1ceb0 65 28 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c  e( i>=1 && (isal
1cec0 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  num(lemp->arg[i-
1ced0 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67  1]) || lemp->arg
1cee0 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d  [i-1]=='_') ) i-
1cef0 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  -;.    fprintf(o
1cf00 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1cf10 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e  G_SDECL %s;\n",n
1cf20 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20  ame,lemp->arg); 
1cf30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1cf40 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1cf50 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20  ine %sARG_PDECL 
1cf60 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  ,%s\n",name,lemp
1cf70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->arg);  lineno+
1cf80 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1cf90 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1cfa0 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79 79 70  G_FETCH %s = yyp
1cfb0 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20  Parser->%s\n",. 
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26  name,lemp->arg,&
1cfe0 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1cff0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1d000 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d010 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79  ne %sARG_STORE y
1d020 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25  ypParser->%s = %
1d030 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d040 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d         name,&lem
1d050 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d  p->arg[i],&lemp-
1d060 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1d070 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
1d080 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1d090 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1d0a0 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
1d0b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1d0c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1d0d0 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c   %sARG_PDECL\n",
1d0e0 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1d0f0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d100 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1d110 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b  _FETCH\n",name);
1d120 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1d130 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1d140 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c  ine %sARG_STORE\
1d150 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1d160 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68  ++;.  }.  if( mh
1d170 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69  flag ){.    fpri
1d180 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
1d190 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d1a0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65   }.  if( lemp->e
1d1b0 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b  rrsym->useCnt ){
1d1c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1d1d0 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f  ,"#define YYERRO
1d1e0 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65  RSYMBOL %d\n",le
1d1f0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65  mp->errsym->inde
1d200 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1d210 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1d220 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44  define YYERRSYMD
1d230 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  T yy%d\n",lemp->
1d240 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
1d250 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1d260 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61  if( lemp->has_fa
1d270 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70  llback ){.    fp
1d280 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d290 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c  ne YYFALLBACK 1\
1d2a0 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
1d2b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1d2c0 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1d2d0 6c 65 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 6f  le, but do not o
1d2e0 75 74 70 75 74 20 69 74 20 79 65 74 2e 20 20 54  utput it yet.  T
1d2f0 68 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74  he action.  ** t
1d300 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63 6f 6d  able must be com
1d310 70 75 74 65 64 20 62 65 66 6f 72 65 20 67 65 6e  puted before gen
1d320 65 72 61 74 69 6e 67 20 74 68 65 20 59 59 4e 53  erating the YYNS
1d330 54 41 54 45 20 6d 61 63 72 6f 20 62 65 63 61 75  TATE macro becau
1d340 73 65 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64 20  se.  ** we need 
1d350 74 6f 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79  to know how many
1d360 20 73 74 61 74 65 73 20 63 61 6e 20 62 65 20 65   states can be e
1d370 6c 69 6d 69 6e 61 74 65 64 2e 0a 20 20 2a 2f 0a  liminated..  */.
1d380 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20 61    ax = (struct a
1d390 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c  xset *) calloc(l
1d3a0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20  emp->nxstate*2, 
1d3b0 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a  sizeof(ax[0]));.
1d3c0 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20    if( ax==0 ){. 
1d3d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1d3e0 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
1d3f0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1d400 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1d410 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
1d420 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
1d430 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1d440 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e  i];.    ax[i*2].
1d450 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61  stp = stp;.    a
1d460 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31  x[i*2].isTkn = 1
1d470 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41  ;.    ax[i*2].nA
1d480 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b  ction = stp->nTk
1d490 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32  nAct;.    ax[i*2
1d4a0 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20  +1].stp = stp;. 
1d4b0 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54     ax[i*2+1].isT
1d4c0 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69  kn = 0;.    ax[i
1d4d0 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20  *2+1].nAction = 
1d4e0 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d  stp->nNtAct;.  }
1d4f0 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d  .  mxTknOfst = m
1d500 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20  nTknOfst = 0;.  
1d510 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f  mxNtOfst = mnNtO
1d520 66 73 74 20 3d 20 30 3b 0a 20 20 2f 2a 20 49 6e  fst = 0;.  /* In
1d530 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6d 69   an effort to mi
1d540 6e 69 6d 69 7a 65 20 74 68 65 20 61 63 74 69 6f  nimize the actio
1d550 6e 20 74 61 62 6c 65 20 73 69 7a 65 2c 20 75 73  n table size, us
1d560 65 20 74 68 65 20 68 65 75 72 69 73 74 69 63 0a  e the heuristic.
1d570 20 20 2a 2a 20 6f 66 20 70 6c 61 63 69 6e 67 20    ** of placing 
1d580 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74 69  the largest acti
1d590 6f 6e 20 73 65 74 73 20 66 69 72 73 74 20 2a 2f  on sets first */
1d5a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1d5b0 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 3b 20 69  mp->nxstate*2; i
1d5c0 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72  ++) ax[i].iOrder
1d5d0 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78   = i;.  qsort(ax
1d5e0 2c 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a  , lemp->nxstate*
1d5f0 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
1d600 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29  , axset_compare)
1d610 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63  ;.  pActtab = ac
1d620 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  ttab_alloc();.  
1d630 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1d640 3e 6e 78 73 74 61 74 65 2a 32 20 26 26 20 61 78  >nxstate*2 && ax
1d650 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69  [i].nAction>0; i
1d660 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61  ++){.    stp = a
1d670 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66  x[i].stp;.    if
1d680 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b  ( ax[i].isTkn ){
1d690 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
1d6a0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1d6b0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1d6c0 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
1d6d0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1d6e0 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74  >index>=lemp->nt
1d6f0 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
1d700 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
1d710 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
1d720 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1d730 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
1d740 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
1d750 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
1d760 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
1d770 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
1d780 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
1d790 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66       stp->iTknOf
1d7a0 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65  st = acttab_inse
1d7b0 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20  rt(pActtab);.   
1d7c0 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e     if( stp->iTkn
1d7d0 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29  Ofst<mnTknOfst )
1d7e0 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70   mnTknOfst = stp
1d7f0 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1d800 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f    if( stp->iTknO
1d810 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20  fst>mxTknOfst ) 
1d820 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d  mxTknOfst = stp-
1d830 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d  >iTknOfst;.    }
1d840 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
1d850 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1d860 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1d870 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
1d880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1d890 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
1d8a0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
1d8b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d8c0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1d8d0 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  x==lemp->nsymbol
1d8e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d8f0 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f       action = co
1d900 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
1d910 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
1d920 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63  if( action<0 ) c
1d930 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d940 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70   acttab_action(p
1d950 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e  Acttab, ap->sp->
1d960 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a  index, action);.
1d970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
1d980 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74  p->iNtOfst = act
1d990 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74  tab_insert(pActt
1d9a0 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ab);.      if( s
1d9b0 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74  tp->iNtOfst<mnNt
1d9c0 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20  Ofst ) mnNtOfst 
1d9d0 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1d9e0 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1d9f0 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20  NtOfst>mxNtOfst 
1da00 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mxNtOfst = stp
1da10 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d  ->iNtOfst;.    }
1da20 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b  .  }.  free(ax);
1da30 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 20 72 65  ..  /* Finish re
1da40 6e 64 65 72 69 6e 67 20 74 68 65 20 63 6f 6e 73  ndering the cons
1da50 74 61 6e 74 73 20 6e 6f 77 20 74 68 61 74 20 74  tants now that t
1da60 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
1da70 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
1da80 6d 70 75 74 65 64 20 2a 2f 0a 20 20 66 70 72 69  mputed */.  fpri
1da90 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1daa0 20 59 59 4e 53 54 41 54 45 20 20 20 20 20 20 20   YYNSTATE       
1dab0 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70        %d\n",lemp
1dac0 2d 3e 6e 78 73 74 61 74 65 29 3b 20 20 6c 69 6e  ->nxstate);  lin
1dad0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1dae0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1daf0 4e 52 55 4c 45 20 20 20 20 20 20 20 20 20 20 20  NRULE           
1db00 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e     %d\n",lemp->n
1db10 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  rule);  lineno++
1db20 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1db30 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f  "#define YY_MAX_
1db40 53 48 49 46 54 20 20 20 20 20 20 20 20 20 25 64  SHIFT         %d
1db50 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
1db60 2d 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  -1);  lineno++;.
1db70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1db80 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 53 48  define YY_MIN_SH
1db90 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c 6e  IFTREDUCE   %d\n
1dba0 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1dbb0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d   lineno++;.  i =
1dbc0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1dbd0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66  lemp->nrule;.  f
1dbe0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1dbf0 69 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54  ine YY_MAX_SHIFT
1dc00 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 20  REDUCE   %d\n", 
1dc10 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i-1); lineno++;.
1dc20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1dc30 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 52 45  define YY_MIN_RE
1dc40 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e  DUCE        %d\n
1dc50 22 2c 20 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", i); lineno++;
1dc60 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  i = lemp->nst
1dc70 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1dc80 65 2a 32 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e*2;.  fprintf(o
1dc90 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
1dca0 41 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 20  AX_REDUCE       
1dcb0 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69   %d\n", i-1); li
1dcc0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1dcd0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1dce0 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20  Y_ERROR_ACTION  
1dcf0 20 20 20 20 25 64 5c 6e 22 2c 20 69 29 3b 20 6c      %d\n", i); l
1dd00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1dd10 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1dd20 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e  YY_ACCEPT_ACTION
1dd30 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2b 31 29       %d\n", i+1)
1dd40 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1dd50 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1dd60 6e 65 20 59 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20  ne YY_NO_ACTION 
1dd70 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
1dd80 2b 32 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +2); lineno++;. 
1dd90 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1dda0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ddb0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  neno);..  /* Now
1ddc0 20 6f 75 74 70 75 74 20 74 68 65 20 61 63 74 69   output the acti
1ddd0 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73  on table and its
1dde0 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a   associates:.  *
1ddf0 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f  *.  **  yy_actio
1de00 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e  n[]        A sin
1de10 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  gle table contai
1de20 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73  ning all actions
1de30 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61  ..  **  yy_looka
1de40 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62  head[]     A tab
1de50 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1de60 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20  e lookahead for 
1de70 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20  each entry in.  
1de80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1de90 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e         yy_action
1dea0 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
1deb0 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
1dec0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66  s..  **  yy_shif
1ded0 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20  t_ofst[]    For 
1dee0 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1def0 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1df00 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d     shifting term
1df30 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  inals..  **  yy_
1df40 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
1df50 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1df60 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1df70 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1df80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1df90 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1dfa0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66  non-terminals af
1dfb0 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20  ter a reduce..  
1dfc0 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  **  yy_default[]
1dfd0 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61         Default a
1dfe0 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
1dff0 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  tate..  */..  /*
1e000 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61   Output the yy_a
1e010 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
1e020 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61   lemp->nactionta
1e030 62 20 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  b = n = acttab_s
1e040 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
1e050 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
1e060 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70  += n*szActionTyp
1e070 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
1e080 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54  ,"#define YY_ACT
1e090 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e  TAB_COUNT (%d)\n
1e0a0 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", n); lineno++;
1e0b0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1e0c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
1e0d0 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74  CTIONTYPE yy_act
1e0e0 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ion[] = {\n"); l
1e0f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1e100 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1e110 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20  .    int action 
1e120 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f  = acttab_yyactio
1e130 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20  n(pActtab, i);. 
1e140 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1e150 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ) action = lemp-
1e160 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1e170 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69  nrule + 2;.    i
1e180 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1e190 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1e1a0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1e1b0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1e1c0 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  ", action);.    
1e1d0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1e1e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1e1f0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1e200 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1e210 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1e220 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1e230 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1e240 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1e250 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1e260 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f  utput the yy_loo
1e270 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a  kahead table */.
1e280 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
1e290 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70  e += n*szCodeTyp
1e2a0 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
1e2b0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1e2c0 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
1e2d0 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
1e2e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1e2f0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1e300 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
1e310 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
1e320 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
1e330 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
1e340 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
1e350 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
1e360 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1e370 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1e380 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e390 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
1e3a0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1e3b0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1e3c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1e3d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1e3e0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1e3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1e400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1e410 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1e420 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1e430 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1e440 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
1e450 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1e460 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1e470 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c  YY_SHIFT_USE_DFL
1e480 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e  T (%d)\n", mnTkn
1e490 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1e4a0 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1e4b0 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  xstate;.  while(
1e4c0 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
1e4d0 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
1e4e0 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1e4f0 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
1e500 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1e510 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64  _SHIFT_COUNT (%d
1e520 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  )\n", n-1); line
1e530 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1e540 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1e550 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64  _SHIFT_MIN   (%d
1e560 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29  )\n", mnTknOfst)
1e570 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1e580 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1e590 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58  ine YY_SHIFT_MAX
1e5a0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b     (%d)\n", mxTk
1e5b0 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1e5c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1e5d0 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25   "static const %
1e5e0 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  s yy_shift_ofst[
1e5f0 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1e600 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1e610 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74  e_type(mnTknOfst
1e620 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 2c 20 26  -1, mxTknOfst, &
1e630 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  sz)); lineno++;.
1e640 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
1e650 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72  e += n*sz;.  for
1e660 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1e670 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
1e680 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1e690 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1e6a0 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  ofst = stp->iTkn
1e6b0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1e6c0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1e6d0 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74  ofst = mnTknOfst
1e6e0 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1e6f0 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1e700 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1e710 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1e720 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1e730 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1e740 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1e750 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1e760 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1e770 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1e780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e790 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1e7a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e7b0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1e7c0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1e7d0 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  he yy_reduce_ofs
1e7e0 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1e7f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1e800 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55  fine YY_REDUCE_U
1e810 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1e820 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69   mnNtOfst-1); li
1e830 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1e840 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77  mp->nxstate;.  w
1e850 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1e860 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1e870 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1e880 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1e890 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1e8a0 65 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e  e YY_REDUCE_COUN
1e8b0 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b  T (%d)\n", n-1);
1e8c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1e8d0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1e8e0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e  ne YY_REDUCE_MIN
1e8f0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74     (%d)\n", mnNt
1e900 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1e910 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1e920 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1e930 43 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  CE_MAX   (%d)\n"
1e940 2c 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e  , mxNtOfst); lin
1e950 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1e960 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1e970 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1e980 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1e990 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1e9a0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1e9b0 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1e9c0 74 2c 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f  t, &sz)); lineno
1e9d0 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  ++;.  lemp->tabl
1e9e0 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20  esize += n*sz;. 
1e9f0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1ea00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1ea10 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1ea20 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1ea30 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1ea40 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1ea50 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1ea60 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1ea70 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1ea80 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1ea90 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1eaa0 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1eab0 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1eac0 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1ead0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1eae0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1eaf0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1eb00 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1eb10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eb20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1eb30 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1eb40 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1eb50 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1eb60 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1eb70 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1eb80 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1eb90 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1eba0 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1ebb0 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1ebc0 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1ebd0 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 6c 65  p->nxstate;.  le
1ebe0 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
1ebf0 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b   n*szActionType;
1ec00 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1ec10 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  n; i++){.    stp
1ec20 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1ec30 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  i];.    if( j==0
1ec40 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1ec50 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1ec60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1ec70 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d  t, " %4d,", stp-
1ec80 3e 69 44 66 6c 74 52 65 64 75 63 65 2b 6c 65 6d  >iDfltReduce+lem
1ec90 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
1eca0 6e 72 75 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nrule);.    if( 
1ecb0 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1ecc0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1ecd0 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1ece0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1ecf0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1ed00 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1ed10 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1ed20 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1ed30 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
1ed40 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1ed50 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1ed60 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1ed70 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63  table of fallbac
1ed80 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  k tokens..  */. 
1ed90 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
1eda0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69  allback ){.    i
1edb0 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74  nt mx = lemp->nt
1edc0 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20  erminal - 1;.   
1edd0 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20   while( mx>0 && 
1ede0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78  lemp->symbols[mx
1edf0 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  ]->fallback==0 )
1ee00 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65  { mx--; }.    le
1ee10 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
1ee20 20 28 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79   (mx+1)*szCodeTy
1ee30 70 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pe;.    for(i=0;
1ee40 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20   i<=mx; i++){.  
1ee50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1ee60 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
1ee70 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1ee80 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
1ee90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
1eea0 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
1eeb0 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
1eec0 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
1eed0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
1eee0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
1eef0 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
1ef00 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
1ef10 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
1ef20 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
1ef30 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
1ef40 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
1ef50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ef60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1ef70 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1ef80 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
1ef90 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
1efa0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1efb0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1efc0 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
1efd0 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
1efe0 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
1eff0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1f000 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
1f010 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65  mon_sprintf(line
1f020 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d  ,"\"%s\",",lemp-
1f030 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1f040 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e);.    fprintf(
1f050 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69  out,"  %-15s",li
1f060 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26  ne);.    if( (i&
1f070 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66  3)==3 ){ fprintf
1f080 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1f090 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  no++; }.  }.  if
1f0a0 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70  ( (i&3)!=0 ){ fp
1f0b0 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1f0c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74   lineno++; }.  t
1f0d0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1f0e0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1f0f0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1f100 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
1f110 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74  aining a text st
1f120 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
1f130 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  bes every.  ** r
1f140 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20  ule in the rule 
1f150 73 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  set of the gramm
1f160 61 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  ar.  This inform
1f170 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20  ation is used.  
1f180 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20  ** when tracing 
1f190 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a  REDUCE actions..
1f1a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1f1b0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1f1c0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20  p; rp=rp->next, 
1f1d0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
1f1e0 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29  ( rp->index==i )
1f1f0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1f200 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22  t," /* %3d */ \"
1f210 22 2c 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65  ", i);.    write
1f220 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1f230 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1f240 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e  ut,"\",\n"); lin
1f250 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1f260 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1f270 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1f280 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1f290 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1f2a0 63 75 74 65 73 20 65 76 65 72 79 20 74 69 6d 65  cutes every time
1f2b0 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70   a symbol is pop
1f2c0 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ped from.  ** th
1f2d0 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72  e stack while pr
1f2e0 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20  ocessing errors 
1f2f0 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79  or while destroy
1f300 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 2e 20  ing the parser. 
1f310 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20  .  ** (In other 
1f320 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20  words, generate 
1f330 74 68 65 20 25 64 65 73 74 72 75 63 74 6f 72 20  the %destructor 
1f340 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20  actions).  */.  
1f350 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  if( lemp->tokend
1f360 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  est ){.    int o
1f370 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
1f380 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1f390 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1f3a0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1f3b0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1f3c0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1f3d0 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
1f3e0 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29  type!=TERMINAL )
1f3f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f400 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1f410 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1f420 2c 20 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d  , "      /* TERM
1f430 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1f440 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1f450 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1f460 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1f470 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1f480 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1f490 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1f4a0 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1f4b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1f4c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1f4d0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c  mp->nsymbol && l
1f4e0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1f4f0 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b  >type!=TERMINAL;
1f500 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69   i++);.    if( i
1f510 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  <lemp->nsymbol )
1f520 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1f530 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1f540 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1f550 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
1f560 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1f570 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1f580 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1f590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1f5a0 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
1f5b0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1f5c0 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b  ol *dflt_sp = 0;
1f5d0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1f5e0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1f5f0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1f600 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1f610 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1f620 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1f630 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1f640 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1f650 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20  TERMINAL ||.    
1f660 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c        sp->index<
1f670 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  =0 || sp->destru
1f680 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor!=0 ) contin
1f690 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
1f6a0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
1f6b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1f6c0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e    /* Default NON
1f6d0 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75  -TERMINAL Destru
1f6e0 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ctor */\n"); lin
1f6f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
1f700 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
1f710 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1f720 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1f730 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70   /* %s */\n", sp
1f740 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
1f750 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1f760 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70      dflt_sp = sp
1f770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f780 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20  dflt_sp!=0 ){.  
1f790 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
1f7a0 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c  tor_code(out,dfl
1f7b0 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t_sp,lemp,&linen
1f7c0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  o);.    }.    fp
1f7d0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1f7e0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1f7f0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72  eno++;.  }.  for
1f800 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1f810 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1f820 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1f830 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1f840 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
1f850 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
1f860 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
1f870 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
1f880 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f890 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1f8a0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
1f8b0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
1f8c0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
1f8d0 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43  eno++;..    /* C
1f8e0 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65  ombine duplicate
1f8f0 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74   destructors int
1f900 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20  o a single case 
1f910 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  */.    for(j=i+1
1f920 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; j<lemp->nsymbo
1f930 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; j++){.      s
1f940 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1f950 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  2 = lemp->symbol
1f960 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[j];.      if( 
1f970 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65  sp2 && sp2->type
1f980 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70  !=TERMINAL && sp
1f990 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20  2->destructor.  
1f9a0 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e          && sp2->
1f9b0 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d  dtnum==sp->dtnum
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 74  .          && st
1f9d0 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63  rcmp(sp->destruc
1f9e0 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63  tor,sp2->destruc
1f9f0 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tor)==0 ){.     
1fa00 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1fa10 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1fa20 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 73 70 32 2d              sp2-
1fa40 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d  >index, sp2->nam
1fa50 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1fa60 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74         sp2->dest
1fa70 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20  ructor = 0;.    
1fa80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65    }.    }..    e
1fa90 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1faa0 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
1fab0 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
1fac0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
1fad0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1fae0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1faf0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1fb00 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1fb10 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1fb20 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1fb30 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1fb40 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  tes whenever the
1fb50 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76   parser stack ov
1fb60 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c  erflows */.  tpl
1fb70 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1fb80 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c  ,lemp->overflow,
1fb90 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1fba0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1fbb0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1fbc0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1fbd0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75   the table of ru
1fbe0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a  le information .
1fbf0 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
1fc00 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1fc10 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1fc20 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d  at rules are num
1fc30 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74  ber.  ** sequent
1fc40 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20  ually beginning 
1fc50 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66  with 0..  */.  f
1fc60 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1fc70 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1fc80 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t){.    fprintf(
1fc90 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20  out,"  { %d, %d 
1fca0 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69  },\n",rp->lhs->i
1fcb0 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20  ndex,rp->nrhs); 
1fcc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1fcd0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1fce0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1fcf0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1fd00 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1fd10 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67  execution during
1fd20 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74   each REDUCE act
1fd30 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ion */.  for(rp=
1fd40 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1fd50 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1fd60 20 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65    translate_code
1fd70 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a  (lemp, rp);.  }.
1fd80 20 20 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75    /* First outpu
1fd90 74 20 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68  t rules other th
1fda0 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  an the default: 
1fdb0 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70  rule */.  for(rp
1fdc0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1fdd0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1fde0 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
1fdf0 72 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rp2;            
1fe00 20 20 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65     /* Other rule
1fe10 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  s with the same 
1fe20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  action */.    if
1fe30 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20  ( rp->code==0 ) 
1fe40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1fe50 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27  ( rp->code[0]=='
1fe60 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b  \n' && rp->code[
1fe70 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  1]==0 ) continue
1fe80 3b 20 2f 2a 20 57 69 6c 6c 20 62 65 20 64 65 66  ; /* Will be def
1fe90 61 75 6c 74 3a 20 2a 2f 0a 20 20 20 20 66 70 72  ault: */.    fpr
1fea0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1feb0 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72  case %d: /* ", r
1fec0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77  p->index);.    w
1fed0 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1fee0 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
1fef0 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29  tf(out, " */\n")
1ff00 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1ff10 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74  for(rp2=rp->next
1ff20 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e  ; rp2; rp2=rp2->
1ff30 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1ff40 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e   rp2->code==rp->
1ff50 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
1ff60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1ff70 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22     case %d: /* "
1ff80 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  , rp2->index);. 
1ff90 20 20 20 20 20 20 20 77 72 69 74 65 52 75 6c 65         writeRule
1ffa0 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a  Text(out, rp2);.
1ffb0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1ffc0 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63  out," */ yytestc
1ffd0 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
1ffe0 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e 64 65  );\n", rp2->inde
1fff0 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
20000 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20        rp2->code 
20010 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
20020 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65   }.    emit_code
20030 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69  (out,rp,lemp,&li
20040 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
20050 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
20060 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
20070 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  no++;.    rp->co
20080 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  de = 0;.  }.  /*
20090 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74   Finally, output
200a0 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
200b0 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61  le.  We choose a
200c0 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61  s the default: a
200d0 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63  ll.  ** empty ac
200e0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69  tions. */.  fpri
200f0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64  ntf(out,"      d
20100 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e  efault:\n"); lin
20110 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d  eno++;.  for(rp=
20120 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
20130 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
20140 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
20150 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20160 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 63 6f    assert( rp->co
20170 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72  de[0]=='\n' && r
20180 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 3b  p->code[1]==0 );
20190 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
201a0 2c 22 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20  ,"      /* (%d) 
201b0 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ", rp->index);. 
201c0 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
201d0 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
201e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f  printf(out, " */
201f0 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
20200 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
20210 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
20220 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
20230 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
20240 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
20250 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
20260 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
20270 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
20280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
20290 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
202a0 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c   if a parse fail
202b0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
202c0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
202d0 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f  >failure,&lineno
202e0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
202f0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
20300 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
20310 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
20320 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
20330 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
20340 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70  r occurs */.  tp
20350 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
20360 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c  p,lemp->error,&l
20370 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
20380 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
20390 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
203a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
203b0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
203c0 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73  es when the pars
203d0 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69  er accepts its i
203e0 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  nput */.  tplt_p
203f0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
20400 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65  mp->accept,&line
20410 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
20420 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
20430 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
20440 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
20450 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
20460 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
20470 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
20480 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
20490 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  acode,&lineno);.
204a0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
204b0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
204c0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
204d0 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
204e0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
204f0 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
20500 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20  rtHeader(struct 
20510 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
20520 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
20530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
20540 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
20550 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
20560 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
20570 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
20580 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
20590 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
205a0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
205b0 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
205e0 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
205f0 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b  lemp,".h","rb");
20600 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20  .  if( in ){.   
20610 20 69 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20   int nextChar;. 
20620 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
20630 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
20640 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
20650 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a  SIZE,in); i++){.
20660 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
20670 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
20680 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64  fine %s%-30s %3d
20690 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
206a0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
206b0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
206c0 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
206d0 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65   if( strcmp(line
206e0 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61  ,pattern) ) brea
206f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  k;.    }.    nex
20700 74 43 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e  tChar = fgetc(in
20710 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  );.    fclose(in
20720 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65  );.    if( i==le
20730 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
20740 20 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29   nextChar==EOF )
20750 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
20760 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
20770 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
20780 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
20790 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
207a0 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
207b0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
207c0 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
207d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
207e0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
207f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
20800 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20810 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c   %s%-30s %3d\n",
20820 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
20830 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
20840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
20850 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20  se(out);  .  }. 
20860 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
20870 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f  educe the size o
20880 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  f the action tab
20890 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  les, if possible
208a0 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a  , by making use.
208b0 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a  ** of defaults..
208c0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  **.** In this ve
208d0 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74  rsion, we take t
208e0 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
208f0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61   REDUCE action a
20900 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  nd make.** it th
20910 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65  e default.  Exce
20920 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pt, there is no 
20930 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77  default if the w
20940 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a  ildcard token.**
20950 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c   is a possible l
20960 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f  ook-ahead..*/.vo
20970 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
20980 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
20990 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
209a0 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
209b0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
209c0 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74  , *ap2;.  struct
209d0 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c   rule *rp, *rp2,
209e0 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e   *rbest;.  int n
209f0 62 65 73 74 2c 20 6e 2c 20 6e 73 68 69 66 74 3b  best, n, nshift;
20a00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
20a10 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20  usesWildcard;.. 
20a20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
20a30 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
20a40 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
20a50 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
20a60 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
20a70 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  est = 0;.    use
20a80 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a  sWildcard = 0;..
20a90 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
20aa0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
20ab0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
20ac0 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
20ad0 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d  && ap->sp==lemp-
20ae0 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
20af0 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72       usesWildcar
20b00 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
20b10 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
20b20 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
20b30 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
20b40 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
20b50 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72   if( rp->lhsStar
20b60 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
20b70 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
20b80 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
20b90 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
20ba0 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
20bb0 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
20bc0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
20bd0 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
20be0 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
20bf0 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
20c00 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
20c10 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
20c20 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
20c30 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
20c40 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
20c50 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
20c60 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
20c70 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
20c80 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
20c90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
20ca0 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
20cb0 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  a default if the
20cc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   number of rules
20cd0 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
20ce0 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  ** is not at lea
20cf0 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77  st 1 or if the w
20d00 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73  ildcard token is
20d10 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   a possible.    
20d20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20  ** lookahead..  
20d30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65    */.    if( nbe
20d40 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64  st<1 || usesWild
20d50 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  card ) continue;
20d60 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ...    /* Combin
20d70 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43  e matching REDUC
20d80 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61  E actions into a
20d90 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20   single default 
20da0 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  */.    for(ap=st
20db0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
20dc0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
20dd0 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
20de0 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
20df0 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a  =rbest ) break;.
20e00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20e10 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e  ( ap );.    ap->
20e20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
20e30 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
20e40 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78    for(ap=ap->nex
20e50 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  t; ap; ap=ap->ne
20e60 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
20e70 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
20e80 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
20e90 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20  st ) ap->type = 
20ea0 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a  NOT_USED;.    }.
20eb0 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
20ec0 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
20ed0 70 29 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d  p);..    for(ap=
20ee0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
20ef0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
20f00 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53   if( ap->type==S
20f10 48 49 46 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  HIFT ) break;.  
20f20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
20f30 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e  ==REDUCE && ap->
20f40 78 2e 72 70 21 3d 72 62 65 73 74 20 29 20 62 72  x.rp!=rbest ) br
20f50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
20f60 66 28 20 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( ap==0 ){.    
20f70 20 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63    stp->autoReduc
20f80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 74 70  e = 1;.      stp
20f90 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 20 3d 20  ->pDfltReduce = 
20fa0 72 62 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rbest;.    }.  }
20fb0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65  ..  /* Make a se
20fc0 63 6f 6e 64 20 70 61 73 73 20 6f 76 65 72 20 61  cond pass over a
20fd0 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 61 63  ll states and ac
20fe0 74 69 6f 6e 73 2e 20 20 43 6f 6e 76 65 72 74 0a  tions.  Convert.
20ff0 20 20 2a 2a 20 65 76 65 72 79 20 61 63 74 69 6f    ** every actio
21000 6e 20 74 68 61 74 20 69 73 20 61 20 53 48 49 46  n that is a SHIF
21010 54 20 74 6f 20 61 6e 20 61 75 74 6f 52 65 64 75  T to an autoRedu
21020 63 65 20 73 74 61 74 65 20 69 6e 74 6f 0a 20 20  ce state into.  
21030 2a 2a 20 61 20 53 48 49 46 54 52 45 44 55 43 45  ** a SHIFTREDUCE
21040 20 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20   action..  */.  
21050 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
21060 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
21070 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
21080 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
21090 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
210a0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
210b0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
210c0 74 65 20 2a 70 4e 65 78 74 53 74 61 74 65 3b 0a  te *pNextState;.
210d0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
210e0 70 65 21 3d 53 48 49 46 54 20 29 20 63 6f 6e 74  pe!=SHIFT ) cont
210f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e 65 78  inue;.      pNex
21100 74 53 74 61 74 65 20 3d 20 61 70 2d 3e 78 2e 73  tState = ap->x.s
21110 74 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  tp;.      if( pN
21120 65 78 74 53 74 61 74 65 2d 3e 61 75 74 6f 52 65  extState->autoRe
21130 64 75 63 65 20 26 26 20 70 4e 65 78 74 53 74 61  duce && pNextSta
21140 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 21  te->pDfltReduce!
21150 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
21160 2d 3e 74 79 70 65 20 3d 20 53 48 49 46 54 52 45  ->type = SHIFTRE
21170 44 55 43 45 3b 0a 20 20 20 20 20 20 20 20 61 70  DUCE;.        ap
21180 2d 3e 78 2e 72 70 20 3d 20 70 4e 65 78 74 53 74  ->x.rp = pNextSt
21190 61 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65  ate->pDfltReduce
211a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
211b0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f    }.}.../*.** Co
211c0 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73  mpare two states
211d0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
211e0 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c  poses.  The smal
211f0 6c 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65  ler state is the
21200 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65  .** one with the
21210 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e   most non-termin
21220 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20  al actions.  If 
21230 74 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  they have the sa
21240 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  me number.** of 
21250 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74  non-terminal act
21260 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73  ions, then the s
21270 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e  maller is the on
21280 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a  e with the most.
21290 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73  ** token actions
212a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
212b0 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
212c0 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61  re(const void *a
212d0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29  , const void *b)
212e0 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  {.  const struct
212f0 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63   state *pA = *(c
21300 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
21310 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73  e**)a;.  const s
21320 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20  truct state *pB 
21330 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
21340 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e   state**)b;.  in
21350 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e  t n;..  n = pB->
21360 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74  nNtAct - pA->nNt
21370 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20  Act;.  if( n==0 
21380 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e  ){.    n = pB->n
21390 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b  TknAct - pA->nTk
213a0 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d  nAct;.    if( n=
213b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 ){.      n = 
213c0 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70  pB->statenum - p
213d0 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20  A->statenum;.   
213e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
213f0 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n!=0 );.  retur
21400 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n n;.}.../*.** R
21410 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f  enumber and reso
21420 72 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  rt states so tha
21430 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
21440 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f  wer choices.** o
21450 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e  ccur at the end.
21460 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73    Except, keep s
21470 74 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69  tate 0 as the fi
21480 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  rst state..*/.vo
21490 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
214a0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
214b0 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
214c0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
214d0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
214e0 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28  ion *ap;..  for(
214f0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
21500 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
21510 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
21520 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e  d[i];.    stp->n
21530 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e  TknAct = stp->nN
21540 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  tAct = 0;.    st
21550 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d  p->iDfltReduce =
21560 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 2f   lemp->nrule;  /
21570 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74 69  * Init dflt acti
21580 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65 72  on to "syntax er
21590 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70 2d  ror" */.    stp-
215a0 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f  >iTknOfst = NO_O
215b0 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e  FFSET;.    stp->
215c0 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  iNtOfst = NO_OFF
215d0 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  SET;.    for(ap=
215e0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
215f0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
21600 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20 63   int iAction = c
21610 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
21620 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69 66  mp,ap);.      if
21630 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a  ( iAction>=0 ){.
21640 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
21650 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
21660 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
21670 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e         stp->nTkn
21680 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
21690 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d  else if( ap->sp-
216a0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79  >index<lemp->nsy
216b0 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mbol ){.        
216c0 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b    stp->nNtAct++;
216d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
216e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
216f0 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63  ( stp->autoReduc
21700 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44 66  e==0 || stp->pDf
21710 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78 2e  ltReduce==ap->x.
21720 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rp );.          
21730 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65  stp->iDfltReduce
21740 20 3d 20 69 41 63 74 69 6f 6e 20 2d 20 6c 65 6d   = iAction - lem
21750 70 2d 3e 6e 73 74 61 74 65 20 2d 20 6c 65 6d 70  p->nstate - lemp
21760 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20  ->nrule;.       
21770 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21780 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65  .  }.  qsort(&le
21790 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c  mp->sorted[1], l
217a0 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73  emp->nstate-1, s
217b0 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74  izeof(lemp->sort
217c0 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  ed[0]),.        
217d0 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
217e0 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  re);.  for(i=0; 
217f0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
21800 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
21810 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65  sorted[i]->state
21820 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c  num = i;.  }.  l
21830 65 6d 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c  emp->nxstate = l
21840 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
21850 68 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74  hile( lemp->nxst
21860 61 74 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73  ate>1 && lemp->s
21870 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74  orted[lemp->nxst
21880 61 74 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75  ate-1]->autoRedu
21890 63 65 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ce ){.    lemp->
218a0 6e 78 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d  nxstate--;.  }.}
218b0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
218c0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
218d0 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a  ile "set.c" ****
218e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21900 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69  /./*.** Set mani
21910 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  pulation routine
21920 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  s for the LEMON 
21930 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
21940 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
21950 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53   size = 0;../* S
21960 65 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20  et the set size 
21970 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28  */.void SetSize(
21980 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20  int n).{.  size 
21990 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  = n+1;.}../* All
219a0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20  ocate a new set 
219b0 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
219c0 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20  ){.  char *s;.  
219d0 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f  s = (char*)callo
219e0 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69  c( size, 1);.  i
219f0 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65  f( s==0 ){.    e
21a00 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
21a10 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d  y_error();.    m
21a20 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
21a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d   }.  return s;.}
21a40 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  ../* Deallocate 
21a50 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65  a set */.void Se
21a60 74 46 72 65 65 28 63 68 61 72 20 2a 73 29 0a 7b  tFree(char *s).{
21a70 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f  .  free(s);.}../
21a80 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
21a90 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20  ent to the set. 
21aa0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
21ab0 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20  the element was 
21ac0 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c  added.** and FAL
21ad0 53 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72  SE if it was alr
21ae0 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69  eady there. */.i
21af0 6e 74 20 53 65 74 41 64 64 28 63 68 61 72 20 2a  nt SetAdd(char *
21b00 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69 6e  s, int e).{.  in
21b10 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20  t rv;.  assert( 
21b20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29  e>=0 && e<size )
21b30 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20  ;.  rv = s[e];. 
21b40 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74   s[e] = 1;.  ret
21b50 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41  urn !rv;.}../* A
21b60 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  dd every element
21b70 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52   of s2 to s1.  R
21b80 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31  eturn TRUE if s1
21b90 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74   changes. */.int
21ba0 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a   SetUnion(char *
21bb0 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b 0a  s1, char *s2).{.
21bc0 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73    int i, progres
21bd0 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20  s;.  progress = 
21be0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
21bf0 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
21c00 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63  if( s2[i]==0 ) c
21c10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
21c20 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20   s1[i]==0 ){.   
21c30 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
21c40 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31  .      s1[i] = 1
21c50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21c60 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d  turn progress;.}
21c70 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
21c80 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
21c90 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22  e file "table.c"
21ca0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
21cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
21cc0 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
21cd0 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
21ce0 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
21cf0 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
21d00 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
21d10 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
21d20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21d30 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
21d40 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
21d50 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
21d60 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
21d70 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
21d80 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
21d90 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
21da0 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
21db0 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
21dc0 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
21dd0 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
21de0 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
21df0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
21e00 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
21e10 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e  ..PRIVATE unsign
21e20 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74  ed strhash(const
21e30 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 75 6e   char *x).{.  un
21e40 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a 20 20  signed h = 0;.  
21e50 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20 3d 20  while( *x ) h = 
21e60 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
21e70 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
21e80 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
21e90 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
21ea0 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
21eb0 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
21ec0 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
21ed0 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
21ee0 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
21ef0 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
21f00 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
21f10 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73  e place..*/.cons
21f20 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  t char *Strsafe(
21f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b  const char *y).{
21f40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21f50 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a  ;.  char *cpy;..
21f60 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74    if( y==0 ) ret
21f70 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72  urn 0;.  z = Str
21f80 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20  safe_find(y);.  
21f90 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79  if( z==0 && (cpy
21fa0 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28  =(char *)malloc(
21fb0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b   lemonStrlen(y)+
21fc0 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6c  1 ))!=0 ){.    l
21fd0 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70 79 2c  emon_strcpy(cpy,
21fe0 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b  y);.    z = cpy;
21ff0 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73  .    Strsafe_ins
22000 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65  ert(z);.  }.  Me
22010 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20  moryCheck(z);.  
22020 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20  return z;.}../* 
22030 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
22040 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
22050 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
22060 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
22070 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
22080 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
22090 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20  struct s_x1 {.  
220a0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
220b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
220c0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
220d0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
22100 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
22110 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
22120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22140 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
22150 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
22160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22170 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
22180 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
22190 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
221a0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
221b0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
221c0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
221d0 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x1node **ht;  /
221e0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
221f0 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
22200 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
22210 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
22220 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
22230 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
22240 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
22250 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
22260 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79  type "x1"..*/.ty
22270 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
22280 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20  1node {.  const 
22290 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
222a0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
222b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
222c0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
222d0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
222e0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
222f0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
22300 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
22310 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
22320 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x1node;../* Th
22330 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
22340 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
22350 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
22360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
22370 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
22380 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c  _x1 *x1a;../* Al
22390 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
223a0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
223b0 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  /.void Strsafe_i
223c0 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61  nit(){.  if( x1a
223d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61   ) return;.  x1a
223e0 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a   = (struct s_x1*
223f0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
22400 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a  struct s_x1) );.
22410 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20    if( x1a ){.   
22420 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32   x1a->size = 102
22430 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e  4;.    x1a->coun
22440 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e  t = 0;.    x1a->
22450 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63  tbl = (x1node*)c
22460 61 6c 6c 6f 63 28 31 30 32 34 2c 20 73 69 7a 65  alloc(1024, size
22470 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
22480 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x1node*));. 
22490 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d     if( x1a->tbl=
224a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
224b0 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61  (x1a);.      x1a
224c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
224d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
224e0 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78      x1a->ht = (x
224f0 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74  1node**)&(x1a->t
22500 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20  bl[1024]);.     
22510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34   for(i=0; i<1024
22520 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69  ; i++) x1a->ht[i
22530 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
22540 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
22550 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
22560 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
22570 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
22580 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
22590 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
225a0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
225b0 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
225c0 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63  Strsafe_insert(c
225d0 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 29  onst char *data)
225e0 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  .{.  x1node *np;
225f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
22600 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20   unsigned ph;.. 
22610 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65   if( x1a==0 ) re
22620 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
22630 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  trhash(data);.  
22640 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
22650 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
22660 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  1a->ht[h];.  whi
22670 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
22680 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74  ( strcmp(np->dat
22690 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  a,data)==0 ){.  
226a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
226b0 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
226c0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
226d0 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
226e0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
226f0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
22700 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
22710 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
22720 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
22730 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61  t;.  }.  if( x1a
22740 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69  ->count>=x1a->si
22750 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
22760 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
22770 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
22780 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
22790 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
227a0 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20   s_x1 array;.   
227b0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
227c0 72 53 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a  rSize = x1a->siz
227d0 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
227e0 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e  ount = x1a->coun
227f0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
22800 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c   = (x1node*)call
22810 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
22820 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
22830 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x1node*));. 
22840 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
22850 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
22860 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
22870 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
22880 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
22890 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x1node**)&(arr
228a0 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
228b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
228c0 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
228d0 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
228e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
228f0 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  1a->count; i++){
22900 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f  .      x1node *o
22910 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
22920 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31      oldnp = &(x1
22930 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
22940 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
22950 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72  dnp->data) & (ar
22960 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  rSize-1);.      
22970 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
22980 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
22990 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
229a0 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
229b0 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
229c0 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
229d0 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
229e0 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
229f0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
22a00 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
22a10 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
22a20 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
22a30 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
22a40 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
22a50 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a  free(x1a->tbl);.
22a60 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79      *x1a = array
22a70 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
22a80 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
22a90 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  /.  h = ph & (x1
22aa0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
22ab0 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31   = &(x1a->tbl[x1
22ac0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
22ad0 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
22ae0 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68  .  if( x1a->ht[h
22af0 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x1a->ht[h]->
22b00 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
22b10 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
22b20 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x1a->ht[h];.  x
22b30 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  1a->ht[h] = np;.
22b40 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
22b50 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  1a->ht[h]);.  re
22b60 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
22b70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22b80 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
22b90 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
22ba0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
22bb0 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
22bc0 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  . */.const char 
22bd0 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f  *Strsafe_find(co
22be0 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b  nst char *key).{
22bf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
22c00 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x1node *np;..  
22c10 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74  if( x1a==0 ) ret
22c20 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
22c30 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61  hash(key) & (x1a
22c40 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
22c50 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
22c60 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
22c70 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
22c80 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62  data,key)==0 ) b
22c90 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
22ca0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
22cb0 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
22cc0 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
22cd0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22ce0 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c  to the (terminal
22cf0 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29   or nonterminal)
22d00 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20   symbol "x"..** 
22d10 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
22d20 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74  bol if this is t
22d30 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78  he first time "x
22d40 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e  " has been seen.
22d50 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  .*/.struct symbo
22d60 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f  l *Symbol_new(co
22d70 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20  nst char *x).{. 
22d80 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
22d90 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62  sp;..  sp = Symb
22da0 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66  ol_find(x);.  if
22db0 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ( sp==0 ){.    s
22dc0 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
22dd0 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73  ol *)calloc(1, s
22de0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
22df0 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f  bol) );.    Memo
22e00 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20  ryCheck(sp);.   
22e10 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73   sp->name = Strs
22e20 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e  afe(x);.    sp->
22e30 74 79 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a  type = isupper(*
22e40 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20  x) ? TERMINAL : 
22e50 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  NONTERMINAL;.   
22e60 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20   sp->rule = 0;. 
22e70 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20     sp->fallback 
22e80 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65  = 0;.    sp->pre
22e90 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e  c = -1;.    sp->
22ea0 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20  assoc = UNK;.   
22eb0 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20   sp->firstset = 
22ec0 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64  0;.    sp->lambd
22ed0 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b  a = LEMON_FALSE;
22ee0 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63  .    sp->destruc
22ef0 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  tor = 0;.    sp-
22f00 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b  >destLineno = 0;
22f10 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70  .    sp->datatyp
22f20 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75  e = 0;.    sp->u
22f30 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53  seCnt = 0;.    S
22f40 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c  ymbol_insert(sp,
22f50 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  sp->name);.  }. 
22f60 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20   sp->useCnt++;. 
22f70 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f   return sp;.}../
22f80 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79  * Compare two sy
22f90 6d 62 6f 6c 73 20 66 6f 72 20 73 6f 72 74 69 6e  mbols for sortin
22fa0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74  g purposes.  Ret
22fb0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 0a 2a 2a  urn negative,.**
22fc0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
22fd0 76 65 20 69 66 20 61 20 69 73 20 6c 65 73 73 20  ve if a is less 
22fe0 74 68 65 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  then, equal to, 
22ff0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
23000 61 6e 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62  an b..**.** Symb
23010 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ols that begin w
23020 69 74 68 20 75 70 70 65 72 20 63 61 73 65 20 6c  ith upper case l
23030 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c  etters (terminal
23040 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20  s or tokens).** 
23050 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65  must sort before
23060 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65   symbols that be
23070 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63  gin with lower c
23080 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28  ase letters.** (
23090 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20  non-terminals). 
230a0 20 41 6e 64 20 4d 55 4c 54 49 54 45 52 4d 49 4e   And MULTITERMIN
230b0 41 4c 20 73 79 6d 62 6f 6c 73 20 28 63 72 65 61  AL symbols (crea
230c0 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ted using the.**
230d0 20 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 64 69   %token_class di
230e0 72 65 63 74 69 76 65 29 20 6d 75 73 74 20 73 6f  rective) must so
230f0 72 74 20 61 74 20 74 68 65 20 76 65 72 79 20 65  rt at the very e
23100 6e 64 2e 20 4f 74 68 65 72 20 74 68 61 6e 0a 2a  nd. Other than.*
23110 2a 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65  * that, the orde
23120 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  r does not matte
23130 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64  r..**.** We find
23140 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20   experimentally 
23150 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65  that leaving the
23160 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69   symbols in thei
23170 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72  r original.** or
23180 64 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74  der (the order t
23190 68 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20  hey appeared in 
231a0 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65  the grammar file
231b0 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73  ) gives the.** s
231c0 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74  mallest parser t
231d0 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e  ables in SQLite.
231e0 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d  .*/.int Symbolcm
231f0 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f  pp(const void *_
23200 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f  a, const void *_
23210 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72  b).{.  const str
23220 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 20 3d 20  uct symbol *a = 
23230 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
23240 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20  ymbol **) _a;.  
23250 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
23260 62 6f 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e 73 74  bol *b = *(const
23270 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
23280 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20  *) _b;.  int i1 
23290 3d 20 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49  = a->type==MULTI
232a0 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 61  TERMINAL ? 3 : a
232b0 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20  ->name[0]>'Z' ? 
232c0 32 20 3a 20 31 3b 0a 20 20 69 6e 74 20 69 32 20  2 : 1;.  int i2 
232d0 3d 20 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49  = b->type==MULTI
232e0 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 62  TERMINAL ? 3 : b
232f0 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20  ->name[0]>'Z' ? 
23300 32 20 3a 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  2 : 1;.  return 
23310 69 31 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e 64 65  i1==i2 ? a->inde
23320 78 20 2d 20 62 2d 3e 69 6e 64 65 78 20 3a 20 69  x - b->index : i
23330 31 20 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68  1 - i2;.}../* Th
23340 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
23350 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
23360 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
23370 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
23380 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
23390 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74  type "x2"..*/.st
233a0 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e  ruct s_x2 {.  in
233b0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
233c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
233d0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
233e0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
23410 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
23420 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
23430 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
23450 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
23460 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
23470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23480 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
23490 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
234a0 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
234b0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
234c0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
234d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
234e0 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  2node **ht;  /* 
234f0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
23500 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
23510 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
23520 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
23530 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
23540 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
23550 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
23560 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
23570 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x2"..*/.type
23580 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e  def struct s_x2n
23590 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
235a0 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20  ymbol *data;    
235b0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
235c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65    const char *ke
235d0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y;         /* Th
235e0 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
235f0 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74  t s_x2node *next
23600 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
23610 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
23620 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
23630 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x2node **from
23640 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
23650 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b  ink */.} x2node;
23660 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23670 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
23680 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
23690 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
236a0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
236b0 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b  truct s_x2 *x2a;
236c0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
236d0 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
236e0 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79  array */.void Sy
236f0 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69  mbol_init(){.  i
23700 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
23710 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
23720 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
23730 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
23740 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
23750 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
23760 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
23770 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
23780 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
23790 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20  de*)calloc(128, 
237a0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
237b0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
237c0 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e  );.    if( x2a->
237d0 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
237e0 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20  free(x2a);.     
237f0 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x2a = 0;.    }e
23800 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
23810 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20  ;.      x2a->ht 
23820 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32  = (x2node**)&(x2
23830 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
23840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
23850 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74  28; i++) x2a->ht
23860 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
23870 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
23880 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
23890 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
238a0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
238b0 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
238c0 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
238d0 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
238e0 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
238f0 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
23900 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
23910 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ata, const char 
23920 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65  *key).{.  x2node
23930 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
23940 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
23950 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
23960 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
23970 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
23980 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
23990 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
239a0 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
239b0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
239c0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
239d0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
239e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
239f0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
23a00 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
23a10 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
23a20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
23a30 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
23a40 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
23a50 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
23a60 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
23a70 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
23a80 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
23a90 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
23aa0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
23ab0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
23ac0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
23ad0 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
23ae0 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20  ct s_x2 array;. 
23af0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
23b00 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73  arrSize = x2a->s
23b10 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
23b20 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f  .count = x2a->co
23b30 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
23b40 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61  bl = (x2node*)ca
23b50 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
23b60 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
23b70 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b  izeof(x2node*));
23b80 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
23b90 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
23ba0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
23bb0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
23bc0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
23bd0 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
23be0 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
23bf0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
23c00 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
23c10 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
23c20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23c30 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x2a->count; i++
23c40 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20  ){.      x2node 
23c50 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
23c60 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
23c70 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x2a->tbl[i]);.  
23c80 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
23c90 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61  oldnp->key) & (a
23ca0 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
23cb0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
23cc0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
23cd0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
23ce0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
23cf0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
23d00 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
23d10 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
23d20 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
23d30 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
23d40 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
23d50 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
23d60 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
23d70 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
23d80 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
23d90 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
23da0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
23db0 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
23dc0 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
23dd0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
23de0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
23df0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
23e00 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
23e10 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
23e20 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
23e30 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
23e40 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
23e50 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
23e60 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
23e70 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
23e80 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
23e90 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
23ea0 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
23eb0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
23ec0 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
23ed0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
23ee0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
23ef0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
23f00 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
23f10 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
23f20 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
23f30 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
23f40 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
23f50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79  (const char *key
23f60 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
23f70 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x2node *np;.
23f80 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
23f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
23fa0 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28  strhash(key) & (
23fb0 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
23fc0 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
23fd0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
23fe0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
23ff0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
24000 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
24010 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
24020 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
24030 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
24040 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68   Return the n-th
24050 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e   data.  Return N
24060 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20  ULL if n is out 
24070 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72  of range. */.str
24080 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
24090 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a  ol_Nth(int n).{.
240a0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
240b0 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61  *data;.  if( x2a
240c0 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32   && n>0 && n<=x2
240d0 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  a->count ){.    
240e0 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  data = x2a->tbl[
240f0 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c  n-1].data;.  }el
24100 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30  se{.    data = 0
24110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
24120 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  ata;.}../* Retur
24130 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
24140 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53  e array */.int S
24150 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a  ymbol_count().{.
24160 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78    return x2a ? x
24170 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d  2a->count : 0;.}
24180 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
24190 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
241a0 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
241b0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
241c0 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
241d0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
241e0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
241f0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
24200 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
24210 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
24220 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
24230 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
24240 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  bol_arrayof().{.
24250 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
24260 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
24270 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  ,arrSize;.  if( 
24280 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
24290 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78  0;.  arrSize = x
242a0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  2a->count;.  arr
242b0 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ay = (struct sym
242c0 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72  bol **)calloc(ar
242d0 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  rSize, sizeof(st
242e0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b  ruct symbol *));
242f0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
24300 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
24310 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
24320 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c  ay[i] = x2a->tbl
24330 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
24340 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
24350 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
24360 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
24370 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  /.int Configcmp(
24380 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63  const char *_a,c
24390 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b  onst char *_b).{
243a0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
243b0 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72  config *a = (str
243c0 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61  uct config *) _a
243d0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
243e0 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74   config *b = (st
243f0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f  ruct config *) _
24400 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20  b;.  int x;.  x 
24410 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
24420 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
24430 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
24440 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
24450 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a  .  return x;.}..
24460 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
24470 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45  tates */.PRIVATE
24480 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74   int statecmp(st
24490 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20  ruct config *a, 
244a0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
244b0 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ).{.  int rc;.  
244c0 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20  for(rc=0; rc==0 
244d0 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d  && a && b;  a=a-
244e0 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20  >bp, b=b->bp){. 
244f0 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69     rc = a->rp->i
24500 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
24510 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  dex;.    if( rc=
24520 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74  =0 ) rc = a->dot
24530 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20   - b->dot;.  }. 
24540 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
24550 20 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31    if( a ) rc = 1
24560 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63  ;.    if( b ) rc
24570 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
24580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61  urn rc;.}../* Ha
24590 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52  sh a state */.PR
245a0 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73  IVATE unsigned s
245b0 74 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20  tatehash(struct 
245c0 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75  config *a).{.  u
245d0 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77  nsigned h=0;.  w
245e0 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68  hile( a ){.    h
245f0 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
24600 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
24610 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e  dot;.    a = a->
24620 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  bp;.  }.  return
24630 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61   h;.}../* Alloca
24640 74 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73  te a new state s
24650 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75  tructure */.stru
24660 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
24670 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  new().{.  struct
24680 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65   state *newstate
24690 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28  ;.  newstate = (
246a0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63  struct state *)c
246b0 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28  alloc(1, sizeof(
246c0 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
246d0 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
246e0 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75  ewstate);.  retu
246f0 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a  rn newstate;.}..
24700 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
24710 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
24720 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
24730 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
24740 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
24750 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
24760 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b  */.struct s_x3 {
24770 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
24780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24790 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
247a0 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
247d0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
247e0 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
247f0 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
24820 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24840 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
24850 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
24860 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
24870 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x3node *tbl;  /*
24880 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
24890 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
248a0 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x3node **ht;
248b0 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
248c0 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
248d0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
248e0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
248f0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
24900 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
24910 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
24920 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
24930 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
24940 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
24950 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x3node {.  str
24960 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
24990 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
249a0 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
249b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
249c0 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
249d0 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x3node *next; 
249e0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
249f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
24a00 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
24a10 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x3node **from; 
24a20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
24a30 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a  k */.} x3node;..
24a40 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
24a50 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
24a60 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
24a70 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
24a80 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
24a90 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a  uct s_x3 *x3a;..
24aa0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
24ab0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
24ac0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74  ray */.void Stat
24ad0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
24ae0 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x3a ) return;.  
24af0 78 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x3a = (struct s_
24b00 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x3*)malloc( size
24b10 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20  of(struct s_x3) 
24b20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a  );.  if( x3a ){.
24b30 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20      x3a->size = 
24b40 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f  128;.    x3a->co
24b50 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61  unt = 0;.    x3a
24b60 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  ->tbl = (x3node*
24b70 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a  )calloc(128, siz
24b80 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
24b90 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a  zeof(x3node*));.
24ba0 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c      if( x3a->tbl
24bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
24bc0 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33  e(x3a);.      x3
24bd0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
24be0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
24bf0 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28       x3a->ht = (
24c00 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e  x3node**)&(x3a->
24c10 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
24c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
24c30 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d   i++) x3a->ht[i]
24c40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24c50 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
24c60 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
24c70 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
24c80 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
24c90 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
24ca0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
24cb0 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
24cc0 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
24cd0 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75  tate_insert(stru
24ce0 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20  ct state *data, 
24cf0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
24d00 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a  ey).{.  x3node *
24d10 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  np;.  unsigned h
24d20 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b  ;.  unsigned ph;
24d30 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
24d40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
24d50 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
24d60 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  ;.  h = ph & (x3
24d70 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
24d80 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
24d90 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
24da0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
24db0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
24dc0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
24dd0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
24de0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
24df0 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
24e00 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
24e10 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
24e20 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
24e30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24e40 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
24e50 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
24e60 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61   x3a->count>=x3a
24e70 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
24e80 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
24e90 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
24ea0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
24eb0 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74  ,arrSize;.    st
24ec0 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b  ruct s_x3 array;
24ed0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
24ee0 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d  = arrSize = x3a-
24ef0 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
24f00 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e  ay.count = x3a->
24f10 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
24f20 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  .tbl = (x3node*)
24f30 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
24f40 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
24f50 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
24f60 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
24f70 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
24f80 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
24f90 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
24fa0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
24fb0 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
24fc0 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69  (array.tbl[arrSi
24fd0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
24fe0 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
24ff0 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
25000 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
25010 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x3a->count; i
25020 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64  ++){.      x3nod
25030 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
25040 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
25050 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x3a->tbl[i]);.
25060 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68        h = stateh
25070 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20  ash(oldnp->key) 
25080 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20  & (arrSize-1);. 
25090 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
250a0 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
250b0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
250c0 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
250d0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
250e0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
250f0 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
25100 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
25110 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
25120 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
25130 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
25140 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
25150 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
25160 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
25170 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
25180 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
25190 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62      free(x3a->tb
251a0 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61  l);.    *x3a = a
251b0 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
251c0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
251d0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
251e0 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
251f0 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62    np = &(x3a->tb
25200 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x3a->count++])
25210 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
25220 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
25230 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d  data;.  if( x3a-
25240 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74  >ht[h] ) x3a->ht
25250 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
25260 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
25270 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d  ext = x3a->ht[h]
25280 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x3a->ht[h] =
25290 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
252a0 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x3a->ht[h]);
252b0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
252c0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
252d0 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
252e0 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
252f0 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
25300 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
25310 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
25320 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
25330 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
25340 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67   *key).{.  unsig
25350 6e 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20  ned h;.  x3node 
25360 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d  *np;..  if( x3a=
25370 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
25380 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b   h = statehash(k
25390 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65  ey) & (x3a->size
253a0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d  -1);.  np = x3a-
253b0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
253c0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
253d0 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c  tatecmp(np->key,
253e0 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
253f0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
25400 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
25410 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
25420 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
25430 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
25440 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
25450 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
25460 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
25470 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
25480 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
25490 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
254a0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
254b0 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
254c0 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
254d0 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
254e0 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29  *State_arrayof()
254f0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
25500 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  e **array;.  int
25510 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66   i,arrSize;.  if
25520 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
25530 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d  n 0;.  arrSize =
25540 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x3a->count;.  a
25550 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
25560 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63 28 61  tate **)calloc(a
25570 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73  rrSize, sizeof(s
25580 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 29 3b  truct state *));
25590 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
255a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
255b0 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
255c0 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c  ay[i] = x3a->tbl
255d0 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
255e0 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
255f0 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69  ./* Hash a confi
25600 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56  guration */.PRIV
25610 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e  ATE unsigned con
25620 66 69 67 68 61 73 68 28 73 74 72 75 63 74 20 63  fighash(struct c
25630 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e  onfig *a).{.  un
25640 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68 20  signed h=0;.  h 
25650 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
25660 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
25670 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a  ot;.  return h;.
25680 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
25690 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
256a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
256b0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
256c0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
256d0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
256e0 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
256f0 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  4 {.  int size; 
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25710 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
25720 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
25730 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25750 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
25760 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
25770 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25790 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
257a0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
257b0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
257c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
257d0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
257e0 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
257f0 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x4node *tbl; 
25800 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
25810 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
25820 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
25830 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
25840 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
25850 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
25860 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
25870 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
25880 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
25890 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
258a0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
258b0 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
258c0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
258d0 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20  ct s_x4node {.  
258e0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
258f0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
25900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
25910 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
25920 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x4node *next;   
25930 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
25940 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
25950 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
25960 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  4node **from;  /
25970 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
25980 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x4node;../*
25990 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
259a0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
259b0 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
259c0 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
259d0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
259e0 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a  t s_x4 *x4a;../*
259f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
25a00 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
25a10 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  y */.void Config
25a20 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20  table_init(){.  
25a30 69 66 28 20 78 34 61 20 29 20 72 65 74 75 72 6e  if( x4a ) return
25a40 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75 63  ;.  x4a = (struc
25a50 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x4*)malloc( 
25a60 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
25a70 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61  x4) );.  if( x4a
25a80 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a   ){.    x4a->siz
25a90 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d  e = 64;.    x4a-
25aa0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
25ab0 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f  x4a->tbl = (x4no
25ac0 64 65 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20 73  de*)calloc(64, s
25ad0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
25ae0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
25af0 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74  ;.    if( x4a->t
25b00 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
25b10 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20  ree(x4a);.      
25b20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x4a = 0;.    }el
25b30 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
25b40 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d  .      x4a->ht =
25b50 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61   (x4node**)&(x4a
25b60 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20  ->tbl[64]);.    
25b70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b    for(i=0; i<64;
25b80 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
25b90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
25ba0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
25bb0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
25bc0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
25bd0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
25be0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
25bf0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
25c00 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
25c10 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43  written */.int C
25c20 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
25c30 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  t(struct config 
25c40 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64  *data).{.  x4nod
25c50 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65  e *np;.  unsigne
25c60 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  d h;.  unsigned 
25c70 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  ph;..  if( x4a==
25c80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25c90 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28  ph = confighash(
25ca0 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
25cb0 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
25cc0 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
25cd0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
25ce0 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
25cf0 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72  gcmp((const char
25d00 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f   *) np->data,(co
25d10 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61 74 61  nst char *) data
25d20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
25d30 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
25d40 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
25d50 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
25d60 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
25d70 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
25d80 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
25d90 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
25da0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
25db0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
25dc0 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e  .  if( x4a->coun
25dd0 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x4a->size ){.
25de0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
25df0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
25e00 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
25e10 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a   int i,arrSize;.
25e20 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20      struct s_x4 
25e30 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
25e40 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20  .size = arrSize 
25e50 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x4a->size*2;. 
25e60 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
25e70 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x4a->count;.   
25e80 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34   array.tbl = (x4
25e90 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72  node*)calloc(arr
25ea0 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 34 6e  Size, sizeof(x4n
25eb0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
25ec0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
25ed0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
25ee0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
25ef0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
25f00 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
25f10 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f  array.ht = (x4no
25f20 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
25f30 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20  [arrSize]);.    
25f40 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
25f50 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
25f60 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
25f70 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f  r(i=0; i<x4a->co
25f80 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
25f90 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x4node *oldnp, 
25fa0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
25fb0 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c  dnp = &(x4a->tbl
25fc0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
25fd0 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70  confighash(oldnp
25fe0 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72 53 69  ->data) & (arrSi
25ff0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
26000 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
26010 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
26020 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
26030 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
26040 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
26050 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
26060 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
26070 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
26080 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
26090 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
260a0 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
260b0 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
260c0 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
260d0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
260e0 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x4a->tbl);.   
260f0 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x4a = array;. 
26100 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
26110 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
26120 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
26130 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
26140 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e  &(x4a->tbl[x4a->
26150 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
26160 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
26170 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29  if( x4a->ht[h] )
26180 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x4a->ht[h]->fro
26190 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
261a0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34  .  np->next = x4
261b0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d  a->ht[h];.  x4a-
261c0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
261d0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d  p->from = &(x4a-
261e0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
261f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
26200 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
26210 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
26220 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
26230 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
26240 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
26250 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
26260 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
26270 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
26280 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key).{.  int h;
26290 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x4node *np;..
262a0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
262b0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63  eturn 0;.  h = c
262c0 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26  onfighash(key) &
262d0 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
262e0 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
262f0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
26300 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
26310 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20  cmp((const char 
26320 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e  *) np->data,(con
26330 73 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d  st char *) key)=
26340 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26350 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
26360 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
26370 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
26380 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ../* Remove all 
26390 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
263a0 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20  ble.  Pass each 
263b0 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63  data to the func
263c0 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69  tion "f".** as i
263d0 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28  t is removed.  (
263e0 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20  "f" may be null 
263f0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74  to avoid this st
26400 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ep.) */.void Con
26410 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69  figtable_clear(i
26420 6e 74 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f  nt(*f)(struct co
26430 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74  nfig *)).{.  int
26440 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30   i;.  if( x4a==0
26450 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d   || x4a->count==
26460 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
26470 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  ( f ) for(i=0; i
26480 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
26490 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b  ) (*f)(x4a->tbl[
264a0 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28  i].data);.  for(
264b0 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65  i=0; i<x4a->size
264c0 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69  ; i++) x4a->ht[i
264d0 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f  ] = 0;.  x4a->co
264e0 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  unt = 0;.  retur
264f0 6e 3b 0a 7d 0a                                   n;.}.