/ Hex Artifact Content
Login

Artifact 5ccba178a8e8a4b21e1c9232944d23973da38ad7:


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 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  ();.void FindFir
1330: 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  stSets();.void F
1340: 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69  indStates();.voi
1350: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76  d FindLinks();.v
1360: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
1370: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41  ts();.void FindA
1380: 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a  ctions();../****
1390: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
13a0: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
13b0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ****/.void Confi
13e0: 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29  glist_init(void)
13f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1400: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
1410: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
1420: 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  nt);.struct conf
1430: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
1440: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
1450: 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  ule *, int);.voi
1460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
1470: 73 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  sure(struct lemo
1480: 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  n *);.void Confi
1490: 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29  glist_sort(void)
14a0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
14b0: 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64  t_sortbasis(void
14c0: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
14d0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
14e0: 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  urn(void);.struc
14f0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
1500: 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29  list_basis(void)
1510: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1520: 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e  t_eat(struct con
1530: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
1540: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f  figlist_reset(vo
1550: 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  id);../*********
1560: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1570: 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  error.h" *******
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  /.void ErrorMsg(
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
15c0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  t,const char *, 
15d0: 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46  ...);../****** F
15e0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
15f0: 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.h" ********
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1620: 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f  **/.enum option_
1630: 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d  type { OPT_FLAG=
1640: 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50  1,  OPT_INT,  OP
1650: 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c  T_DBL,  OPT_STR,
1660: 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46  .         OPT_FF
1670: 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f  LAG, OPT_FINT, O
1680: 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54  PT_FDBL, OPT_FST
1690: 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74  R};.struct s_opt
16a0: 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70  ions {.  enum op
16b0: 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a  tion_type type;.
16c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61    const char *la
16d0: 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67  bel;.  char *arg
16e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16f0: 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20  message;.};.int 
1700: 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a     OptInit(char*
1710: 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  *,struct s_optio
1720: 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20  ns*,FILE*);.int 
1730: 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64     OptNArgs(void
1740: 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67  );.char  *OptArg
1750: 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70  (int);.void   Op
1760: 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tErr(int);.void 
1770: 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29    OptPrint(void)
1780: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ;../******** Fro
1790: 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
17a0: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
17b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17d0: 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
17e0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a  t lemon *lemp);.
17f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ./********* From
1800: 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
1810: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
1840: 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
1850: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
1860: 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63   Plink_add(struc
1870: 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75  t plink **, stru
1880: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
1890: 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
18a0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73  ruct plink **, s
18b0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a  truct plink *);.
18c0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
18d0: 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
18e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
18f0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72  From the file "r
1900: 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  eport.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 2f 0a  **************/.
1930: 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
1940: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1950: 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
1960: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1970: 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1980: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
1990: 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70  , int);.void Rep
19a0: 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74  ortHeader(struct
19b0: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
19c0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73  CompressTables(s
19d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
19e0: 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
19f0: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1a00: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
1a10: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1a20: 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.h" **********
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1a50: 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e  void  SetSize(in
1a60: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t);             
1a70: 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c  /* All sets will
1a80: 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f   be of size N */
1a90: 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f  .char *SetNew(vo
1aa0: 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
1ab0: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20     /* A new set 
1ac0: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e  for element 0..N
1ad0: 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65   */.void  SetFre
1ae0: 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20  e(char*);       
1af0: 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
1b00: 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74  ate a set */.int
1b10: 20 53 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e   SetAdd(char*,in
1b20: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  t);            /
1b30: 2a 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f  * Add element to
1b40: 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65   a set */.int Se
1b50: 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68  tUnion(char *,ch
1b60: 61 72 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c  ar *);    /* A <
1b70: 2d 20 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c  - A U B, thru el
1b80: 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69  ement N */.#defi
1b90: 6e 65 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20  ne SetFind(X,Y) 
1ba0: 28 58 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20  (X[Y])       /* 
1bb0: 54 72 75 65 20 69 66 20 59 20 69 73 20 69 6e 20  True if Y is in 
1bc0: 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  set X */../*****
1bd0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1be0: 69 6c 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a  ile "struct.h" *
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c10: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ****/./*.** Prin
1c20: 63 69 70 61 6c 20 64 61 74 61 20 73 74 72 75 63  cipal data struc
1c30: 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tures for the LE
1c40: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1c50: 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  ator..*/..typede
1c60: 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41  f enum {LEMON_FA
1c70: 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55  LSE=0, LEMON_TRU
1c80: 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20  E} Boolean;../* 
1c90: 53 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61  Symbols (termina
1ca0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
1cb0: 61 6c 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d  als) of the gram
1cc0: 6d 61 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  mar are stored.*
1cd0: 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
1ce0: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62  ng: */.enum symb
1cf0: 6f 6c 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d  ol_type {.  TERM
1d00: 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49  INAL,.  NONTERMI
1d10: 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d  NAL,.  MULTITERM
1d20: 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61  INAL.};.enum e_a
1d30: 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c  ssoc {.    LEFT,
1d40: 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20  .    RIGHT,.    
1d50: 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b  NONE,.    UNK.};
1d60: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b  .struct symbol {
1d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1d80: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame;        /* N
1d90: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f  ame of the symbo
1da0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78  l */.  int index
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
1dd0: 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  for this symbol 
1de0: 2a 2f 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c  */.  enum symbol
1df0: 5f 74 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a  _type type;   /*
1e00: 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c   Symbols are all
1e10: 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c   either TERMINAL
1e20: 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74  S or NTs */.  st
1e30: 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b  ruct rule *rule;
1e40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
1e50: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f   list of rules o
1e60: 66 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54  f this (if an NT
1e70: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  ) */.  struct sy
1e80: 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
1e90: 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  /* fallback toke
1ea0: 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 74  n in case this t
1eb0: 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72  oken doesn't par
1ec0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  se */.  int prec
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69   /* Precedence i
1ef0: 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74  f defined (-1 ot
1f00: 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e  herwise) */.  en
1f10: 75 6d 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63  um e_assoc assoc
1f20: 3b 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69  ;      /* Associ
1f30: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1f40: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1f60: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1f70: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1f80: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1f90: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1fa0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc0: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1fd0: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1fe0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1ff0: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
2000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2010: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
2020: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
2030: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
2040: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
2050: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
2060: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
2090: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
20a0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
20b0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
20c0: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
20d0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
20e0: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
20f0: 65 73 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20  estructor.  Set 
2100: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  to.             
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2120: 20 2d 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74   -1 for duplicat
2130: 65 20 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a  e destructors. *
2140: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
2150: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
2160: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
2170: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
2180: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
21b0: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
21c0: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
21d0: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
2200: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
2210: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
2240: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
2250: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
2260: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
2290: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
22a0: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
22b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20   object */.  /* 
22c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
22d0: 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79  elds are used by
22e0: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20   MULTITERMINALs 
22f0: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  only */.  int ns
2300: 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20  ubsym;          
2310: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2320: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
2330: 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49  ols in the MULTI
2340: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
2350: 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f  bol **subsym;  /
2360: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74  * Array of const
2370: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a  ituent symbols *
2380: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72  /.};../* Each pr
2390: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e  oduction rule in
23a0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20   the grammar is 
23b0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f  stored in the fo
23c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
23d0: 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74  ture.  */.struct
23e0: 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74   rule {.  struct
23f0: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
2400: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
2410: 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65  side of the rule
2420: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2430: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f   *lhsalias;    /
2440: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
2450: 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  LHS (NULL if non
2460: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53  e) */.  int lhsS
2470: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
2480: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74   /* True if left
2490: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68  -hand side is th
24a0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
24b0: 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65  /.  int ruleline
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24d0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
24e0: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  the rule */.  in
24f0: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
2500: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2510: 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   of RHS symbols 
2520: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
2530: 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a  ol **rhs;     /*
2540: 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73   The RHS symbols
2550: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2560: 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f   **rhsalias;   /
2570: 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65  * An alias for e
2580: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
2590: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
25a0: 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20  .  int line;    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
25c0: 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68  ine number at wh
25d0: 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20  ich code begins 
25e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25f0: 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  *code;        /*
2600: 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74   The code execut
2610: 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c  ed when this rul
2620: 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a  e is reduced */.
2630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
2640: 64 65 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65  dePrefix;  /* Se
2650: 74 75 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20  tup code before 
2660: 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a  code[] above */.
2670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
2680: 64 65 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72  deSuffix;  /* Br
2690: 65 61 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74  eakdown code aft
26a0: 65 72 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20  er code[] above 
26b0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b  */.  int noCode;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75   True if this ru
26e0: 6c 65 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69  le has no associ
26f0: 61 74 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20  ated C code */. 
2700: 20 69 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64   int codeEmitted
2710: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2720: 65 20 69 66 20 74 68 65 20 63 6f 64 65 20 68 61  e if the code ha
2730: 73 20 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61  s been emitted a
2740: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75  lready */.  stru
2750: 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73  ct symbol *precs
2760: 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e  ym;  /* Preceden
2770: 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68  ce symbol for th
2780: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  is rule */.  int
2790: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
27a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
27b0: 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  x number for thi
27c0: 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s rule */.  int 
27d0: 69 52 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  iRule;          
27e0: 20 20 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d       /* Rule num
27f0: 62 65 72 20 61 73 20 75 73 65 64 20 69 6e 20 74  ber as used in t
2800: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
2810: 6c 65 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  les */.  Boolean
2820: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
2830: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2840: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
2850: 65 64 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c  educed */.  Bool
2860: 65 61 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20  ean doesReduce; 
2870: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61       /* Reduce a
2880: 63 74 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74  ctions occur aft
2890: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
28a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
28b0: 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a   *nextlhs;    /*
28c0: 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20   Next rule with 
28d0: 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a  the same LHS */.
28e0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
28f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
2900: 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  xt rule in the g
2910: 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b  lobal list */.};
2920: 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61  ../* A configura
2930: 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63  tion is a produc
2940: 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65  tion rule of the
2950: 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65   grammar togethe
2960: 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b  r with.** a mark
2970: 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68   (dot) showing h
2980: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20  ow much of that 
2990: 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72  rule has been pr
29a0: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a  ocessed so far..
29b0: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
29c0: 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61  s also contain a
29d0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63   follow-set whic
29e0: 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  h is a list of t
29f0: 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f  erminal.** symbo
2a00: 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c  ls which are all
2a10: 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74  owed to immediat
2a20: 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65  ely follow the e
2a30: 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a  nd of the rule..
2a40: 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75  ** Every configu
2a50: 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  ration is record
2a60: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2a70: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2a80: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73  ng: */.enum cfgs
2a90: 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45  tatus {.  COMPLE
2aa0: 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45  TE,.  INCOMPLETE
2ab0: 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  .};.struct confi
2ac0: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
2ad0: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
2ae0: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
2af0: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
2b00: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
2b10: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
2b40: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
2b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b60: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
2b70: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
2b80: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
2b90: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
2ba0: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
2bb0: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
2bc0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
2bd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
2be0: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
2bf0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
2c00: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
2c10: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
2c20: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2c30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2c40: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
2c50: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
2c60: 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75  .  enum cfgstatu
2c70: 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75  s status;   /* u
2c80: 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f  sed during follo
2c90: 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63  wset and shift c
2ca0: 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20  omputations */. 
2cb0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2cc0: 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  next;     /* Nex
2cd0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
2ce0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a  in the state */.
2cf0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2d00: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2d10: 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e  e next basis con
2d20: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b  figuration */.};
2d30: 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20  ..enum e_action 
2d40: 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43  {.  SHIFT,.  ACC
2d50: 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20  EPT,.  REDUCE,. 
2d60: 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46   ERROR,.  SSCONF
2d70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2d80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
2d90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
2da0: 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20    SRCONFLICT,   
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2dc0: 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20  s a reduce, but 
2dd0: 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69  part of a confli
2de0: 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49  ct */.  RRCONFLI
2df0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2e00: 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65   /* Was a reduce
2e10: 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20  , but part of a 
2e20: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48  conflict */.  SH
2e30: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
2e40: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2e50: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
2e60: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
2e70: 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53  lict */.  RD_RES
2e80: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2e90: 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65     /* Was reduce
2ea0: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2eb0: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2ec0: 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20  */.  NOT_USED,  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70   Deleted by comp
2ef0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49  ression */.  SHI
2f00: 46 54 52 45 44 55 43 45 20 20 20 20 20 20 20 20  FTREDUCE        
2f10: 20 20 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66        /* Shift f
2f20: 69 72 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63  irst, then reduc
2f30: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72  e */.};../* Ever
2f40: 79 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63  y shift or reduc
2f50: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  e operation is s
2f60: 74 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20  tored as one of 
2f70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
2f80: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b  .struct action {
2f90: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2fa0: 20 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *sp;       /* T
2fb0: 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79  he look-ahead sy
2fc0: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  mbol */.  enum e
2fd0: 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20  _action type;.  
2fe0: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
2ff0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
3000: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74     /* The new st
3010: 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74 20  ate, if a shift 
3020: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  */.    struct ru
3030: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a  le *rp;       /*
3040: 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20   The rule, if a 
3050: 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b  reduce */.  } x;
3060: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3070: 20 2a 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53   *spOpt;    /* S
3080: 48 49 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d  HIFTREDUCE optim
3090: 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ization to this 
30a0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
30b0: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b  ct action *next;
30c0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74       /* Next act
30d0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61  ion for this sta
30e0: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
30f0: 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20  ction *collide; 
3100: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
3110: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
3120: 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63  sh */.};../* Eac
3130: 68 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 67  h state of the g
3140: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 27  enerated parser'
3150: 73 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  s finite state m
3160: 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63  achine.** is enc
3170: 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  oded as an insta
3180: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3190: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
31a0: 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
31b0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
31c0: 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20  g *bp;       /* 
31d0: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
31e0: 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69  urations for thi
31f0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
3200: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
3210: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e        /* All con
3220: 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74  figurations in t
3230: 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  his set */.  int
3240: 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20   statenum;      
3250: 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74        /* Sequent
3260: 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ial number for t
3270: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
3280: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
3290: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
32a0: 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  of actions for t
32b0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  his state */.  i
32c0: 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41  nt nTknAct, nNtA
32d0: 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ct;     /* Numbe
32e0: 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20  r of actions on 
32f0: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
3300: 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  nterminals */.  
3310: 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e  int iTknOfst, iN
3320: 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61  tOfst;   /* yy_a
3330: 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66  ction[] offset f
3340: 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  or terminals and
3350: 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69   nonterms */.  i
3360: 6e 74 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20  nt iDfltReduce; 
3370: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
3380: 6c 74 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  lt action is to 
3390: 52 45 44 55 43 45 20 62 79 20 74 68 69 73 20 72  REDUCE by this r
33a0: 75 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ule */.  struct 
33b0: 72 75 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63  rule *pDfltReduc
33c0: 65 3b 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74  e;/* The default
33d0: 20 52 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f   REDUCE rule. */
33e0: 0a 20 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63  .  int autoReduc
33f0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
3400: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3410: 6e 20 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74  n auto-reduce st
3420: 61 74 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  ate */.};.#defin
3430: 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31  e NO_OFFSET (-21
3440: 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20  47483647)../* A 
3450: 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67  followset propag
3460: 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63  ation link indic
3470: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
3480: 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a  ntents of one.**
3490: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
34a0: 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20  ollowset should 
34b0: 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f  be propagated to
34c0: 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65   another wheneve
34d0: 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  r.** the first c
34e0: 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63  hanges. */.struc
34f0: 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75  t plink {.  stru
3500: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
3510: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
3520: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69  iguration to whi
3530: 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73  ch linked */.  s
3540: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
3550: 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  t;      /* The n
3560: 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ext propagate li
3570: 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  nk */.};../* The
3580: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f   state vector fo
3590: 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  r the entire par
35a0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73  ser generator is
35b0: 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20   recorded as.** 
35c0: 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e  follows.  (LEMON
35d0: 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20   uses no global 
35e0: 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61  variables and ma
35f0: 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f  kes little use o
3600: 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69  f.** static vari
3610: 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69  ables.  Fields i
3620: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
3630: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
3640: 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61   thought.** of a
3650: 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76  s begin global v
3660: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
3670: 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72  program.) */.str
3680: 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74  uct lemon {.  st
3690: 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72  ruct state **sor
36a0: 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20  ted;   /* Table 
36b0: 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64  of states sorted
36c0: 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72   by state number
36d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
36e0: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
36f0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75  * List of all ru
3700: 6c 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  les */.  struct 
3710: 72 75 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b  rule *startRule;
3720: 20 20 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20    /* First rule 
3730: 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b  */.  int nstate;
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3750: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
3760: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61  s */.  int nxsta
3770: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
3780: 2f 2a 20 6e 73 74 61 74 65 20 77 69 74 68 20 74  /* nstate with t
3790: 61 69 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73  ail degenerate s
37a0: 74 61 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f  tates removed */
37b0: 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20  .  int nrule;   
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37d0: 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a  umber of rules *
37e0: 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b  /.  int nsymbol;
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e  Number of termin
3810: 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
3820: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
3830: 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20  int nterminal;  
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3850: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  er of terminal s
3860: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
3870: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62  ct symbol **symb
3880: 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61  ols; /* Sorted a
3890: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
38a0: 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20   to symbols */. 
38b0: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
38d0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  ber of errors */
38e0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
38f0: 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54   *errsym;   /* T
3900: 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20  he error symbol 
3910: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
3920: 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a  ol *wildcard; /*
3930: 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63   Token that matc
3940: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  hes anything */.
3950: 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20    char *name;   
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3970: 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  me of the genera
3980: 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  ted parser */.  
3990: 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20  char *arg;      
39a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c           /* Decl
39b0: 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33  aration of the 3
39c0: 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  th argument to p
39d0: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
39e0: 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20  *tokentype;     
39f0: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
3a00: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
3a10: 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73 74  in the parser st
3a20: 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76  ack */.  char *v
3a30: 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  artype;         
3a40: 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
3a50: 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72   type of non-ter
3a60: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
3a70: 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20  .  char *start; 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a90: 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72 74  ame of the start
3aa0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20   symbol for the 
3ab0: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61  grammar */.  cha
3ac0: 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20  r *stacksize;   
3ad0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3ae0: 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
3af0: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63  k */.  char *inc
3b00: 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  lude;           
3b10: 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61  /* Code to put a
3b20: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
3b30: 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63  he C file */.  c
3b40: 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20  har *error;     
3b50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3b60: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
3b70: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
3b80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
3b90: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
3ba0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3bb0: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
3bc0: 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20  rflow */.  char 
3bd0: 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20  *failure;       
3be0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
3bf0: 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72  xecute on parser
3c00: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68   failure */.  ch
3c10: 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20  ar *accept;     
3c20: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3c30: 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74  o execute when t
3c40: 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74  he parser except
3c50: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74  s */.  char *ext
3c60: 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20  racode;         
3c70: 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64  /* Code appended
3c80: 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65   to the generate
3c90: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  d file */.  char
3ca0: 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20   *tokendest;    
3cb0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3cc0: 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74 72  execute to destr
3cd0: 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f  oy token data */
3ce0: 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73 74  .  char *vardest
3cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
3d00: 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66 61  ode for the defa
3d10: 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ult non-terminal
3d20: 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20   destructor */. 
3d30: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b   char *filename;
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3d50: 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
3d60: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f  ile */.  char *o
3d70: 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  utname;         
3d80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3d90: 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
3da0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3db0: 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20  tokenprefix;    
3dc0: 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61     /* A prefix a
3dd0: 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61  dded to token na
3de0: 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69  mes in the .h fi
3df0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e  le */.  int ncon
3e00: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
3e10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
3e20: 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20  rsing conflicts 
3e30: 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e  */.  int naction
3e40: 74 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tab;          /*
3e50: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
3e60: 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74  es in the yy_act
3e70: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  ion[] table */. 
3e80: 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20   int tablesize; 
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3ea0: 61 6c 20 74 61 62 6c 65 20 73 69 7a 65 20 6f 66  al table size of
3eb0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 62   all tables in b
3ec0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61  ytes */.  int ba
3ed0: 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20  sisflag;        
3ee0: 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79     /* Print only
3ef0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
3f00: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68  tions */.  int h
3f10: 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20  as_fallback;    
3f20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3f30: 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20  ny %fallback is 
3f40: 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d  seen in the gram
3f50: 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c  mar */.  int nol
3f60: 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20  inenosflag;     
3f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69    /* True if #li
3f80: 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  ne statements sh
3f90: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e  ould not be prin
3fa0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ted */.  char *a
3fb0: 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20  rgv0;           
3fc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3fd0: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a   program */.};..
3fe0: 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68  #define MemoryCh
3ff0: 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30  eck(X) if((X)==0
4000: 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f  ){ \.  extern vo
4010: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
4020: 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72  ); \.  memory_er
4030: 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a  ror(); \.}../***
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
4050: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
4060: 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.h" **********
4070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4080: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
4090: 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
40a0: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
40b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
40c0: 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
40d0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
40e0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
40f0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
4100: 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
4110: 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
4120: 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
4130: 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
4140: 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
4150: 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
4160: 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
4170: 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
4180: 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
4190: 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
41a0: 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
41b0: 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
41c0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
41d0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f  erator..*/./* Ro
41e0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
41f0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
4200: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ..const char *St
4210: 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72  rsafe(const char
4220: 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61   *);..void Strsa
4230: 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  fe_init(void);.i
4240: 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
4250: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  t(const char *);
4260: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
4270: 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
4280: 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75  char *);../* Rou
4290: 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69  tines for handli
42a0: 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  ng symbols of th
42b0: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74  e grammar */..st
42c0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
42d0: 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68  bol_new(const ch
42e0: 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  ar *);.int Symbo
42f0: 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64  lcmpp(const void
4300: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   *, const void *
4310: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
4320: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4330: 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
4340: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f  uct symbol *, co
4350: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
4360: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
4370: 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
4380: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79  ar *);.struct sy
4390: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
43a0: 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  (int);.int Symbo
43b0: 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73  l_count(void);.s
43c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
43d0: 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f  ymbol_arrayof(vo
43e0: 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  id);../* Routine
43f0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
4400: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
4410: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
4420: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
4430: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
4440: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
4450: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53  ew(void);.void S
4460: 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  tate_init(void);
4470: 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
4480: 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
4490: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
44a0: 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  *);.struct state
44b0: 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72   *State_find(str
44c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
44d0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
44e0: 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  ate_arrayof(/*  
44f0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
4500: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
4510: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
4520: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
4530: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
4540: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f 6e  t(void);.int Con
4550: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
4560: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
4570: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
4580: 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
4590: 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
45a0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  *);.void Configt
45b0: 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
45c0: 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
45d0: 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *));../*********
45e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
45f0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
4600: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
4630: 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61  es processing pa
4640: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20  rser actions in 
4650: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
4660: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
4670: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
4680: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20  w parser action 
4690: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
46a0: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
46b0: 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  new(void){.  sta
46c0: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
46d0: 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  n *freelist = 0;
46e0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
46f0: 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20 20   *newaction;..  
4700: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
4710: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4720: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
4730: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
4740: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
4750: 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a  )calloc(amt, siz
4760: 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f  eof(struct actio
4770: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  n));.    if( fre
4780: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
4790: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
47a0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
47b0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
47c0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
47d0: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
47e0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
47f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
4800: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
4810: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
4820: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
4830: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
4840: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
4850: 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c  ewaction = freel
4860: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
4870: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
4880: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61 63  ;.  return newac
4890: 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  tion;.}../* Comp
48a0: 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  are two actions 
48b0: 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
48c0: 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  oses.  Return ne
48d0: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
48e0: 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66 20  .** positive if 
48f0: 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f 6e  the first action
4900: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
4910: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
4920: 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ter than.** the 
4930: 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  first.*/.static 
4940: 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a 20  int actioncmp(. 
4950: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4960: 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61 63  ap1,.  struct ac
4970: 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20 69  tion *ap2.){.  i
4980: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
4990: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
49a0: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
49b0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
49c0: 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d    rc = (int)ap1-
49d0: 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32  >type - (int)ap2
49e0: 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  ->type;.  }.  if
49f0: 28 20 72 63 3d 3d 30 20 26 26 20 28 61 70 31 2d  ( rc==0 && (ap1-
4a00: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 7c 7c  >type==REDUCE ||
4a10: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 53 48 49 46   ap1->type==SHIF
4a20: 54 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20  TREDUCE) ){.    
4a30: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
4a40: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
4a50: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
4a60: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
4a70: 20 72 63 20 3d 20 28 69 6e 74 29 20 28 61 70 32   rc = (int) (ap2
4a80: 20 2d 20 61 70 31 29 3b 0a 20 20 7d 0a 20 20 72   - ap1);.  }.  r
4a90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
4aa0: 53 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69  Sort parser acti
4ab0: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
4ac0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
4ad0: 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72 75  ion_sort(.  stru
4ae0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29 7b  ct action *ap.){
4af0: 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63 74 20  .  ap = (struct 
4b00: 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 28  action *)msort((
4b10: 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72 20  char *)ap,(char 
4b20: 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20 20  **)&ap->next,.  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
4b50: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
4b60: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63 74  const char*))act
4b70: 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72  ioncmp);.  retur
4b80: 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63  n ap;.}..void Ac
4b90: 74 69 6f 6e 5f 61 64 64 28 0a 20 20 73 74 72 75  tion_add(.  stru
4ba0: 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 2c  ct action **app,
4bb0: 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  .  enum e_action
4bc0: 20 74 79 70 65 2c 0a 20 20 73 74 72 75 63 74 20   type,.  struct 
4bd0: 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 63 68  symbol *sp,.  ch
4be0: 61 72 20 2a 61 72 67 0a 29 7b 0a 20 20 73 74 72  ar *arg.){.  str
4bf0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
4c00: 63 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69  ction;.  newacti
4c10: 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28  on = Action_new(
4c20: 29 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e  );.  newaction->
4c30: 6e 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a  next = *app;.  *
4c40: 61 70 70 20 3d 20 6e 65 77 61 63 74 69 6f 6e 3b  app = newaction;
4c50: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 74 79  .  newaction->ty
4c60: 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77  pe = type;.  new
4c70: 61 63 74 69 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b  action->sp = sp;
4c80: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70  .  newaction->sp
4c90: 4f 70 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 74  Opt = 0;.  if( t
4ca0: 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20  ype==SHIFT ){.  
4cb0: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73    newaction->x.s
4cc0: 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  tp = (struct sta
4cd0: 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73  te *)arg;.  }els
4ce0: 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e  e{.    newaction
4cf0: 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74  ->x.rp = (struct
4d00: 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d   rule *)arg;.  }
4d10: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
4d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63  ********** New c
4d30: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
4d40: 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d 6f   the "acttab" mo
4d50: 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  dule ***********
4d60: 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  /./*.** This mod
4d70: 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ule implements r
4d80: 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20 63  outines use to c
4d90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79 5f  onstruct the yy_
4da0: 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a  action[] table..
4db0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  */../*.** The st
4dc0: 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61 63  ate of the yy_ac
4dd0: 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65 72  tion table under
4de0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 73   construction is
4df0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a   an instance of.
4e00: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
4e10: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
4e20: 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  * The yy_action 
4e30: 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65 20 70  table maps the p
4e40: 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d 62 65  air (state_numbe
4e50: 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e  r, lookahead) in
4e60: 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f  to an.** action_
4e70: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74 61 62  number.  The tab
4e80: 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  le is an array o
4e90: 66 20 69 6e 74 65 67 65 72 73 20 70 61 69 72 73  f integers pairs
4ea0: 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e 75 6d  .  The state_num
4eb0: 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ber.** determine
4ec0: 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66  s an initial off
4ed0: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79 79 5f  set into the yy_
4ee0: 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 20 54  action array.  T
4ef0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20  he lookahead.** 
4f00: 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61 64  value is then ad
4f10: 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e 69 74  ded to this init
4f20: 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20 67 65  ial offset to ge
4f30: 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69 6e 74  t an index X int
4f40: 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69  o the.** yy_acti
4f50: 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74 68 65  on array. If the
4f60: 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b   aAction[X].look
4f70: 61 68 65 61 64 20 65 71 75 61 6c 73 20 74 68 65  ahead equals the
4f80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
4f90: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
4fa0: 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 74 68  d input, then th
4fb0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
4fc0: 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74  ction_number out
4fd0: 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f  put is.** aActio
4fe0: 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66  n[X].action.  If
4ff0: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20   the lookaheads 
5000: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
5010: 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74  n the.** default
5020: 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
5030: 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69 73 20  state_number is 
5040: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5050: 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73 73 6f  All actions asso
5060: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69  ciated with a si
5070: 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65  ngle state_numbe
5080: 72 20 61 72 65 20 66 69 72 73 74 20 65 6e 74 65  r are first ente
5090: 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f  red.** into aLoo
50a0: 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d  kahead[] using m
50b0: 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f  ultiple calls to
50c0: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
50d0: 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20  .  Then the .** 
50e0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 61 74  actions for that
50f0: 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75   single state_nu
5100: 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65 64 20  mber are placed 
5110: 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69 6f 6e  into the aAction
5120: 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77 69 74  [] .** array wit
5130: 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20  h a single call 
5140: 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  to acttab_insert
5150: 28 29 2e 20 20 54 68 65 20 61 63 74 74 61 62 5f  ().  The acttab_
5160: 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a  insert() call.**
5170: 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74 68 65   also resets the
5180: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72   aLookahead[] ar
5190: 72 61 79 20 69 6e 20 70 72 65 70 61 72 61 74 69  ray in preparati
51a0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  on for the next.
51b0: 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65 72 2e  ** state number.
51c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61  .*/.struct looka
51d0: 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  head_action {.  
51e0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20  int lookahead;  
51f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
5200: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61  lue of the looka
5210: 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  head token */.  
5220: 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20  int action;     
5230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
5240: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20  tion to take on 
5250: 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68  the given lookah
5260: 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ead */.};.typede
5270: 66 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20  f struct acttab 
5280: 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20 61  acttab;.struct a
5290: 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41  cttab {.  int nA
52a0: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
52b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
52c0: 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20 69   of used slots i
52d0: 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  n aAction[] */. 
52e0: 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f   int nActionAllo
52f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
5300: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
5310: 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a   for aAction[] *
5320: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61  /.  struct looka
5330: 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20  head_action.    
5340: 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  *aAction,       
5350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5360: 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
5370: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
5380: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61  uction */.    *a
5390: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
53b0: 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73 61 63  ngle new transac
53c0: 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e  tion set */.  in
53d0: 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20  t mnLookahead;  
53e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
53f0: 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64  nimum aLookahead
5400: 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  [].lookahead */.
5410: 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20    int mnAction; 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5430: 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  * Action associa
5440: 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61  ted with mnLooka
5450: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  head */.  int mx
5460: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
5470: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
5480: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
5490: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
54a0: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20  t nLookahead;   
54b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
54c0: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f  ed slots in aLoo
54d0: 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e  kahead[] */.  in
54e0: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  t nLookaheadAllo
54f0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c  c;         /* Sl
5500: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  ots allocated in
5510: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f   aLookahead[] */
5520: 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .};../* Return t
5530: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
5540: 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
5550: 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23  ction table */.#
5560: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 73 69  define acttab_si
5570: 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74  ze(X) ((X)->nAct
5580: 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c  ion)../* The val
5590: 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  ue for the N-th 
55a0: 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69  entry in yy_acti
55b0: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63  on */.#define ac
55c0: 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c  ttab_yyaction(X,
55d0: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
55e0: 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a  n[N].action)../*
55f0: 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
5600: 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e  he N-th entry in
5610: 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f   yy_lookahead */
5620: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
5630: 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29  yylookahead(X,N)
5640: 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b    ((X)->aAction[
5650: 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f  N].lookahead)../
5660: 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
5670: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
5680: 68 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74  h the given actt
5690: 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61  ab */.void actta
56a0: 62 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70  b_free(acttab *p
56b0: 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41  ){.  free( p->aA
56c0: 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28  ction );.  free(
56d0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29   p->aLookahead )
56e0: 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d  ;.  free( p );.}
56f0: 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
5700: 6e 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63  new acttab struc
5710: 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a  ture */.acttab *
5720: 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69  acttab_alloc(voi
5730: 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20  d){.  acttab *p 
5740: 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c  = (acttab *) cal
5750: 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a  loc( 1, sizeof(*
5760: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
5770: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
5780: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
5790: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
57a0: 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74  y for a new actt
57b0: 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  ab.");.    exit(
57c0: 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  1);.  }.  memset
57d0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
57e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ));.  return p;.
57f0: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
5800: 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75  action to the cu
5810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
5820: 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  n set.  .**.** T
5830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5840: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
5850: 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f  ach lookahead fo
5860: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a  r a particular.*
5870: 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  * state..*/.void
5880: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 61   acttab_action(a
5890: 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f  cttab *p, int lo
58a0: 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63 74  okahead, int act
58b0: 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  ion){.  if( p->n
58c0: 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c  Lookahead>=p->nL
58d0: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b  ookaheadAlloc ){
58e0: 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  .    p->nLookahe
58f0: 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20  adAlloc += 25;. 
5900: 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64     p->aLookahead
5910: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
5920: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
5930: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b  ealloc( p->aLook
5940: 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20  ahead,.         
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c      sizeof(p->aL
5970: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e  ookahead[0])*p->
5980: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
5990: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c  );.    if( p->aL
59a0: 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20  ookahead==0 ){. 
59b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
59c0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
59d0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
59e0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
59f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
5a00: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  head==0 ){.    p
5a10: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
5a20: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
5a30: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
5a40: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
5a50: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
5a60: 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
5a70: 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    if( p->mxLooka
5a80: 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29  head<lookahead )
5a90: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
5aa0: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
5ab0: 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68   if( p->mnLookah
5ac0: 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b  ead>lookahead ){
5ad0: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  .      p->mnLook
5ae0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5af0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63  d;.      p->mnAc
5b00: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
5b10: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c     }.  }.  p->aL
5b20: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
5b30: 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61  kahead].lookahea
5b40: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
5b50: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
5b60: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63  ->nLookahead].ac
5b70: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
5b80: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b   p->nLookahead++
5b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
5ba0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5bb0: 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68  et built up with
5bc0: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
5bd0: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a  acttab_action().
5be0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  ** into the curr
5bf0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
5c00: 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68  .  Then reset th
5c10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
5c20: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20  t back.** to an 
5c30: 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65  empty set in pre
5c40: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e  paration for a n
5c50: 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74  ew round of actt
5c60: 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c  ab_action() call
5c70: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
5c80: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
5c90: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
5ca0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e   of the new tran
5cb0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
5cc0: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63  acttab_insert(ac
5cd0: 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ttab *p){.  int 
5ce0: 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73  i, j, k, n;.  as
5cf0: 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  sert( p->nLookah
5d00: 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ead>0 );..  /* M
5d10: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
5d20: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5d30: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64   hold the expand
5d40: 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  ed action table.
5d50: 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73    ** in the wors
5d60: 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72  t case.  The wor
5d70: 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69  st case occurs i
5d80: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
5d90: 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n set.  ** must 
5da0: 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
5db0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5dc0: 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e  n table.  */.  n
5dd0: 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   = p->mxLookahea
5de0: 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  d + 1;.  if( p->
5df0: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70  nAction + n >= p
5e00: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29  ->nActionAlloc )
5e10: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c  {.    int oldAll
5e20: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  oc = p->nActionA
5e30: 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63  lloc;.    p->nAc
5e40: 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  tionAlloc = p->n
5e50: 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e  Action + n + p->
5e60: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32  nActionAlloc + 2
5e70: 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  0;.    p->aActio
5e80: 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  n = (struct look
5e90: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
5ea0: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74  realloc( p->aAct
5eb0: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5ed0: 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e  izeof(p->aAction
5ee0: 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41  [0])*p->nActionA
5ef0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
5f00: 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a  ->aAction==0 ){.
5f10: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
5f20: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
5f30: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
5f40: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
5f50: 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63    for(i=oldAlloc
5f60: 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  ; i<p->nActionAl
5f70: 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  loc; i++){.     
5f80: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
5f90: 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20  ookahead = -1;. 
5fa0: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
5fb0: 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a  i].action = -1;.
5fc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5fd0: 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e  Scan the existin
5fe0: 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c  g action table l
5ff0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66  ooking for an of
6000: 66 73 65 74 20 74 68 61 74 20 69 73 20 61 20 0a  fset that is a .
6010: 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f    ** duplicate o
6020: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
6030: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20  ansaction set.  
6040: 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20  Fall out of the 
6050: 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64  loop.  ** if and
6060: 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63   when the duplic
6070: 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ate is found..  
6080: 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65  **.  ** i is the
6090: 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63   index in p->aAc
60a0: 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e  tion[] where p->
60b0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69  mnLookahead is i
60c0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
60d0: 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e  for(i=p->nAction
60e0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
60f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6100: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[i].lookahead=
6110: 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20  =p->mnLookahead 
6120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
6130: 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61  lookaheads and a
6140: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c  ctions in the aL
6150: 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73  ookahead[] trans
6160: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
6170: 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e  must match again
6180: 73 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  st the candidate
6190: 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72   aAction[i] entr
61a0: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
61b0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63  p->aAction[i].ac
61c0: 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f  tion!=p->mnActio
61d0: 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
61e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
61f0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
6200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
6210: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6220: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6230: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30  .        if( k<0
6250: 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f   || k>=p->nActio
6260: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  n ) break;.     
6270: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
6280: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6290: 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d  d!=p->aAction[k]
62a0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65  .lookahead ) bre
62b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
62c0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
62d0: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74  .action!=p->aAct
62e0: 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20  ion[k].action ) 
62f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6300: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
6310: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
6320: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e  nue;..      /* N
6330: 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61  o possible looka
6340: 68 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20  head value that 
6350: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c  is not in the aL
6360: 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20  ookahead[].     
6370: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
6380: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  is allowed to ma
6390: 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a  tch aAction[i] *
63a0: 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20  /.      n = 0;. 
63b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
63c0: 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29  p->nAction; j++)
63d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
63e0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
63f0: 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e  ahead<0 ) contin
6400: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
6410: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
6420: 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e  okahead==j+p->mn
6430: 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b  Lookahead-i ) n+
6440: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
6450: 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b   if( n==p->nLook
6460: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20  ahead ){.       
6470: 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65   break;  /* An e
6480: 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f  xact match is fo
6490: 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20  und at offset i 
64a0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
64b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
64c0: 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74   existing offset
64d0: 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20  s exactly match 
64e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
64f0: 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e  saction, find an
6500: 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f  .  ** an empty o
6510: 66 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63  ffset in the aAc
6520: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20  tion[] table in 
6530: 77 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64  which we can add
6540: 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61   the.  ** aLooka
6550: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
6560: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  on..  */.  if( i
6570: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f  <0 ){.    /* Loo
6580: 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74  k for holes in t
6590: 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62  he aAction[] tab
65a0: 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65 20  le that fit the 
65b0: 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61  current.    ** a
65c0: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e  Lookahead[] tran
65d0: 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20  saction.  Leave 
65e0: 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  i set to the off
65f0: 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e  set of the hole.
6600: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f  .    ** If no ho
6610: 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 69  les are found, i
6620: 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e   is left at p->n
6630: 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65  Action, which me
6640: 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ans the.    ** t
6650: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
6660: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a  be appended. */.
6670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6680: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d  ->nActionAlloc -
6690: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b   p->mxLookahead;
66a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
66b0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
66c0: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20  ookahead<0 ){.  
66d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
66e0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
66f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6700: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
6710: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
6720: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6730: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  + i;.          i
6740: 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a  f( k<0 ) break;.
6750: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6760: 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b  >aAction[k].look
6770: 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61 6b  ahead>=0 ) break
6780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6790: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67a0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
67c0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
67d0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
67e0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
67f0: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
6800: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
6810: 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -i ) break;.    
6820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6830: 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( j==p->nAction 
6840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
6850: 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20  ak;  /* Fits in 
6860: 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20  empty slots */. 
6870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
6890: 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69  Insert transacti
68a0: 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20  on set at index 
68b0: 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  i. */.  for(j=0;
68c0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
68d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
68e0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
68f0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6900: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6910: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6920: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6930: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6940: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6950: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6960: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  }.  p->nLooka
6970: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
6980: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6990: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
69a0: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
69b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
69c0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
69d0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
69e0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
69f0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
6a00: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
6a10: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6a20: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
6a30: 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20   file "build.c" 
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6a60: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
6a70: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68   construction th
6a80: 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  e finite state m
6a90: 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c  achine for the L
6aa0: 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67  EMON.** parser g
6ab0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
6ac0: 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e   Find a preceden
6ad0: 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65  ce symbol of eve
6ae0: 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  ry rule in the g
6af0: 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54  rammar..** .** T
6b00: 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68  hose rules which
6b10: 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e   have a preceden
6b20: 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20  ce symbol coded 
6b30: 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  in the input.** 
6b40: 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68  grammar using th
6b50: 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e  e "[symbol]" con
6b60: 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65  struct will alre
6b70: 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20  ady have the.** 
6b80: 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c  rp->precsym fiel
6b90: 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72  d filled.  Other
6ba0: 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74   rules take as t
6bb0: 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a  heir precedence.
6bc0: 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69  ** symbol the fi
6bd0: 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77  rst RHS symbol w
6be0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
6bf0: 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68  ecedence.  If th
6c00: 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52  ere.** are not R
6c10: 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20  HS symbols with 
6c20: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
6c30: 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64  ence, the preced
6c40: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66  ence.** symbol f
6c50: 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61  ield is left bla
6c60: 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nk..*/.void Find
6c70: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
6c80: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
6c90: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
6ca0: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
6cb0: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
6cc0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
6cd0: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
6ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
6cf0: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, j;.      for(
6d00: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20  i=0; i<rp->nrhs 
6d10: 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  && rp->precsym==
6d20: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
6d30: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6d40: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
6d50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
6d60: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
6d70: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
6d80: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d    for(j=0; j<sp-
6d90: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6db0: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70  sp->subsym[j]->p
6dc0: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
6dd0: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
6de0: 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  sym = sp->subsym
6df0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
6e00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
6e30: 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d  e if( sp->prec>=
6e40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
6e50: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d  p->precsym = rp-
6e60: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
6e70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
6e90: 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f  ../* Find all no
6ea0: 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
6eb0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74   will generate t
6ec0: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  he empty string.
6ed0: 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b  .** Then go back
6ee0: 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
6ef0: 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65   first sets of e
6f00: 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  very nonterminal
6f10: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73  ..** The first s
6f20: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
6f30: 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79   all terminal sy
6f40: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
6f50: 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e  begin.** a strin
6f60: 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  g generated by t
6f70: 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  hat nonterminal.
6f80: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  .*/.void FindFir
6f90: 73 74 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  stSets(struct le
6fa0: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
6fb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
6fc0: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e  t rule *rp;.  in
6fd0: 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66  t progress;..  f
6fe0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
6ff0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
7000: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
7010: 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45  [i]->lambda = LE
7020: 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20  MON_FALSE;.  }. 
7030: 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65   for(i=lemp->nte
7040: 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e  rminal; i<lemp->
7050: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
7060: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
7070: 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20  [i]->firstset = 
7080: 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20  SetNew();.  }.. 
7090: 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74   /* First comput
70a0: 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f  e all lambdas */
70b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
70c0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
70d0: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
70e0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
70f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  {.      if( rp->
7100: 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f  lhs->lambda ) co
7110: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
7120: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
7130: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
7140: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7150: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
7160: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7170: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
7180: 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61  RMINAL || sp->la
7190: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
71a0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  E );.        if(
71b0: 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   sp->lambda==LEM
71c0: 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b  ON_FALSE ) break
71d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
71e0: 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20  if( i==rp->nrhs 
71f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  ){.        rp->l
7200: 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  hs->lambda = LEM
7210: 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20  ON_TRUE;.       
7220: 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
7230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7240: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
7250: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d  );..  /* Now com
7260: 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73  pute all first s
7270: 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  ets */.  do{.   
7280: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7290: 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f  s1, *s2;.    pro
72a0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
72b0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
72c0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
72d0: 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72  t){.      s1 = r
72e0: 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f  p->lhs;.      fo
72f0: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
7300: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
7310: 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   s2 = rp->rhs[i]
7320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32  ;.        if( s2
7330: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
7340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
7350: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
7360: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7370: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
7380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 32 2d     }else if( s2-
73a0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
73b0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
73c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d    for(j=0; j<s2-
73d0: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67              prog
73f0: 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73  ress += SetAdd(s
7400: 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e  1->firstset,s2->
7410: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78  subsym[j]->index
7420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7430: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7440: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7450: 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20  ( s1==s2 ){.    
7460: 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61        if( s1->la
7470: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
7480: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
7490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
74a0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
74b0: 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72  SetUnion(s1->fir
74c0: 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73  stset,s2->firsts
74d0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  et);.          i
74e0: 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( s2->lambda==L
74f0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
7500: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
7520: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
7530: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7540: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
7550: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
7560: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
7570: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
7580: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
7590: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
75a0: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
75b0: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
75c0: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
75d0: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
75e0: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
75f0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
7600: 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  ;  /* forward re
7610: 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20  ference */.void 
7620: 46 69 6e 64 53 74 61 74 65 73 28 73 74 72 75 63  FindStates(struc
7630: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
7640: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
7650: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
7660: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66  ule *rp;..  Conf
7670: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a  iglist_init();..
7680: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74    /* Find the st
7690: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
76a0: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
76b0: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
76c0: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
76d0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
76e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  ==0 ){.      Err
76f0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
7700: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65  name,0,."The spe
7710: 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d  cified start sym
7720: 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  bol \"%s\" is no
7730: 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d  t \.in a nonterm
7740: 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d  inal of the gram
7750: 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c  mar.  \"%s\" wil
7760: 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  l be used as the
7770: 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20   start \.symbol 
7780: 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e  instead.",lemp->
7790: 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 73 74 61 72  start,lemp->star
77a0: 74 52 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  tRule->lhs->name
77b0: 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
77c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
77d0: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
77e0: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20  tRule->lhs;.    
77f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7800: 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52  p = lemp->startR
7810: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20  ule->lhs;.  }.. 
7820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
7830: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64  e start symbol d
7840: 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20  oesn't occur on 
7850: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
7860: 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20  ide of.  ** any 
7870: 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  rule.  Report an
7880: 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65   error if it doe
7890: 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20  s.  (YACC would 
78a0: 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20  generate a new. 
78b0: 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c   ** start symbol
78c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20   in this case.) 
78d0: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
78e0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
78f0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e  p->next){.    in
7900: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
7910: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
7920: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  +){.      if( rp
7930: 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20  ->rhs[i]==sp ){ 
7940: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65    /* FIX ME:  De
7950: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72  al with multiter
7960: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  minals */.      
7970: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
7980: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
7990: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c  e start symbol \
79a0: 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20  "%s\" occurs on 
79b0: 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64  the \.right-hand
79c0: 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e   side of a rule.
79d0: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c   This will resul
79e0: 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68  t in a parser wh
79f0: 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77  ich \.does not w
7a00: 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73  ork properly.",s
7a10: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
7a20: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
7a30: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
7a40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
7a50: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
7a60: 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20  ion set for the 
7a70: 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a  first state.  **
7a80: 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68   is all rules wh
7a90: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61  ich have the sta
7aa0: 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65  rt symbol as the
7ab0: 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e  ir.  ** left-han
7ac0: 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28  d side */.  for(
7ad0: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=sp->rule; rp;
7ae0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29   rp=rp->nextlhs)
7af0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  {.    struct con
7b00: 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20  fig *newcfp;.   
7b10: 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20   rp->lhsStart = 
7b20: 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20  1;.    newcfp = 
7b30: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7b40: 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53  sis(rp,0);.    S
7b50: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
7b60: 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  s,0);.  }..  /* 
7b70: 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  Compute the firs
7b80: 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74  t state.  All ot
7b90: 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20  her states will 
7ba0: 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  be.  ** computed
7bb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
7bc0: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74  uring the comput
7bd0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
7be0: 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65  st one..  ** The
7bf0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
7c00: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
7c10: 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64  tate is not used
7c20: 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
7c30: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72  state(lemp);.  r
7c40: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
7c50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7c60: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69   a state which i
7c70: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  s described by t
7c80: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7c90: 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68  .** list which h
7ca0: 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72  as been built fr
7cb0: 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66  om calls to Conf
7cc0: 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50  iglist_add..*/.P
7cd0: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
7ce0: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
7cf0: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
7d00: 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77  tate *); /* Forw
7d10: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
7d20: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
7d30: 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c  etstate(struct l
7d40: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7d50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7d60: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
7d70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
7d80: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
7d90: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
7da0: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
7db0: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
7dc0: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
7dd0: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
7de0: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
7df0: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
7e00: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
7e10: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
7e20: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
7e30: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
7e40: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
7e50: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
7e60: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
7e70: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
7e80: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
7e90: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
7ea0: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
7eb0: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
7ec0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
7ed0: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
7ee0: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
7ef0: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
7f00: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
7f10: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
7f20: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
7f30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7f40: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
7f50: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
7f60: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
7f70: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
7f80: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
7f90: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
7fa0: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
7fb0: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
7fc0: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
7fd0: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
7fe0: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
7ff0: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
8000: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
8010: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
8020: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
8030: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
8040: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
8050: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
8060: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
8070: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
8080: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
8090: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
80a0: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
80b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
80c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
80d0: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
80e0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
80f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
8100: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
8110: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
8120: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
8130: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
8140: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
8150: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
8160: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
8170: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
8180: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
8190: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
81a0: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
81b0: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
81c0: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
81d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
81e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
81f0: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
8200: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
8210: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
8220: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
8230: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
8240: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
8250: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
8260: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
8270: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
8280: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
8290: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
82a0: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
82b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
82c0: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
82d0: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
82e0: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
82f0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
8300: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
8310: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
8320: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
8330: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
8340: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
8350: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
8360: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
8370: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
8380: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
8390: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
83a0: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
83b0: 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  l(struct symbol 
83c0: 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f  *a, struct symbo
83d0: 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  l *b).{.  int i;
83e0: 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65  .  if( a==b ) re
83f0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d  turn 1;.  if( a-
8400: 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
8410: 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b  INAL ) return 0;
8420: 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d  .  if( b->type!=
8430: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20  MULTITERMINAL ) 
8440: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
8450: 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e  a->nsubsym!=b->n
8460: 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20  subsym ) return 
8470: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
8480: 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29  a->nsubsym; i++)
8490: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62  {.    if( a->sub
84a0: 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79  sym[i]!=b->subsy
84b0: 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  m[i] ) return 0;
84c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
84d0: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  .}../* Construct
84e0: 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73   all successor s
84f0: 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76  tates to the giv
8500: 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75  en state.  A "su
8510: 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74  ccessor".** stat
8520: 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77  e is any state w
8530: 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63  hich can be reac
8540: 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61  hed by a shift a
8550: 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
8560: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
8570: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
8580: 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74  *lemp, struct st
8590: 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74  ate *stp).{.  st
85a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
85b0: 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
85c0: 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69  g thru the confi
85d0: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
85e0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
85f0: 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20  onfig *bcfp; /* 
8600: 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  For the inner lo
8610: 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f  op on config clo
8620: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
8630: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8640: 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f   *newcfg;  /* */
8650: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
8660: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
8670: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
8680: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
8690: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
86a0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
86b0: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
86c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
86d0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
86e0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
86f0: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
8700: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
8710: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
8720: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
8730: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
8740: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
8750: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
8760: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
8770: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
8780: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
8790: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
87a0: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
87b0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
87c0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
87d0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
87e0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
87f0: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
8800: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
8810: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
8820: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
8830: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
8840: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8850: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
8860: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
8870: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
8880: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
8890: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
88a0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
88b0: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
88c0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
88d0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
88e0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
88f0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
8900: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
8930: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
8940: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
8950: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
8960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8970: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
8980: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
8990: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
89a0: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
89b0: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
89c0: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
89d0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
89e0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
89f0: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
8a00: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
8a10: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
8a20: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
8a30: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
8a40: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
8a50: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
8a60: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
8a70: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
8a80: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
8a90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
8aa0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
8ab0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
8ac0: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
8ad0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
8ae0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
8af0: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
8b00: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
8b10: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
8b20: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
8b30: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
8b40: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
8b50: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
8b60: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
8b70: 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62    if( !same_symb
8b80: 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e  ol(bsp,sp) ) con
8b90: 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d  tinue;      /* M
8ba0: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
8bb0: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
8bc0: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
8bd0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8bf0: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
8c00: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
8c10: 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67   newcfg = Config
8c20: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
8c30: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
8c40: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
8c50: 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70  _add(&newcfg->bp
8c60: 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a  lp,bcfp);.    }.
8c70: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  .    /* Get a po
8c80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 61  inter to the sta
8c90: 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  te described by 
8ca0: 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  the basis config
8cb0: 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20  uration set.    
8cc0: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  ** constructed i
8cd0: 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20  n the preceding 
8ce0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73  loop */.    news
8cf0: 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65  tp = getstate(le
8d00: 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  mp);..    /* The
8d10: 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22 20   state "newstp" 
8d20: 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20  is reached from 
8d30: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8d40: 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f  by a shift actio
8d50: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  n.    ** on the 
8d60: 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20  symbol "sp" */. 
8d70: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
8d80: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
8d90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8da0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8db0: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  sp->nsubsym; i++
8dc0: 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f  ){.        Actio
8dd0: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53  n_add(&stp->ap,S
8de0: 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  HIFT,sp->subsym[
8df0: 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70  i],(char*)newstp
8e00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69  else{.      Acti
8e20: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
8e30: 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a  SHIFT,sp,(char *
8e40: 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a  )newstp);.    }.
8e50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
8e60: 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61  struct the propa
8e70: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a  gation links.*/.
8e80: 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73  void FindLinks(s
8e90: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
8ea0: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
8eb0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
8ec0: 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74  fp, *other;.  st
8ed0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
8ee0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
8ef0: 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73  *plp;..  /* Hous
8f00: 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a  ekeeping detail:
8f10: 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65  .  ** Add to eve
8f20: 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  ry propagate lin
8f30: 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b  k a pointer back
8f40: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f   to the state to
8f50: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
8f60: 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64  link is attached
8f70: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
8f80: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
8f90: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
8fa0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
8fb0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
8fc0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8fd0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8fe0: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70    cfp->stp = stp
8ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9000: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61  * Convert all ba
9010: 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72  cklinks into for
9020: 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c  ward links.  Onl
9030: 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20  y the forward.  
9040: 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65  ** links are use
9050: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  d in the follow-
9060: 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  set computation.
9070: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
9080: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
9090: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
90a0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
90b0: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
90c0: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
90d0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
90e0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70   for(plp=cfp->bp
90f0: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
9100: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
9110: 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66   other = plp->cf
9120: 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b  p;.        Plink
9130: 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c  _add(&other->fpl
9140: 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,cfp);.      }.
9150: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
9160: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c  Compute all foll
9170: 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  owsets..**.** A 
9180: 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65  followset is the
9190: 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62   set of all symb
91a0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f  ols which can co
91b0: 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  me immediately.*
91c0: 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67  * after a config
91d0: 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  uration..*/.void
91e0: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
91f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
9200: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
9210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9220: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  cfp;.  struct pl
9230: 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20  ink *plp;.  int 
9240: 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20  progress;.  int 
9250: 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69  change;..  for(i
9260: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9270: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  te; i++){.    fo
9280: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
9290: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
92a0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
92b0: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74  .      cfp->stat
92c0: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
92d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
92e0: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
92f0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
9300: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9310: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
9320: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
9330: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
9340: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9350: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
9360: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
9370: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
9380: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
9390: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
93a0: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
93b0: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
93c0: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
93d0: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
93e0: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
93f0: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
9400: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
9410: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
9420: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
9430: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
9440: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9460: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
9470: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  MPLETE;.      }.
9480: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9490: 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73  progress );.}..s
94a0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
94b0: 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63  e_conflict(struc
94c0: 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63  t action *,struc
94d0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
94e0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64   Compute the red
94f0: 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64  uce actions, and
9500: 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   resolve conflic
9510: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  ts..*/.void Find
9520: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
9530: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
9540: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
9550: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
9560: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
9570: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
9580: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
9590: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
95a0: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
95b0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20   reduce actions 
95c0: 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61  .  ** A reduce a
95d0: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66  ction is added f
95e0: 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  or each element 
95f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74  of the followset
9600: 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69   of.  ** a confi
9610: 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68  guration which h
9620: 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68  as its dot at th
9630: 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e  e extreme right.
9640: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
9650: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9660: 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70   i++){   /* Loop
9670: 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
9680: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
9690: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
96a0: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
96b0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
96c0: 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f  p->next){  /* Lo
96d0: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66  op over all conf
96e0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  igurations */.  
96f0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d      if( cfp->rp-
9700: 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20  >nrhs==cfp->dot 
9710: 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  ){        /* Is 
9720: 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72  dot at extreme r
9730: 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20  ight? */.       
9740: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
9750: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
9760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9770: 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77   SetFind(cfp->fw
9780: 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s,j) ){.        
9790: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64      /* Add a red
97a0: 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68  uce action to th
97b0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
97c0: 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ich will reduce 
97d0: 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  by the.         
97e0: 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d     ** rule "cfp-
97f0: 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b  >rp" if the look
9800: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20  ahead symbol is 
9810: 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  "lemp->symbols[j
9820: 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ]" */.          
9830: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
9840: 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d  p->ap,REDUCE,lem
9850: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63  p->symbols[j],(c
9860: 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a  har *)cfp->rp);.
9870: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9890: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
98a0: 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67 20  d the accepting 
98b0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c  token */.  if( l
98c0: 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20  emp->start ){.  
98d0: 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
98e0: 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b  nd(lemp->start);
98f0: 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29  .    if( sp==0 )
9900: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
9910: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65  tRule->lhs;.  }e
9920: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
9930: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
9940: 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64  hs;.  }.  /* Add
9950: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74   to the first st
9960: 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c  ate (which is al
9970: 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e  ways the startin
9980: 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20  g state of the. 
9990: 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65   ** finite state
99a0: 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74   machine) an act
99b0: 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66  ion to ACCEPT if
99c0: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69   the lookahead i
99d0: 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
99e0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a   nonterminal.  *
99f0: 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26  /.  Action_add(&
9a00: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d  lemp->sorted[0]-
9a10: 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29  >ap,ACCEPT,sp,0)
9a20: 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
9a30: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66  conflicts */.  f
9a40: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9a50: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9a60: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
9a70: 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73  *ap, *nap;.    s
9a80: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
9a90: 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73  d[i];.    /* ass
9aa0: 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20  ert( stp->ap ); 
9ab0: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  */.    stp->ap =
9ac0: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
9ad0: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
9ae0: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
9af0: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
9b00: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
9b10: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
9b20: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
9b30: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
9b40: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
9b50: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
9b60: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
9b70: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
9b80: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
9b90: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
9ba0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
9bb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
9bc0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
9bd0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
9be0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
9bf0: 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nap);.      }.  
9c00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
9c10: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f  port an error fo
9c20: 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74  r each rule that
9c30: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65   can never be re
9c40: 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  duced. */.  for(
9c50: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
9c60: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
9c70: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
9c80: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66  LEMON_FALSE;.  f
9c90: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9ca0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9cb0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
9cc0: 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  *ap;.    for(ap=
9cd0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
9ce0: 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
9cf0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
9d00: 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
9d10: 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61  E ) ap->x.rp->ca
9d20: 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  nReduce = LEMON_
9d30: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
9d40: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
9d50: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
9d60: 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72  next){.    if( r
9d70: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63  p->canReduce ) c
9d80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72  ontinue;.    Err
9d90: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
9da0: 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
9db0: 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e  e,"This rule can
9dc0: 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e   not be reduced.
9dd0: 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  \n");.    lemp->
9de0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
9df0: 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20  }../* Resolve a 
9e00: 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e  conflict between
9e10: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61   the two given a
9e20: 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a  ctions.  If the.
9e30: 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27  ** conflict can'
9e40: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72  t be resolved, r
9e50: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
9e60: 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20  **.** NO LONGER 
9e70: 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65  TRUE:.**   To re
9e80: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
9e90: 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20  , first look to 
9ea0: 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63  see if either ac
9eb0: 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20  tion.**   is on 
9ec0: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  an error rule.  
9ed0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61  In that case, ta
9ee0: 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68  ke the action wh
9ef0: 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ich.**   is not 
9f00: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9f10: 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20  the error rule. 
9f20: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62   If neither or b
9f30: 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73  oth.**   actions
9f40: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20   are associated 
9f50: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75  with an error ru
9f60: 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a  le, then try to.
9f70: 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65  **   use precede
9f80: 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  nce to resolve t
9f90: 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a  he conflict..**.
9fa0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74  ** If either act
9fb0: 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20  ion is a SHIFT, 
9fc0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
9fd0: 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75  apx.  This.** fu
9fe0: 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72  nction won't wor
9ff0: 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d  k if apx->type==
a000: 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e  REDUCE and apy->
a010: 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a  type==SHIFT..*/.
a020: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
a030: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  ve_conflict(.  s
a040: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
a050: 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x,.  struct acti
a060: 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72  on *apy.){.  str
a070: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c  uct symbol *spx,
a080: 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72   *spy;.  int err
a090: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  cnt = 0;.  asser
a0a0: 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d  t( apx->sp==apy-
a0b0: 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72  >sp );  /* Other
a0c0: 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64  wise there would
a0d0: 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20   be no conflict 
a0e0: 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79  */.  if( apx->ty
a0f0: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
a100: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b  ->type==SHIFT ){
a110: 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d  .    apy->type =
a120: 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SSCONFLICT;.   
a130: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
a140: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
a150: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
a160: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
a170: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b    spx = apx->sp;
a180: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
a190: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
a1a0: 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c     if( spy==0 ||
a1b0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spx->prec<0 || 
a1c0: 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20  spy->prec<0 ){. 
a1d0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75       /* Not enou
a1e0: 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e  gh precedence in
a1f0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
a200: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a210: 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SRCONFLICT;.    
a220: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
a230: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
a240: 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec>spy->prec ){
a250: 20 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72      /* higher pr
a260: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
a270: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a280: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
a290: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
a2a0: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
a2b0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
a2c0: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
a2d0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
a2e0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
a2f0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
a300: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
a310: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
a320: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
a330: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a360: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
a370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a380: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
a390: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
a3a0: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
a3b0: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
a3c0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
a3d0: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a3f0: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
a400: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
a410: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
a420: 29 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  );.      apx->ty
a430: 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20 20  pe = ERROR;.    
a440: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70  }.  }else if( ap
a450: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
a460: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
a470: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
a480: 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apx->x.rp->pre
a490: 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20  csym;.    spy = 
a4a0: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
a4b0: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d  ym;.    if( spx=
a4c0: 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20  =0 || spy==0 || 
a4d0: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20  spx->prec<0 ||. 
a4e0: 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c     spy->prec<0 |
a4f0: 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  | spx->prec==spy
a500: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a510: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f  apy->type = RRCO
a520: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
a530: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
a540: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
a550: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
a560: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
a570: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
a580: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
a590: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
a5a0: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
a5b0: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
a5c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
a5d0: 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
a5e0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f    apx->type==SH_
a5f0: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
a600: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f    apx->type==RD_
a610: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
a620: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43    apx->type==SSC
a630: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
a640: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f   apx->type==SRCO
a650: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
a660: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e  apx->type==RRCON
a670: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a680: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53  py->type==SH_RES
a690: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
a6a0: 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53  py->type==RD_RES
a6b0: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
a6c0: 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46  py->type==SSCONF
a6d0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
a6e0: 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c  y->type==SRCONFL
a6f0: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
a700: 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49  ->type==RRCONFLI
a710: 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a  CT.    );.    /*
a720: 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46   The REDUCE/SHIF
a730: 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61  T case cannot ha
a740: 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49  ppen because SHI
a750: 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a  FTs come before.
a760: 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f      ** REDUCEs o
a770: 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20  n the list.  If 
a780: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
a790: 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62  int it must be b
a7a0: 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
a7b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63  e parser conflic
a7c0: 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  t had already be
a7d0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
a7e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
a7f0: 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  cnt;.}./********
a800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
a810: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e  om the file "con
a820: 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a  figlist.c" *****
a830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a840: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
a850: 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69  ines to processi
a860: 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  ng a configurati
a870: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c  on list and buil
a880: 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20  ding a state.** 
a890: 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
a8a0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
a8b0: 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  /..static struct
a8c0: 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73   config *freelis
a8d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
a8e0: 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66  ist of free conf
a8f0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  igurations */.st
a900: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a910: 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b  ig *current = 0;
a920: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
a930: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
a940: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
a950: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
a960: 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30  **currentend = 0
a970: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c  ;   /* Last on l
a980: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a  ist of configs *
a990: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
a9a0: 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20  config *basis = 
a9b0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  0;         /* To
a9c0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  p of list of bas
a9d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  is configs */.st
a9e0: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a9f0: 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20  ig **basisend = 
aa00: 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  0;     /* End of
aa10: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
aa20: 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65  onfigs */../* Re
aa30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
aa40: 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  o a new configur
aa50: 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
aa60: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
aa70: 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73  newconfig(){.  s
aa80: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
aa90: 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65  wcfg;.  if( free
aaa0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
aab0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
aac0: 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c  t = 3;.    freel
aad0: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f  ist = (struct co
aae0: 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61  nfig *)calloc( a
aaf0: 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  mt, sizeof(struc
ab00: 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20  t config) );.   
ab10: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
ab20: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ab30: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
ab40: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
ab50: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f  ory for a new co
ab60: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a  nfiguration.");.
ab70: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
ab80: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
ab90: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
aba0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
abb0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
abc0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
abd0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
abe0: 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20  .  }.  newcfg = 
abf0: 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65  freelist;.  free
ac00: 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d  list = freelist-
ac10: 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
ac20: 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68  newcfg;.}../* Th
ac30: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
ac40: 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67  "old" is no long
ac50: 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41  er used */.PRIVA
ac60: 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f  TE void deleteco
ac70: 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66  nfig(struct conf
ac80: 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64  ig *old).{.  old
ac90: 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73  ->next = freelis
aca0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
acb0: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  old;.}../* Initi
acc0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
acd0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
ace0: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
acf0: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b  nfiglist_init(){
ad00: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
ad10: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
ad20: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
ad30: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
ad40: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
ad50: 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b  figtable_init();
ad60: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
ad70: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   Initialized the
ad80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ad90: 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76  ist builder */.v
ada0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  oid Configlist_r
adb0: 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  eset(){.  curren
adc0: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
add0: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
ade0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
adf0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
ae00: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
ae10: 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75  clear(0);.  retu
ae20: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e  rn;.}../* Add an
ae30: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
ae40: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
ae50: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
ae60: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
ae70: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a  Configlist_add(.
ae80: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
ae90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p,    /* The rul
aea0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20  e */.  int dot  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
aec0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
aed0: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
aee0: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
aef0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63  */.){.  struct c
af00: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
af10: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
af20: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
af30: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
af40: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
af50: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
af60: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
af70: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
af80: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
af90: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
afa0: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
afb0: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
afc0: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
afd0: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
afe0: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
aff0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b000: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b010: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b020: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b030: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b040: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b050: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b060: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
b070: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b090: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
b0a0: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b0b0: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
b0c0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b0d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
b0e0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
b0f0: 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  is(struct rule *
b100: 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20  rp, int dot).{. 
b110: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b120: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
b130: 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21  ssert( basisend!
b140: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b150: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b160: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b170: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b180: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b190: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b1a0: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b1c0: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b1d0: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b1e0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b1f0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b200: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b210: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b220: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b230: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b240: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b250: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b260: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b270: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b280: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b290: 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73  next;.    *basis
b2a0: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62  end = cfp;.    b
b2b0: 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e  asisend = &cfp->
b2c0: 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  bp;.    Configta
b2d0: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b2e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b2f0: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  p;.}../* Compute
b300: 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20   the closure of 
b310: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b320: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
b330: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
b340: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
b350: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
b360: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e   config *cfp, *n
b370: 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20  ewcfp;.  struct 
b380: 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70  rule *rp, *newrp
b390: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
b3a0: 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69  l *sp, *xsp;.  i
b3b0: 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73  nt i, dot;..  as
b3c0: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
b3d0: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70  !=0 );.  for(cfp
b3e0: 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63  =current; cfp; c
b3f0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
b400: 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b     rp = cfp->rp;
b410: 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e  .    dot = cfp->
b420: 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74  dot;.    if( dot
b430: 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  >=rp->nrhs ) con
b440: 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20  tinue;.    sp = 
b450: 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20  rp->rhs[dot];.  
b460: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
b470: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
b480: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c       if( sp->rul
b490: 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70  e==0 && sp!=lemp
b4a0: 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
b4b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
b4c0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
b4d0: 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61  line,"Nontermina
b4e0: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20  l \"%s\" has no 
b4f0: 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  rules.",.       
b500: 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20     sp->name);.  
b510: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
b520: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
b530: 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d        for(newrp=
b540: 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b  sp->rule; newrp;
b550: 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65   newrp=newrp->ne
b560: 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20  xtlhs){.        
b570: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
b580: 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29  ist_add(newrp,0)
b590: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
b5a0: 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68  dot+1; i<rp->nrh
b5b0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
b5c0: 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73     xsp = rp->rhs
b5d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
b5e0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45  f( xsp->type==TE
b5f0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
b600: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
b610: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e  cfp->fws,xsp->in
b620: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
b630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b640: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70     }else if( xsp
b650: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
b660: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
b670: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
b680: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
b690: 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b   k<xsp->nsubsym;
b6a0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
b6b0: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
b6c0: 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75  fp->fws, xsp->su
b6d0: 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b  bsym[k]->index);
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b700: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b710: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e{.            S
b720: 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e  etUnion(newcfp->
b730: 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65  fws,xsp->firstse
b740: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
b750: 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d  if( xsp->lambda=
b760: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
b770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b780: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b790: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
b7a0: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
b7b0: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
b7c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
b7d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
b7e0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
b7f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b800: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
b810: 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63  list_sort(){.  c
b820: 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74  urrent = (struct
b830: 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28   config*)msort((
b840: 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63  char*)current,(c
b850: 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d  har**)&(current-
b860: 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20 20 20  >next),.        
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67            Config
b890: 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65  cmp);.  currente
b8a0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
b8b0: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
b8c0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
b8d0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
b8e0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
b8f0: 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69  tbasis(){.  basi
b900: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
b910: 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a  ig*)msort((char*
b920: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a  )current,(char**
b930: 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c  )&(current->bp),
b940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62   Configcmp);.  b
b970: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
b980: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
b990: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b9a0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
b9b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
b9c0: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ist and.** reset
b9d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72   the list */.str
b9e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
b9f0: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 7b  iglist_return(){
ba00: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
ba10: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63   *old;.  old = c
ba20: 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e  urrent;.  curren
ba30: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
ba40: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
ba50: 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  n old;.}../* Ret
ba60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ba70: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
ba80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ba90: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ist and.** reset
baa0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72   the list */.str
bab0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
bac0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b 0a  iglist_basis(){.
bad0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
bae0: 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61  *old;.  old = ba
baf0: 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  sis;.  basis = 0
bb00: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
bb10: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
bb20: 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65  }../* Free all e
bb30: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67  lements of the g
bb40: 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  iven configurati
bb50: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
bb60: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73  Configlist_eat(s
bb70: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
bb80: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
bb90: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
bba0: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
bbb0: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
bbc0: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
bbd0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
bbe0: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
bbf0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
bc00: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
bc10: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
bc20: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
bc30: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
bc40: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
bc50: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
bc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
bc70: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
bc80: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
bc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bca0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
bcb0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
bcc0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
bcd0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
bce0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
bcf0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
bd00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
bd10: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
bd20: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
bd30: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
bd40: 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  d: ", filename, 
bd50: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74  lineno);.  va_st
bd60: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
bd70: 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  .  vfprintf(stde
bd80: 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  rr,format,ap);. 
bd90: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66   va_end(ap);.  f
bda0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
bdb0: 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  \n");.}./*******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
bdd0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
bde0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
be10: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
be20: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
be30: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
be40: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
be50: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
be60: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
be70: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
be80: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
be90: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
bea0: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
beb0: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
bec0: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
bed0: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
bee0: 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
bef0: 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e  ry.  Aborting...
bf00: 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  \n");.  exit(1);
bf10: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .}..static int n
bf20: 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20  Define = 0;     
bf30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44   /* Number of -D
bf40: 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20   options on the 
bf50: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
bf60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a  static char **az
bf70: 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20  Define = 0;  /* 
bf80: 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d  Name of the -D m
bf90: 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69  acros */../* Thi
bfa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bfb0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72 67  led with the arg
bfc0: 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44  ument to each -D
bfd0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
bfe0: 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65  tion..** Add the
bff0: 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74   macro defined t
c000: 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61  o the azDefine a
c010: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
c020: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70  void handle_D_op
c030: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
c040: 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e   char **paz;.  n
c050: 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65  Define++;.  azDe
c060: 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29  fine = (char **)
c070: 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e   realloc(azDefin
c080: 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69  e, sizeof(azDefi
c090: 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b  ne[0])*nDefine);
c0a0: 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d  .  if( azDefine=
c0b0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c0c0: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
c0d0: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
c0e0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
c0f0: 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b  paz = &azDefine[
c100: 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70  nDefine-1];.  *p
c110: 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  az = (char *) ma
c120: 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
c130: 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20  n(z)+1 );.  if( 
c140: 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66  *paz==0 ){.    f
c150: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f  printf(stderr,"o
c160: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
c170: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
c180: 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70   }.  lemon_strcp
c190: 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f  y(*paz, z);.  fo
c1a0: 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20  r(z=*paz; *z && 
c1b0: 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='='; z++){}.
c1c0: 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61    *z = 0;.}..sta
c1d0: 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f 74  tic char *user_t
c1e0: 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55  emplatename = NU
c1f0: 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  LL;.static void 
c200: 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28  handle_T_option(
c210: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72  char *z){.  user
c220: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20  _templatename = 
c230: 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
c240: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
c250: 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72 5f  1 );.  if( user_
c260: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20  templatename==0 
c270: 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  ){.    memory_er
c280: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d  ror();.  }.  lem
c290: 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72 5f 74  on_strcpy(user_t
c2a0: 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b  emplatename, z);
c2b0: 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74 6f 67  .}../* Merge tog
c2c0: 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73 20 6f  ether to lists o
c2d0: 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65 64 20  f rules ordered 
c2e0: 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20 2a 2f  by rule.iRule */
c2f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
c300: 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67 65 28  ule *Rule_merge(
c310: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 41 2c  struct rule *pA,
c320: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 42   struct rule *pB
c330: 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  ){.  struct rule
c340: 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20   *pFirst = 0;.  
c350: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a 70 70  struct rule **pp
c360: 50 72 65 76 20 3d 20 26 70 46 69 72 73 74 3b 0a  Prev = &pFirst;.
c370: 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
c380: 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
c390: 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75 6c 65  >iRule<pB->iRule
c3a0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   ){.      *ppPre
c3b0: 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 70  v = pA;.      pp
c3c0: 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65 78 74  Prev = &pA->next
c3d0: 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
c3e0: 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  >next;.    }else
c3f0: 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 76 20  {.      *ppPrev 
c400: 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70 50 72  = pB;.      ppPr
c410: 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74 3b 0a  ev = &pB->next;.
c420: 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 6e        pB = pB->n
c430: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ext;.    }.  }. 
c440: 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 2a   if( pA ){.    *
c450: 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 7d  ppPrev = pA;.  }
c460: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 72 65  else{.    *ppPre
c470: 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20 72 65  v = pB;.  }.  re
c480: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
c490: 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c 69 73  /*.** Sort a lis
c4a0: 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20 6f 72  t of rules in or
c4b0: 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e  der of increasin
c4c0: 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a 2a 2f  g iRule value.*/
c4d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
c4e0: 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74 28 73  ule *Rule_sort(s
c4f0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
c500: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
c510: 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74 3b 0a  ct rule *pNext;.
c520: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 78    struct rule *x
c530: 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 78  [32];.  memset(x
c540: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
c550: 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29 7b 0a  .  while( rp ){.
c560: 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70 2d 3e      pNext = rp->
c570: 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e 6e 65  next;.    rp->ne
c580: 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  xt = 0;.    for(
c590: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 78 29  i=0; i<sizeof(x)
c5a0: 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20 26 26  /sizeof(x[0]) &&
c5b0: 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   x[i]; i++){.   
c5c0: 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72     rp = Rule_mer
c5d0: 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20  ge(x[i], rp);.  
c5e0: 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a 20 20      x[i] = 0;.  
c5f0: 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d 20 72    }.    x[i] = r
c600: 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e 65 78  p;.    rp = pNex
c610: 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20 30 3b  t;.  }.  rp = 0;
c620: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
c630: 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66 28 78  zeof(x)/sizeof(x
c640: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
c650: 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65 28  rp = Rule_merge(
c660: 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  x[i], rp);.  }. 
c670: 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a 0a 2f   return rp;.}../
c680: 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65  * forward refere
c690: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  nce */.static co
c6a0: 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75  nst char *minimu
c6b0: 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20  m_size_type(int 
c6c0: 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e  lwr, int upr, in
c6d0: 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20  t *pnByte);../* 
c6e0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6c  Print a single l
c6f0: 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61 72 73  ine of the "Pars
c700: 65 72 20 53 74 61 74 73 22 20 6f 75 74 70 75 74  er Stats" output
c710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c720: 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73 74  stats_line(const
c730: 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 69   char *zLabel, i
c740: 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e  nt iValue){.  in
c750: 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e  t nLabel = lemon
c760: 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a  Strlen(zLabel);.
c770: 20 20 70 72 69 6e 74 66 28 22 20 20 25 73 25 2e    printf("  %s%.
c780: 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62 65  *s %5d\n", zLabe
c790: 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35 2d 6e  l,.         35-n
c7a0: 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e  Label, "........
c7b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c7c0: 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20  ........",.     
c7d0: 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a      iValue);.}..
c7e0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67  /* The main prog
c7f0: 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20  ram.  Parse the 
c800: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64  command line and
c810: 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74   do it... */.int
c820: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
c830: 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20  char **argv).{. 
c840: 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72 73   static int vers
c850: 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ion = 0;.  stati
c860: 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30  c int rpflag = 0
c870: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
c880: 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20  asisflag = 0;.  
c890: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72  static int compr
c8a0: 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ess = 0;.  stati
c8b0: 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b  c int quiet = 0;
c8c0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 74  .  static int st
c8d0: 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  atistics = 0;.  
c8e0: 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61  static int mhfla
c8f0: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
c900: 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  int nolinenosfla
c910: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
c920: 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20 30  int noResort = 0
c930: 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
c940: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69  t s_options opti
c950: 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f  ons[] = {.    {O
c960: 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63  PT_FLAG, "b", (c
c970: 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c  har*)&basisflag,
c980: 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65   "Print only the
c990: 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74   basis in report
c9a0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
c9b0: 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29  AG, "c", (char*)
c9c0: 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27  &compress, "Don'
c9d0: 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61  t compress the a
c9e0: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a  ction table."},.
c9f0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
ca00: 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  D", (char*)handl
ca10: 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66  e_D_option, "Def
ca20: 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61  ine an %ifdef ma
ca30: 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  cro."},.    {OPT
ca40: 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20 22  _FSTR, "f", 0, "
ca50: 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65  Ignored.  (Place
ca60: 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63 6f  holder for -f co
ca70: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
ca80: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
ca90: 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26  G, "g", (char*)&
caa0: 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67  rpflag, "Print g
cab0: 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61  rammar without a
cac0: 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b  ctions."},.    {
cad0: 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20 30  OPT_FSTR, "I", 0
cae0: 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c  , "Ignored.  (Pl
caf0: 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d  aceholder for '-
cb00: 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  I' compiler opti
cb10: 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50  ons.)"},.    {OP
cb20: 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68  T_FLAG, "m", (ch
cb30: 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75  ar*)&mhflag, "Ou
cb40: 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65  tput a makeheade
cb50: 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69  rs compatible fi
cb60: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
cb70: 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72  FLAG, "l", (char
cb80: 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  *)&nolinenosflag
cb90: 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20  , "Do not print 
cba0: 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73  #line statements
cbb0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53  ."},.    {OPT_FS
cbc0: 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e  TR, "O", 0, "Ign
cbd0: 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c  ored.  (Placehol
cbe0: 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d  der for '-O' com
cbf0: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22  piler options.)"
cc00: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
cc10: 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73  , "p", (char*)&s
cc20: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
cc30: 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20  flict,.         
cc40: 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f 77             "Show
cc50: 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c   conflicts resol
cc60: 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ved by precedenc
cc70: 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b  e rules"},.    {
cc80: 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28  OPT_FLAG, "q", (
cc90: 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28  char*)&quiet, "(
cca0: 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69  Quiet) Don't pri
ccb0: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69  nt the report fi
ccc0: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
ccd0: 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72  FLAG, "r", (char
cce0: 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f  *)&noResort, "Do
ccf0: 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e   not sort or ren
cd00: 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a  umber states"},.
cd10: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
cd20: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
cd30: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
cd60: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
cd70: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
cd80: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
cd90: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
cda0: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
cdb0: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
cdc0: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
cdd0: 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68  T_FSTR, "T", (ch
cde0: 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  ar*)handle_T_opt
cdf0: 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20  ion, "Specify a 
ce00: 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d  template file."}
ce10: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
ce20: 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65   "W", 0, "Ignore
ce30: 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72  d.  (Placeholder
ce40: 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c   for '-W' compil
ce50: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
ce60: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c      {OPT_FLAG,0,
ce70: 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0,0}.  };.  int 
ce80: 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f 64  i;.  int exitcod
ce90: 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  e;.  struct lemo
cea0: 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63 74 20  n lem;.  struct 
ceb0: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f 70 74  rule *rp;..  Opt
cec0: 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e  Init(argv,option
ced0: 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28  s,stderr);.  if(
cee0: 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20   version ){.    
cef0: 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76   printf("Lemon v
cf00: 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a  ersion 1.0\n");.
cf10: 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20       exit(0); . 
cf20: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
cf30: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
cf40: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
cf50: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
cf60: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
cf70: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
cf80: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
cf90: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
cfa0: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
cfb0: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
cfc0: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
cfd0: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
cfe0: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
cff0: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
d000: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
d010: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
d020: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
d030: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
d040: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
d050: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
d060: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
d070: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
d080: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
d090: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
d0a0: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
d0b0: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
d0c0: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
d0d0: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
d0e0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
d0f0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
d100: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
d110: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
d120: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
d130: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
d140: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
d150: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
d160: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
d170: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
d180: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
d190: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
d1a0: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
d1b0: 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  r */.  Symbol_ne
d1c0: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
d1d0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d1e0: 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a  Symbol_count();.
d1f0: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
d200: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
d210: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d220: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d230: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d240: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73  >index = i;.  qs
d250: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
d260: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65  lem.nsymbol,size
d270: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
d280: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
d290: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
d2a0: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
d2b0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
d2c0: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69  index = i;.  whi
d2d0: 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  le( lem.symbols[
d2e0: 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  i-1]->type==MULT
d2f0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d  ITERMINAL ){ i--
d300: 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74  ; }.  assert( st
d310: 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  rcmp(lem.symbols
d320: 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65  [i-1]->name,"{de
d330: 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20  fault}")==0 );. 
d340: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69   lem.nsymbol = i
d350: 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b   - 1;.  for(i=1;
d360: 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79 6d   ISUPPER(lem.sym
d370: 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d  bols[i]->name[0]
d380: 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e  ); i++);.  lem.n
d390: 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20  terminal = i;.. 
d3a0: 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75 65   /* Assign seque
d3b0: 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62 65  ntial rule numbe
d3c0: 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68 20  rs.  Start with 
d3d0: 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74 68  0.  Put rules th
d3e0: 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20  at have no.  ** 
d3f0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43 2d  reduce action C-
d400: 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20  code associated 
d410: 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c 20  with them last, 
d420: 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69 74  so that the swit
d430: 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch().  ** statem
d440: 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74 73  ent that selects
d450: 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69 6f   reduction actio
d460: 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20 73  ns will have a s
d470: 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62 6c  maller jump tabl
d480: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
d490: 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20  0, rp=lem.rule; 
d4a0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
d4b0: 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65 20  {.    rp->iRule 
d4c0: 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b  = rp->code ? i++
d4d0: 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f 72   : -1;.  }.  for
d4e0: 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70  (rp=lem.rule; rp
d4f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
d500: 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75 6c      if( rp->iRul
d510: 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65 20  e<0 ) rp->iRule 
d520: 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d  = i++;.  }.  lem
d530: 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65 6d  .startRule = lem
d540: 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c  .rule;.  lem.rul
d550: 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c 65  e = Rule_sort(le
d560: 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47  m.rule);..  /* G
d570: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
d580: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
d590: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
d5a0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
d5b0: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
d5c0: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
d5d0: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
d5e0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
d5f0: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
d600: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
d610: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
d620: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
d630: 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20  erminal+1);..   
d640: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
d650: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
d660: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
d670: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
d680: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
d690: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
d6a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
d6b0: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
d6c0: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
d6d0: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
d6e0: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
d6f0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
d700: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
d710: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
d720: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
d730: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
d740: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
d750: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
d760: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
d770: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
d780: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
d790: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
d7a0: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
d7b0: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
d7c0: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
d7d0: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
d7e0: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
d7f0: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
d800: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
d810: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
d820: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
d830: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
d840: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
d850: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
d860: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
d870: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
d880: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
d890: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
d8a0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
d8b0: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
d8c0: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
d8d0: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
d8e0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
d8f0: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
d900: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
d910: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
d920: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
d930: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
d940: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
d950: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
d960: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
d970: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
d980: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
d990: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c  ization that hel
d9a0: 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  ps make the.    
d9b0: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  ** generated par
d9c0: 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c  ser tables small
d9d0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  er. */.    if( n
d9e0: 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65 73  oResort==0 ) Res
d9f0: 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  ortStates(&lem);
da00: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
da10: 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68  e a report of th
da20: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
da30: 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74  ed.  (the "y.out
da40: 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20  put" file) */.  
da50: 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52    if( !quiet ) R
da60: 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d  eportOutput(&lem
da70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
da80: 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ate the source c
da90: 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
daa0: 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74  er */.    Report
dab0: 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c  Table(&lem, mhfl
dac0: 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  ag);..    /* Pro
dad0: 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69  duce a header fi
dae0: 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  le for use by th
daf0: 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69  e scanner.  (Thi
db00: 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a  s step is.    **
db10: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
db20: 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75  "-m" option is u
db30: 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65  sed because make
db40: 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20  headers will.   
db50: 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65   ** generate the
db60: 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a   file for us.) *
db70: 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61  /.    if( !mhfla
db80: 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72  g ) ReportHeader
db90: 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66  (&lem);.  }.  if
dba0: 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a  ( statistics ){.
dbb0: 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73      printf("Pars
dbc0: 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c 6e  er statistics:\n
dbd0: 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  ");.    stats_li
dbe0: 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d  ne("terminal sym
dbf0: 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d  bols", lem.nterm
dc00: 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  inal);.    stats
dc10: 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69  _line("non-termi
dc20: 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65  nal symbols", le
dc30: 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e  m.nsymbol - lem.
dc40: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
dc50: 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61  stats_line("tota
dc60: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
dc70: 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74  nsymbol);.    st
dc80: 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22  ats_line("rules"
dc90: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
dca0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73 74    stats_line("st
dcb0: 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61  ates", lem.nxsta
dcc0: 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  te);.    stats_l
dcd0: 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c  ine("conflicts",
dce0: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
dcf0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
dd00: 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e  "action table en
dd10: 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74  tries", lem.nact
dd20: 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74 61  iontab);.    sta
dd30: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 74  ts_line("total t
dd40: 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65 73  able size (bytes
dd50: 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  )", lem.tablesiz
dd60: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  e);.  }.  if( le
dd70: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20  m.nconflict > 0 
dd80: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
dd90: 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e  tderr,"%d parsin
dda0: 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c  g conflicts.\n",
ddb0: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a  lem.nconflict);.
ddc0: 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e    }..  /* return
ddd0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31   0 on success, 1
dde0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a   on failure. */.
ddf0: 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c    exitcode = ((l
de00: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29  em.errorcnt > 0)
de10: 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69   || (lem.nconfli
de20: 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30  ct > 0)) ? 1 : 0
de30: 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f 64  ;.  exit(exitcod
de40: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65 78  e);.  return (ex
de50: 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  itcode);.}./****
de60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
de70: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
de80: 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  msort.c" *******
de90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dea0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
deb0: 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d  A generic merge-
dec0: 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a  sort program..**
ded0: 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65  .** USAGE:.** Le
dee0: 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69  t "ptr" be a poi
def0: 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72  nter to some str
df00: 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20  ucture which is 
df10: 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a  at the head of.*
df20: 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  * a null-termina
df30: 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20  ted list.  Then 
df40: 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74  to sort the list
df50: 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   call:.**.**    
df60: 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72   ptr = msort(ptr
df70: 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d  ,&(ptr->next),cm
df80: 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20  pfnc);.**.** In 
df90: 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66  the above, "cmpf
dfa0: 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  nc" is a pointer
dfb0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77   to a function w
dfc0: 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a  hich compares.**
dfd0: 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
dfe0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
dff0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69  and returns an i
e000: 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a  nteger, as in.**
e010: 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65   strcmp.  The se
e020: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e030: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
e040: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
e050: 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  .** second eleme
e060: 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nt of the linked
e070: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64   list.  This add
e080: 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20  ress is used to 
e090: 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f  compute.** the o
e0a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65  ffset to the "ne
e0b0: 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e  xt" field within
e0c0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
e0d0: 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a   The offset to.*
e0e0: 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  * the "next" fie
e0f0: 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ld must be const
e100: 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75  ant for all stru
e110: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69  ctures in the li
e120: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75  st..**.** The fu
e130: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
e140: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69   new pointer whi
e150: 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  ch is the head o
e160: 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66  f the list.** af
e170: 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a  ter sorting..**.
e180: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
e190: 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a   Merge-sort..*/.
e1a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
e1b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
e1c0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e  ext structure in
e1d0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e1e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58  ..*/.#define NEX
e1f0: 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28  T(A) (*(char**)(
e200: 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73 65  ((char*)A)+offse
e210: 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  t))../*.** Input
e220: 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20  s:.**   a:      
e230: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
e240: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
e250: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
e260: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20   null)..**   b: 
e270: 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20        A sorted, 
e280: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
e290: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d  linked list.  (M
e2a0: 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20  ay be null)..** 
e2b0: 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69    cmp:     A poi
e2c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70  nter to the comp
e2d0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
e2e0: 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f  .**   offset:  O
e2f0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72  ffset in the str
e300: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e  ucture to the "n
e310: 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  ext" field..**.*
e320: 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a  * Return Value:.
e330: 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74  **   A pointer t
e340: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
e350: 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74  sorted list cont
e360: 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65  aining the eleme
e370: 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68  nts.**   of both
e380: 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20   a and b..**.** 
e390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
e3a0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
e3b0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
e3c0: 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73  nts in the lists
e3d0: 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20   a and b are.** 
e3e0: 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74    changed..*/.st
e3f0: 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65  atic char *merge
e400: 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63  (.  char *a,.  c
e410: 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a  har *b,.  int (*
e420: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
e430: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20  ,const char*),. 
e440: 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20   int offset.){. 
e450: 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61   char *ptr, *hea
e460: 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  d;..  if( a==0 )
e470: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a  {.    head = b;.
e480: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30    }else if( b==0
e490: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61   ){.    head = a
e4a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
e4b0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d  f( (*cmp)(a,b)<=
e4c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
e4d0: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
e4e0: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
e4f0: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
e500: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
e510: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
e520: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
e530: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
e540: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
e550: 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  a,b)<=0 ){.     
e560: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
e570: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
e580: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
e590: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
e5a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
e5b0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
e5c0: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
e5d0: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
e5e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e5f0: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
e600: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
e610: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
e620: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
e630: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
e640: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
e650: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
e660: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
e670: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
e680: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
e690: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
e6a0: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
e6b0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
e6c0: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
e6d0: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
e6e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
e6f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
e700: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
e710: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e720: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
e730: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
e740: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
e750: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
e760: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
e770: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
e780: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
e790: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
e7a0: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
e7b0: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
e7c0: 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74  LISTSIZE 30.stat
e7d0: 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a  ic char *msort(.
e7e0: 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20    char *list,.  
e7f0: 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69  char **next,.  i
e800: 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20  nt (*cmp)(const 
e810: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e820: 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *).){.  unsigned
e830: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20   long offset;.  
e840: 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72  char *ep;.  char
e850: 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b   *set[LISTSIZE];
e860: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73  .  int i;.  offs
e870: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
e880: 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78 74  ong)((char*)next
e890: 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29 3b   - (char*)list);
e8a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
e8b0: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
e8c0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
e8d0: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
e8e0: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
e8f0: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
e900: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
e910: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e920: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
e930: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
e940: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
e950: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
e960: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
e970: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
e980: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
e990: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
e9a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
e9b0: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
e9c0: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
e9d0: 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70  ge(set[i],ep,cmp
e9e0: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
e9f0: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
ea20: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
ea30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea40: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
ea50: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
ea60: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
ea70: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
ea80: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
ea90: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
eaa0: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
eab0: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
eac0: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
ead0: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
eae0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
eaf0: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
eb00: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
eb10: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
eb20: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
eb30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
eb40: 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c  d errline(int n,
eb50: 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72   int k, FILE *er
eb60: 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74  r).{.  int spcnt
eb70: 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b  , i;.  if( argv[
eb80: 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72  0] ) fprintf(err
eb90: 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a  ,"%s",argv[0]);.
eba0: 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53    spcnt = lemonS
ebb0: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b  trlen(argv[0]) +
ebc0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
ebd0: 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69  <n && argv[i]; i
ebe0: 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ++){.    fprintf
ebf0: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
ec00: 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b  i]);.    spcnt +
ec10: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  = lemonStrlen(ar
ec20: 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20  gv[i])+1;.  }.  
ec30: 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f  spcnt += k;.  fo
ec40: 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  r(; argv[i]; i++
ec50: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20  ) fprintf(err," 
ec60: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
ec70: 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a  if( spcnt<20 ){.
ec80: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
ec90: 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e  "\n%*s^-- here\n
eca0: 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d  ",spcnt,"");.  }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
ecc0: 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65  f(err,"\n%*shere
ecd0: 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c   --^\n",spcnt-7,
ece0: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "");.  }.}../*.*
ecf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
ed00: 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e  ex of the N-th n
ed10: 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65  on-switch argume
ed20: 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  nt.  Return -1.*
ed30: 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  * if N is out of
ed40: 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   range..*/.stati
ed50: 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69  c int argindex(i
ed60: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
ed70: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
ed80: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
ed90: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
eda0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
edb0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
edc0: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
edd0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
ede0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
edf0: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
ee00: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
ee10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ee20: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
ee30: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
ee40: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
ee50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
ee60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
ee70: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
ee80: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
ee90: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
eea0: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
eeb0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
eec0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
eed0: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
eee0: 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72  int i, FILE *err
eef0: 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69  ).{.  int v;.  i
ef00: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
ef10: 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
ef20: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
ef30: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
ef40: 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31  rncmp(&argv[i][1
ef50: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65  ],op[j].label,le
ef60: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e  monStrlen(op[j].
ef70: 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65  label))==0 ) bre
ef80: 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72  ak;.  }.  v = ar
ef90: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20  gv[i][0]=='-' ? 
efa0: 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b  1 : 0;.  if( op[
efb0: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
efc0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
efd0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
efe0: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
eff0: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
f000: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
f010: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
f020: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
f030: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67  se if( op[j].arg
f040: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67  ==0 ){.    /* Ig
f050: 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
f060: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
f070: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
f080: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
f090: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
f0a0: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
f0b0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
f0c0: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
f0d0: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
f0e0: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
f0f0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
f100: 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29  type==OPT_FSTR )
f110: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
f120: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
f130: 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32  arg))(&argv[i][2
f140: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
f150: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f160: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
f170: 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  smissing argumen
f180: 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c  t on switch.\n",
f190: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
f1a0: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
f1b0: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
f1c0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
f1d0: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errcnt;.}../*.**
f1e0: 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61   Process a comma
f1f0: 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77  nd line switch w
f200: 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75  hich has an argu
f210: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
f220: 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68  int handleswitch
f230: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
f240: 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20  r).{.  int lv = 
f250: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d  0;.  double dv =
f260: 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76   0.0;.  char *sv
f270: 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68   = 0, *end;.  ch
f280: 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b  ar *cp;.  int j;
f290: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
f2a0: 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72  0;.  cp = strchr
f2b0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20  (argv[i],'=');. 
f2c0: 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20 29   assert( cp!=0 )
f2d0: 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66  ;.  *cp = 0;.  f
f2e0: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
f2f0: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
f300: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
f310: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
f320: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
f330: 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66   *cp = '=';.  if
f340: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
f350: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
f360: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
f370: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
f380: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
f390: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
f3a0: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
f3b0: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
f3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b    }else{.    cp+
f3d0: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  +;.    switch( o
f3e0: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
f3f0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
f400: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
f410: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
f420: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
f430: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f440: 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69  ,"%soption requi
f450: 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  res an argument.
f460: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
f470: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
f480: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ,err);.        }
f490: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b  .        errcnt+
f4a0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
f4b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f4c0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
f4d0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
f4e0: 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63     dv = strtod(c
f4f0: 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  p,&end);.       
f500: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
f510: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
f520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
f530: 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20 20  rintf(err,.     
f540: 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c 6c            "%sill
f550: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
f560: 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  n floating-point
f570: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
f580: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
f590: 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29   errline(i,(int)
f5a0: 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61  ((char*)end-(cha
f5b0: 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29  r*)argv[i]),err)
f5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f5d0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
f5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f5f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f600: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f610: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f620: 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d  NT:.        lv =
f630: 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c   strtol(cp,&end,
f640: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
f650: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
f660: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f670: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
f680: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
f690: 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74  character in int
f6a0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  eger argument.\n
f6b0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
f6c0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
f6d0: 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64 2d  int)((char*)end-
f6e0: 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c  (char*)argv[i]),
f6f0: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
f700: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
f710: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
f720: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f730: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
f740: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
f750: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
f760: 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20  sv = cp;.       
f770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f780: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
f790: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
f7a0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
f7b0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
f7c0: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
f7d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f7e0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28  _DBL:.        *(
f7f0: 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61  double*)(op[j].a
f800: 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20  rg) = dv;.      
f810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
f820: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
f830: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
f840: 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e  (double))(op[j].
f850: 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20  arg))(dv);.     
f860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f870: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
f880: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70        *(int*)(op
f890: 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20  [j].arg) = lv;. 
f8a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f8b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
f8c0: 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  T:.        (*(vo
f8d0: 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a  id(*)(int))(op[j
f8e0: 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29  ].arg))((int)lv)
f8f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f900: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f910: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63  STR:.        *(c
f920: 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  har**)(op[j].arg
f930: 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20  ) = sv;.        
f940: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f950: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
f960: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63      (*(void(*)(c
f970: 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72  har *))(op[j].ar
f980: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
f990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
f9b0: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
f9c0: 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75  t(char **a, stru
f9d0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c  ct s_options *o,
f9e0: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
f9f0: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
fa00: 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70    argv = a;.  op
fa10: 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61   = o;.  errstrea
fa20: 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61  m = err;.  if( a
fa30: 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26 20  rgv && *argv && 
fa40: 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  op ){.    int i;
fa50: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
fa60: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
fa70: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30     if( argv[i][0
fa80: 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69  ]=='+' || argv[i
fa90: 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
faa0: 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68       errcnt += h
fab0: 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72  andleflags(i,err
fac0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
fad0: 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b 69  f( strchr(argv[i
fae0: 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  ],'=') ){.      
faf0: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
fb00: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b  leswitch(i,err);
fb10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fb20: 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e   }.  if( errcnt>
fb30: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
fb40: 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d  (err,"Valid comm
fb50: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
fb60: 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a   for \"%s\" are:
fb70: 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74  \n",*a);.    Opt
fb80: 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69  Print();.    exi
fb90: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
fba0: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rn 0;.}..int Opt
fbb0: 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63  NArgs(){.  int c
fbc0: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61  nt = 0;.  int da
fbd0: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  shdash = 0;.  in
fbe0: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21  t i;.  if( argv!
fbf0: 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30  =0 && argv[0]!=0
fc00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
fc10: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
fc20: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
fc30: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
fc40: 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  v[i]) ) cnt++;. 
fc50: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
fc60: 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30  argv[i],"--")==0
fc70: 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b   ) dashdash = 1;
fc80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fc90: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72  urn cnt;.}..char
fca0: 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a   *OptArg(int n).
fcb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
fcc0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
fcd0: 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72  return i>=0 ? ar
fce0: 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f  gv[i] : 0;.}..vo
fcf0: 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29  id OptErr(int n)
fd00: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
fd10: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
fd20: 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c   if( i>=0 ) errl
fd30: 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61  ine(i,0,errstrea
fd40: 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50  m);.}..void OptP
fd50: 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  rint(){.  int i;
fd60: 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b  .  int max, len;
fd70: 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f  .  max = 0;.  fo
fd80: 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
fd90: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  el; i++){.    le
fda0: 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
fdb0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31  op[i].label) + 1
fdc0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
fdd0: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
fde0: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
fdf0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
fe00: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
fe10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
fe20: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
fe30: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
fe40: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b         len += 9;
fe50: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
fe60: 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20   of "<integer>" 
fe70: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
fe80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
fe90: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
fea0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
feb0: 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20     len += 6;    
fec0: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
fed0: 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20  "<real>" */.    
fee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fef0: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
ff00: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
ff10: 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  TR:.        len 
ff20: 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 8;       /* l
ff30: 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e  ength of "<strin
ff40: 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  g>" */.        b
ff50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ff60: 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61  if( len>max ) ma
ff70: 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66  x = len;.  }.  f
ff80: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
ff90: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bel; i++){.    s
ffa0: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
ffb0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
ffc0: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
ffd0: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
ffe0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
fff0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d  errstream,"  -%-
10000 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70  *s  %s\n",max,op
10010 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e  [i].label,op[i].
10020 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10040 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
10050 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
10060 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
10070 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
10080 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20  %s<integer>%*s  
10090 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
100a0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
100b0 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
100c0 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
100d0 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  9),"",op[i].mess
100e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
100f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10100 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
10110 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
10120 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
10130 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72  rstream,"  -%s<r
10140 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  eal>%*s  %s\n",o
10150 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10160 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10170 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10180 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
10190 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
101a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
101b0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
101c0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
101d0 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
101e0 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
101f0 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25  ,"  -%s<string>%
10200 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
10210 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
10220 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
10230 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
10240 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-8),"",op[i].
10250 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10270 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
10290 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72  om the file "par
102a0 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se.c" **********
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  **/./*.** Input 
102d0 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20  file parser for 
102e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
102f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
10300 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
10310 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e  the parser */.en
10320 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49  um e_state {.  I
10330 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49  NITIALIZE,.  WAI
10340 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10350 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47  _RULE,.  WAITING
10360 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10370 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
10380 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49  _DECL_ARG,.  WAI
10390 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
103a0 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  NCE_SYMBOL,.  WA
103b0 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c  ITING_FOR_ARROW,
103c0 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53  .  IN_RHS,.  LHS
103d0 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f  _ALIAS_1,.  LHS_
103e0 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41  ALIAS_2,.  LHS_A
103f0 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_3,.  RHS_AL
10400 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49  IAS_1,.  RHS_ALI
10410 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e  AS_2,.  PRECEDEN
10420 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45  CE_MARK_1,.  PRE
10430 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a  CEDENCE_MARK_2,.
10440 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52    RESYNC_AFTER_R
10450 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53  ULE_ERROR,.  RES
10460 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
10470 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f  RROR,.  WAITING_
10480 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
10490 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
104a0 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
104b0 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
104c0 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c  FOR_FALLBACK_ID,
104d0 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  .  WAITING_FOR_W
104e0 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57 41  ILDCARD_ID,.  WA
104f0 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
10500 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
10510 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d 3b  R_CLASS_TOKEN.};
10520 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
10530 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
10540 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
10550 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
10560 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
10570 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
10580 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
10590 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
105a0 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
105b0 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
105c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
105d0 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
105e0 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
105f0 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
10600 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
10610 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
10620 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
10630 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
10640 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
10650 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20 20  e_state state;  
10660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
10670 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
10680 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10690 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
106a0 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
106b0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
106c0 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61  ct symbol *tkcla
106d0 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  ss;    /* Token 
106e0 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a  class symbol */.
106f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10700 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
10710 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
10720 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
10730 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10740 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 2f  lhsalias;      /
10750 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
10760 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
10770 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
10780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10790 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
107a0 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
107b0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
107c0 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
107d0 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
107e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
107f0 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f  alias[MAXRHS]; /
10800 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
10810 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
10820 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
10830 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
10840 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
10850 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
10860 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10870 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20  *declkeyword;   
10880 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
10890 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
108a0 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
108b0 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
108c0 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
108d0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
108e0 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
108f0 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
10900 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
10910 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
10920 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
10930 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
10940 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
10950 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
10960 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
10970 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
10980 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
10990 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
109a0 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
109b0 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
109c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
109d0 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
109e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
109f0 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
10a00 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
10a10 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
10a20 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
10a30 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
10a40 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
10a50 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
10a60 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
10a70 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
10a80 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
10a90 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
10aa0 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
10ab0 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
10ac0 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
10ad0 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
10ae0 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73 74  token(struct pst
10af0 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f  ate *psp).{.  co
10b00 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20 78  nst char *x;.  x
10b10 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e   = Strsafe(psp->
10b20 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20  tokenstart);    
10b30 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b   /* Save the tok
10b40 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a  en permanently *
10b50 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  /.#if 0.  printf
10b60 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b  ("%s:%d: Token=[
10b70 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c  %s] state=%d\n",
10b80 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10b90 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10ba0 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65      x,psp->state
10bb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74  );.#endif.  swit
10bc0 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29  ch( psp->state )
10bd0 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49  {.    case INITI
10be0 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70  ALIZE:.      psp
10bf0 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
10c00 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
10c10 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  ounter = 0;.    
10c20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
10c30 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
10c40 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
10c50 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a  >gp->nrule = 0;.
10c60 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
10c70 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20  ru to next case 
10c80 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  */.    case WAIT
10c90 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
10ca0 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  RULE:.      if( 
10cb0 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  x[0]=='%' ){.   
10cc0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10cd0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10ce0 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
10cf0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 4c 4f    }else if( ISLO
10d00 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  WER(x[0]) ){.   
10d10 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20       psp->lhs = 
10d20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
10d30 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
10d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10d50 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b  p->lhsalias = 0;
10d60 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10d70 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10d80 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d  R_ARROW;.      }
10d90 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
10da0 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  {' ){.        if
10db0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
10dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10dd0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10de0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10df0 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20  nlineno,."There 
10e00 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
10e10 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61   upon which to a
10e20 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c  ttach the code \
10e30 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20  .fragment which 
10e40 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c  begins on this l
10e50 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ine.");.        
10e60 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10e70 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
10e80 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
10e90 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20  le->code!=0 ){. 
10ea0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
10eb0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10ec0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10ed0 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74  ,."Code fragment
10ee0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68   beginning on th
10ef0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
10f00 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
10f10 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
10f20 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
10f30 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10f40 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
10f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
10f60 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69  sp->prevrule->li
10f70 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
10f80 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
10f90 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
10fa0 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20  code = &x[1];.  
10fb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
10fc0 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d 20  vrule->noCode = 
10fd0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
10fe0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
10ff0 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
11000 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
11010 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
11020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11030 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11040 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11050 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11060 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
11070 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
11080 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
11090 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
110a0 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
110b0 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
110c0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
110d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
110e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
110f0 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
11100 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50  .      if( !ISUP
11110 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
11120 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11130 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11140 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11150 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
11160 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
11170 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
11180 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
11190 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
111a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
111b0 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
111c0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
111d0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
111e0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
111f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
11200 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
11210 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
11220 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
11230 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
11240 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11250 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
11260 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
11270 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
11280 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11290 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
112a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
112b0 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
112c0 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
112d0 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
112e0 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
112f0 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
11300 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
11310 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11330 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
11340 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
11350 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
11360 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11370 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
11380 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
11390 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
113a0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
113b0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
113c0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
113d0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
113e0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
113f0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11400 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
11410 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
11420 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
11430 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
11450 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11460 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11470 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
11480 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11490 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
114a0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
114b0 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
114c0 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
114d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
114e0 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
114f0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
11500 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
11510 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
11520 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
11530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11540 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11550 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11560 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11570 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
11580 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
11590 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
115a0 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
115b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
115c0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
115d0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
115e0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
115f0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11600 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11620 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
11630 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
11640 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
11650 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
11660 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
11670 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11680 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
11690 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
116a0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
116b0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
116c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
116d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
116e0 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
116f0 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
11700 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
11710 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
11720 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11730 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11740 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11750 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11760 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11770 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11790 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
117a0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
117b0 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
117c0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
117d0 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
117e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
117f0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11800 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11810 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11820 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
11830 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
11840 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
11850 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
11860 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11870 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11880 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11890 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
118a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
118b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
118c0 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
118d0 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
118e0 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
118f0 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
11900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11910 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
11920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11930 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11940 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11950 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11960 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
11970 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
11980 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
11990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
119a0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
119b0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
119c0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
119d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
119e0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
119f0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11a00 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
11a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11a20 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
11a30 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
11a40 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
11a50 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
11a60 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
11a70 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  le *)calloc( siz
11a80 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
11a90 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
11aa0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
11ab0 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68  ymbol*)*psp->nrh
11ac0 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  s + sizeof(char*
11ad0 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b  )*psp->nrhs, 1);
11ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d  .        if( rp=
11af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11b00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11b10 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11b20 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11b30 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f       "Can't allo
11b40 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  cate enough memo
11b50 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  ry for this rule
11b60 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
11b70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11b80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11b90 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
11ba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11bb0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11bc0 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c         rp->rulel
11bd0 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
11be0 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
11bf0 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72    rp->rhs = (str
11c00 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70  uct symbol**)&rp
11c10 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [1];.          r
11c20 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63  p->rhsalias = (c
11c30 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72 70  onst char**)&(rp
11c40 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
11c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
11c60 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68  (i=0; i<psp->nrh
11c70 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
11c80 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20       rp->rhs[i] 
11c90 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20  = psp->rhs[i];. 
11ca0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
11cb0 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70  hsalias[i] = psp
11cc0 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20  ->alias[i];.    
11cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ce0 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d    rp->lhs = psp-
11cf0 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  >lhs;.          
11d00 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70  rp->lhsalias = p
11d10 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20  sp->lhsalias;.  
11d20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73          rp->nrhs
11d30 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20   = psp->nrhs;.  
11d40 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65          rp->code
11d50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11d60 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a  rp->noCode = 1;.
11d70 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
11d80 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20  ecsym = 0;.     
11d90 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d       rp->index =
11da0 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b   psp->gp->nrule+
11db0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  +;.          rp-
11dc0 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c  >nextlhs = rp->l
11dd0 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20  hs->rule;.      
11de0 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c      rp->lhs->rul
11df0 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
11e00 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a    rp->next = 0;.
11e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73            if( ps
11e20 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20  p->firstrule==0 
11e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11e40 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
11e50 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
11e60 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  rp;.          }e
11e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
11e80 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e   psp->lastrule->
11e90 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  next = rp;.     
11ea0 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74         psp->last
11eb0 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
11ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11ed0 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
11ee0 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rp;.        }. 
11ef0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11f00 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11f10 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
11f20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
11f30 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20  ALPHA(x[0]) ){. 
11f40 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
11f50 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a  nrhs>=MAXRHS ){.
11f60 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
11f70 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11f80 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11f90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
11fa0 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73  Too many symbols
11fb0 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20   on RHS of rule 
11fc0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25  beginning at \"%
11fd0 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
11fe0 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20     x);.         
11ff0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12010 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12020 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12030 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12040 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12050 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d  rhs[psp->nrhs] =
12060 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
12070 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61            psp->a
12080 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  lias[psp->nrhs] 
12090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
120a0 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20  sp->nrhs++;.    
120b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
120c0 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27  e if( (x[0]=='|'
120d0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26   || x[0]=='/') &
120e0 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
120f0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12100 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
12110 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
12120 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1];.        if(
12130 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54   msp->type!=MULT
12140 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
12150 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12160 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d  mbol *origsp = m
12170 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  sp;.          ms
12180 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
12190 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73  ol *) calloc(1,s
121a0 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20  izeof(*msp));.  
121b0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d          memset(m
121c0 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d  sp, 0, sizeof(*m
121d0 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sp));.          
121e0 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54  msp->type = MULT
121f0 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20  ITERMINAL;.     
12200 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
12210 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
12220 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28   msp->subsym = (
12230 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
12240 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f  ) calloc(1,sizeo
12250 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
12260 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
12270 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f  p->subsym[0] = o
12280 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20  rigsp;.         
12290 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69   msp->name = ori
122a0 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20  gsp->name;.     
122b0 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73       psp->rhs[ps
122c0 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70  p->nrhs-1] = msp
122d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
122e0 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
122f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
12300 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63  >subsym = (struc
12310 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61  t symbol **) rea
12320 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d  lloc(msp->subsym
12330 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  ,.          size
12340 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
12350 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29  *)*msp->nsubsym)
12360 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
12370 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73  ubsym[msp->nsubs
12380 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ym-1] = Symbol_n
12390 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20  ew(&x[1]);.     
123a0 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78     if( ISLOWER(x
123b0 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28  [1]) || ISLOWER(
123c0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e  msp->subsym[0]->
123d0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
123e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
123f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12400 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12410 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e             "Cann
12420 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75  ot form a compou
12430 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  nd containing a 
12440 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a  non-terminal");.
12450 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
12460 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
12470 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12480 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26   if( x[0]=='(' &
12490 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
124a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
124b0 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
124c0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
124d0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
124e0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
124f0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12500 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
12510 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e  gal character on
12520 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22   RHS of rule: \"
12530 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
12540 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12550 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12560 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12570 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12590 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
125a0 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  RHS_ALIAS_1:.   
125b0 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78     if( ISALPHA(x
125c0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
125d0 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
125e0 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20  nrhs-1] = x;.   
125f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12600 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = RHS_ALIAS_2;. 
12610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12620 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12630 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
12640 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12650 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
12660 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
12670 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20  ias for the RHS 
12680 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22  symbol \"%s\"\n"
12690 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
126a0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
126b0 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  -1]->name);.    
126c0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
126d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
126e0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
126f0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12700 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
12710 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12720 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   RHS_ALIAS_2:.  
12730 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
12740 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
12750 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
12760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
127a0 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
127b0 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
127c0 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
127d0 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
127e0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
127f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12800 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12810 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12820 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12840 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12850 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
12860 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20  _KEYWORD:.      
12870 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d  if( ISALPHA(x[0]
12880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
12890 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20  ->declkeyword = 
128a0 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
128b0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b  declargslot = 0;
128c0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
128d0 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30  cllinenoslot = 0
128e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
128f0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12900 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
12910 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12920 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
12930 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
12940 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29  p(x,"name")==0 )
12950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12960 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12970 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b  (psp->gp->name);
12980 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12990 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
129a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
129b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
129c0 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b  "include")==0 ){
129d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
129e0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
129f0 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65  psp->gp->include
12a00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12a10 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63   if( strcmp(x,"c
12a20 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ode")==0 ){.    
12a30 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12a40 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12a50 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a  gp->extracode);.
12a60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12a70 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
12a80 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  n_destructor")==
12a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12aa0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12ab0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
12ac0 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  ndest;.        }
12ad0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12ae0 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72  x,"default_destr
12af0 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
12b00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12b10 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
12b20 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  >gp->vardest;.  
12b30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12b40 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
12b50 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20  prefix")==0 ){. 
12b60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12b70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
12b80 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  ->gp->tokenprefi
12b90 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  x;.          psp
12ba0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12bb0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12bc0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12bd0 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22  x,"syntax_error"
12be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12bf0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12c00 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12c10 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  error);.        
12c20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12c30 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74  (x,"parse_accept
12c40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12c50 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12c60 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12c70 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20  >accept);.      
12c80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12c90 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c  mp(x,"parse_fail
12ca0 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ure")==0 ){.    
12cb0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12cc0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12cd0 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20  gp->failure);.  
12ce0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12cf0 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f  strcmp(x,"stack_
12d00 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b  overflow")==0 ){
12d10 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12d20 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12d30 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f  psp->gp->overflo
12d40 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  w);.        }els
12d50 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12d60 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29  extra_argument")
12d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12d80 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12d90 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
12da0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rg);.          p
12db0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12dc0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12dd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12de0 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
12df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12e00 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12e10 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12e20 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
12e30 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
12e40 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
12e50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12e60 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
12e70 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ult_type")==0 ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12e90 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12ea0 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65  psp->gp->vartype
12eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
12ec0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12ed0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12ee0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12ef0 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d  x,"stack_size")=
12f00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12f10 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12f20 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
12f30 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
12f40 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
12f50 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
12f60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12f70 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f  strcmp(x,"start_
12f80 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20  symbol")==0 ){. 
12f90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12fa0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12fb0 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20  p->gp->start);. 
12fc0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
12fd0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
12fe0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12ff0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c   if( strcmp(x,"l
13000 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eft")==0 ){.    
13010 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
13020 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
13030 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
13040 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20  oc = LEFT;.     
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 50 52  = WAITING_FOR_PR
13070 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
13080 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13090 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67  f( strcmp(x,"rig
130a0 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ht")==0 ){.     
130b0 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
130c0 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
130d0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
130e0 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20  c = RIGHT;.     
130f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13100 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
13110 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
13120 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13130 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e  f( strcmp(x,"non
13140 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20  assoc")==0 ){.  
13150 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
13160 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
13170 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
13180 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20  ssoc = NONE;.   
13190 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
131a0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
131b0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
131c0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
131d0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
131e0 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
131f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13200 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13210 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
13220 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
13230 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13240 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b  (x,"type")==0 ){
13250 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13260 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13270 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
13280 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13290 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
132a0 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29  "fallback")==0 )
132b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
132c0 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  >fallback = 0;. 
132d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
132e0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
132f0 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20  R_FALLBACK_ID;. 
13300 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13310 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64 63   strcmp(x,"wildc
13320 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ard")==0 ){.    
13330 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13340 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57   = WAITING_FOR_W
13350 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20 20  ILDCARD_ID;.    
13360 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13370 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63 6c  rcmp(x,"token_cl
13380 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ass")==0 ){.    
13390 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
133a0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43   = WAITING_FOR_C
133b0 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20 20 20  LASS_ID;.       
133c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
133e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
133f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13400 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20         "Unknown 
13410 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77  declaration keyw
13420 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c  ord: \"%%%s\".",
13430 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13440 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13450 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13460 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
13470 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
13480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
134a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
134b0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
134c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
134d0 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72   "Illegal declar
134e0 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c  ation keyword: \
134f0 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  "%s\".",x);.    
13500 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
13510 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
13520 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
13530 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
13540 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
13550 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13560 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
13570 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a  TRUCTOR_SYMBOL:.
13580 20 20 20 20 20 20 69 66 28 20 21 49 53 41 4c 50        if( !ISALP
13590 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  HA(x[0]) ){.    
135a0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
135b0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
135c0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
135d0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e         "Symbol n
135e0 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65  ame missing afte
135f0 72 20 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b  r %%destructor k
13600 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20  eyword");.      
13610 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13620 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
13630 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13640 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
13650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13660 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
13670 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
13680 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
13690 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
136a0 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63  t = &sp->destruc
136b0 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70  tor;.        psp
136c0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
136d0 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65   = &sp->destLine
136e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  no;.        psp-
136f0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13700 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
13710 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13720 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
13730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13740 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13750 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
13760 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  YPE_SYMBOL:.    
13770 20 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78    if( !ISALPHA(x
13780 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
13790 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
137a0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
137b0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
137c0 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20     "Symbol name 
137d0 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25  missing after %%
137e0 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a  type keyword");.
137f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13800 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
13810 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
13820 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
13830 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
13840 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
13850 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
13860 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a  Symbol_find(x);.
13870 20 20 20 20 20 20 20 20 69 66 28 28 73 70 29 20          if((sp) 
13880 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  && (sp->datatype
13890 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72  )){.          Er
138a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
138b0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
138c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
138d0 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70     "Symbol %%typ
138e0 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  e \"%s\" already
138f0 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20   defined", x);. 
13900 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13910 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13920 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13930 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13960 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20     if (!sp){.   
13970 20 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79           sp = Sy
13980 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
13990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
139a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
139b0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
139c0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ype;.          p
139d0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
139e0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
139f0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13a00 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
13a10 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _ARG;.        }.
13a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13a30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
13a40 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
13a50 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  ENCE_SYMBOL:.   
13a60 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
13a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
13a80 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13a90 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13aa0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13ab0 66 28 20 49 53 55 50 50 45 52 28 78 5b 30 5d 29  f( ISUPPER(x[0])
13ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
13ad0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
13ae0 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
13af0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
13b00 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e     if( sp->prec>
13b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13b20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
13b30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
13b40 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13b50 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25       "Symbol \"%
13b60 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20  s\" has already 
13b70 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65  be given a prece
13b80 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20  dence.",x);.    
13b90 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13ba0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
13bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13bc0 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e  sp->prec = psp->
13bd0 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20  preccounter;.   
13be0 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63         sp->assoc
13bf0 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f   = psp->declasso
13c00 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13c30 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
13c40 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13c50 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69       "Can't assi
13c60 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  gn a precedence 
13c70 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  to \"%s\".",x);.
13c80 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13c90 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
13ca0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13cb0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13cc0 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20  OR_DECL_ARG:.   
13cd0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27     if( x[0]=='{'
13ce0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
13cf0 7c 20 49 53 41 4c 4e 55 4d 28 78 5b 30 5d 29 20  | ISALNUM(x[0]) 
13d00 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
13d10 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e   char *zOld, *zN
13d20 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ew;.        char
13d30 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20   *zBuf, *z;.    
13d40 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c      int nOld, n,
13d50 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65 77   nLine = 0, nNew
13d60 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20  , nBack;.       
13d70 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63 72   int addLineMacr
13d80 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  o;.        char 
13d90 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20  zLine[50];.     
13da0 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20     zNew = x;.   
13db0 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d       if( zNew[0]
13dc0 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d  =='"' || zNew[0]
13dd0 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a  =='{' ) zNew++;.
13de0 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c          nNew = l
13df0 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29  emonStrlen(zNew)
13e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
13e10 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  ){.          zOl
13e30 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  d = *psp->declar
13e40 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d  gslot;.        }
13e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13e60 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20  zOld = "";.     
13e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c     }.        nOl
13e80 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  d = lemonStrlen(
13e90 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  zOld);.        n
13ea0 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b   = nOld + nNew +
13eb0 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64   20;.        add
13ec0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73 70  LineMacro = !psp
13ed0 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  ->gp->nolinenosf
13ee0 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73 65  lag && psp->inse
13ef0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20  rtLineMacro &&. 
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65 63         (psp->dec
13f20 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c  llinenoslot==0 |
13f30 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  | psp->decllinen
13f40 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20  oslot[0]!=0);.  
13f50 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
13f60 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
13f70 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66      for(z=psp->f
13f80 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30  ilename, nBack=0
13f90 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
13fa0 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
13fb0 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a  '\\' ) nBack++;.
13fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13fd0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
13fe0 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e  ntf(zLine, "#lin
13ff0 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b  e %d ", psp->tok
14000 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  enlineno);.     
14010 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d       nLine = lem
14020 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  onStrlen(zLine);
14030 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20  .          n += 
14040 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72  nLine + lemonStr
14050 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  len(psp->filenam
14060 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20  e) + nBack;.    
14070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
14080 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
14090 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c  = (char *) reall
140a0 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67  oc(*psp->declarg
140b0 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  slot, n);.      
140c0 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64    zBuf = *psp->d
140d0 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c  eclargslot + nOl
140e0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  d;.        if( a
140f0 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20  ddLineMacro ){. 
14100 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c           if( nOl
14110 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27  d && zBuf[-1]!='
14120 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \n' ){.         
14130 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
14140 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  \n';.          }
14150 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
14160 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e  y(zBuf, zLine, n
14170 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
14180 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a   zBuf += nLine;.
14190 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
141a0 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20  ++) = '"';.     
141b0 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e       for(z=psp->
141c0 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b  filename; *z; z+
141d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
141e0 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a  if( *z=='\\' ){.
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
14200 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a  zBuf++) = '\\';.
14210 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14220 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
14230 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20  ++) = *z;.      
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14250 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b  *(zBuf++) = '"';
14260 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14270 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  f++) = '\n';.   
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14290 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65  f( psp->declline
142a0 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64  noslot && psp->d
142b0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d  ecllinenoslot[0]
142c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
142d0 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
142e0 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74  slot[0] = psp->t
142f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  okenlineno;.    
14300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
14310 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c  mcpy(zBuf, zNew,
14320 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   nNew);.        
14330 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  zBuf += nNew;.  
14340 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b        *zBuf = 0;
14350 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14360 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
14370 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
14380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14390 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
143a0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
143b0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
143c0 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c          "Illegal
143d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25   argument to %%%
143e0 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c  s: %s",psp->decl
143f0 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20  keyword,x);.    
14400 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14410 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
14420 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
14430 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
14440 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
14450 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14460 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
14470 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20  LBACK_ID:.      
14480 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
14490 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
144a0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
144b0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
144c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
144d0 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29  !ISUPPER(x[0]) )
144e0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
144f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14500 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14510 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
14520 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65  %fallback argume
14530 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
14540 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
14550 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
14560 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14580 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
14590 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
145a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
145b0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20  sp->fallback==0 
145c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
145d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b  ->fallback = sp;
145e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
145f0 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20  f( sp->fallback 
14600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
14610 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14620 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14630 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14640 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e     "More than on
14650 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67  e fallback assig
14660 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22  ned to token %s"
14670 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
14680 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14690 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
146a0 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61            sp->fa
146b0 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61  llback = psp->fa
146c0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  llback;.        
146d0 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66    psp->gp->has_f
146e0 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  allback = 1;.   
146f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14710 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
14720 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20  _WILDCARD_ID:.  
14730 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
14740 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
14750 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14760 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14770 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
14780 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30  if( !ISUPPER(x[0
14790 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
147a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
147b0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
147c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
147d0 20 20 22 25 25 77 69 6c 64 63 61 72 64 20 61 72    "%%wildcard ar
147e0 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
147f0 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
14800 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
14810 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14830 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14840 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
14850 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  ew(x);.        i
14860 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64  f( psp->gp->wild
14870 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  card==0 ){.     
14880 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69       psp->gp->wi
14890 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20  ldcard = sp;.   
148a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
148b0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
148c0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73  sp->filename, ps
148d0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
148e0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 78 74              "Ext
148f0 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74  ra wildcard to t
14900 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20  oken: %s", x);. 
14910 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
14920 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14950 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c  e WAITING_FOR_CL
14960 41 53 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ASS_ID:.      if
14970 28 20 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29  ( !ISLOWER(x[0])
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
14990 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
149a0 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
149b0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
149c0 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d  "%%token_class m
149d0 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20  ust be followed 
149e0 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  by an identifier
149f0 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  : ", x);.       
14a00 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14a10 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
14a20 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
14a30 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
14a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
14a50 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b  ymbol_find(x) ){
14a60 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
14a70 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14a80 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
14a90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
14aa0 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65  mbol \"%s\" alre
14ab0 61 64 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20  ady used", x);. 
14ac0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
14ad0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
14ae0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
14af0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
14b00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
14b10 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e{.        psp->
14b20 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c  tkclass = Symbol
14b30 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
14b40 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74   psp->tkclass->t
14b50 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49  ype = MULTITERMI
14b60 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70  NAL;.        psp
14b70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14b80 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45  G_FOR_CLASS_TOKE
14b90 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  N;.      }.     
14ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14bb0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
14bc0 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20  SS_TOKEN:.      
14bd0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
14be0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14bf0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
14c00 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
14c10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14c20 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c  ISUPPER(x[0]) ||
14c30 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20   ((x[0]=='|' || 
14c40 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53  x[0]=='/') && IS
14c50 55 50 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a  UPPER(x[1])) ){.
14c60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
14c70 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70  ymbol *msp = psp
14c80 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20  ->tkclass;.     
14c90 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b     msp->nsubsym+
14ca0 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
14cb0 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74  subsym = (struct
14cc0 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c   symbol **) real
14cd0 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c  loc(msp->subsym,
14ce0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
14cf0 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
14d00 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b  )*msp->nsubsym);
14d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49 53  .        if( !IS
14d20 55 50 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b  UPPER(x[0]) ) x+
14d30 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
14d40 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62  subsym[msp->nsub
14d50 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f  sym-1] = Symbol_
14d60 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65  new(x);.      }e
14d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
14d80 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14d90 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14da0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14db0 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20   "%%token_class 
14dc0 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
14dd0 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
14de0 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
14df0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14e00 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14e10 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
14e20 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
14e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14e40 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  ak;.    case RES
14e50 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
14e60 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66  RROR:./*      if
14e70 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
14e80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14e90 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
14ea0 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65  ULE;.**      bre
14eb0 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ak; */.    case 
14ec0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
14ed0 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69  L_ERROR:.      i
14ee0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
14ef0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
14f00 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
14f10 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20  RULE;.      if( 
14f20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d  x[0]=='%' ) psp-
14f30 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
14f40 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
14f50 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  D;.      break;.
14f60 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68    }.}../* Run th
14f70 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f  e preprocessor o
14f80 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66 69  ver the input fi
14f90 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c  le text.  The gl
14fa0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a  obal variables.*
14fb0 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68  * azDefine[0] th
14fc0 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e  rough azDefine[n
14fd0 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69  Define-1] contai
14fe0 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
14ff0 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d  all defined.** m
15000 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75  acros.  This rou
15010 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22  tine looks for "
15020 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69 66  %ifdef" and "%if
15030 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69  ndef" and "%endi
15040 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  f" and.** commen
15050 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65  ts them out.  Te
15060 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73  xt in between is
15070 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
15080 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69 61  out as appropria
15090 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
150a0 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  id preprocess_in
150b0 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  put(char *z){.  
150c0 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a  int i, j, k, n;.
150d0 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20    int exclude = 
150e0 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  0;.  int start =
150f0 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f   0;.  int lineno
15100 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 1;.  int star
15110 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20  t_lineno = 1;.  
15120 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
15130 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
15140 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  ]=='\n' ) lineno
15150 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ++;.    if( z[i]
15160 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26  !='%' || (i>0 &&
15170 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29   z[i-1]!='\n') )
15180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
15190 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d  f( strncmp(&z[i]
151a0 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20  ,"%endif",6)==0 
151b0 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36  && ISSPACE(z[i+6
151c0 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
151d0 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
151e0 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20     exclude--;.  
151f0 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
15200 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
15210 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a    for(j=start; j
15220 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a  <i; j++) if( z[j
15230 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d  ]!='\n' ) z[j] =
15240 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
15250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
15260 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
15270 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
15280 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
15290 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63  }else if( (strnc
152a0 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66  mp(&z[i],"%ifdef
152b0 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41  ",6)==0 && ISSPA
152c0 43 45 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20  CE(z[i+6])).    
152d0 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d        || (strncm
152e0 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66  p(&z[i],"%ifndef
152f0 22 2c 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41  ",7)==0 && ISSPA
15300 43 45 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20  CE(z[i+7])) ){. 
15310 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
15320 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c   ){.        excl
15330 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ude++;.      }el
15340 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
15350 6a 3d 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a  j=i+7; ISSPACE(z
15360 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
15370 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b       for(n=0; z[
15380 6a 2b 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45  j+n] && !ISSPACE
15390 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d  (z[j+n]); n++){}
153a0 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65  .        exclude
153b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 1;.        fo
153c0 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65  r(k=0; k<nDefine
153d0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
153e0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
153f0 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c  Define[k],&z[j],
15400 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74  n)==0 && lemonSt
15410 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  rlen(azDefine[k]
15420 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  )==n ){.        
15430 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b      exclude = 0;
15440 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15450 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
15460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15470 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e    if( z[i+3]=='n
15480 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65  ' ) exclude = !e
15490 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20  xclude;.        
154a0 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
154b0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d           start =
154c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   i;.          st
154d0 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  art_lineno = lin
154e0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eno;.        }. 
154f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15500 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b  (j=i; z[j] && z[
15510 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a  j]!='\n'; j++) z
15520 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  [j] = ' ';.    }
15530 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75  .  }.  if( exclu
15540 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  de ){.    fprint
15550 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d  f(stderr,"unterm
15560 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20 73  inated %%ifdef s
15570 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20  tarting on line 
15580 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e  %d\n", start_lin
15590 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31  eno);.    exit(1
155a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20  );.  }.}../* In 
155b0 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d  spite of its nam
155c0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
155d0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
155e0 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a  nner.  It read.*
155f0 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  * in the entire 
15600 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20  input file (all 
15610 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f  at once) then to
15620 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63  kenizes it.  Eac
15630 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61  h.** token is pa
15640 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63  ssed to the func
15650 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f  tion "parseoneto
15660 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64  ken" which build
15670 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70  s all.** the app
15680 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74  ropriate data st
15690 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
156a0 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63  global state vec
156b0 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69  tor "gp"..*/.voi
156c0 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20 6c  d Parse(struct l
156d0 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74  emon *gp).{.  st
156e0 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a  ruct pstate ps;.
156f0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68    FILE *fp;.  ch
15700 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75  ar *filebuf;.  u
15710 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65  nsigned int file
15720 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  size;.  int line
15730 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  no;.  int c;.  c
15740 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70  har *cp, *nextcp
15750 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
15760 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  e = 0;..  memset
15770 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65  (&ps, '\0', size
15780 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70  of(ps));.  ps.gp
15790 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
157a0 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
157b0 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
157c0 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
157d0 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
157e0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
157f0 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
15800 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
15810 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
15820 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
15830 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
15840 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
15850 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
15860 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
15870 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
15880 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
15890 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
158a0 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
158b0 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
158c0 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
158d0 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
158e0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
158f0 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
15900 20 69 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30   if( filesize>10
15910 30 30 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62  0000000 || fileb
15920 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  uf==0 ){.    Err
15930 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
15940 65 2c 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20  e,0,"Input file 
15950 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20  too large.");.  
15960 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
15970 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
15980 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15990 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69  }.  if( fread(fi
159a0 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65  lebuf,1,filesize
159b0 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29  ,fp)!=filesize )
159c0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70  {.    ErrorMsg(p
159d0 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61  s.filename,0,"Ca
159e0 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20  n't read in all 
159f0 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73  %d bytes of this
15a00 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66   file.",.      f
15a10 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72  ilesize);.    fr
15a20 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20  ee(filebuf);.   
15a30 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
15a40 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b  .    fclose(fp);
15a50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15a60 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20  .  fclose(fp);. 
15a70 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a   filebuf[filesiz
15a80 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61  e] = 0;..  /* Ma
15a90 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61  ke an initial pa
15aa0 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  ss through the f
15ab0 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69  ile to handle %i
15ac0 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66  fdef and %ifndef
15ad0 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73   */.  preprocess
15ae0 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b  _input(filebuf);
15af0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20  ..  /* Now scan 
15b00 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
15b10 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
15b20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15b30 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63  r(cp=filebuf; (c
15b40 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20  = *cp)!=0; ){.  
15b50 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15b60 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20  lineno++;       
15b70 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74         /* Keep t
15b80 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
15b90 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
15ba0 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29 7b  f( ISSPACE(c) ){
15bb0 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b   cp++; continue;
15bc0 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20   }  /* Skip all 
15bd0 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20  white space */. 
15be0 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
15bf0 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20   cp[1]=='/' ){  
15c00 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
15c10 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
15c20 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
15c30 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
15c40 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
15c50 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
15c60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15c70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
15c80 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
15c90 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
15ca0 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f   Skip C style co
15cb0 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
15cc0 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69  cp+=2;.      whi
15cd0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15ce0 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70  && (c!='/' || cp
15cf0 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20  [-1]!='*') ){.  
15d00 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
15d10 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
15d20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
15d30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20    }.      if( c 
15d40 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ) cp++;.      co
15d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
15d60 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20    ps.tokenstart 
15d70 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20  = cp;           
15d80 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65       /* Mark the
15d90 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
15da0 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
15db0 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20  s.tokenlineno = 
15dc0 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  lineno;         
15dd0 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
15de0 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62  on which token b
15df0 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28  egins */.    if(
15e00 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20   c=='\"' ){     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61  /* String litera
15e30 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  ls */.      cp++
15e40 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
15e50 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
15e60 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\"' ){.       
15e70 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
15e80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
15e90 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   cp++;.      }. 
15ea0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
15eb0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15ec0 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74  g(ps.filename,st
15ed0 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67  artline,."String
15ee0 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
15ef0 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
15f00 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
15f10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
15f20 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
15f30 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
15f40 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
15f50 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
15f60 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
15f70 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
15f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
15f90 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='{' ){         
15fa0 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b        /* A block
15fb0 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20   of C code */.  
15fc0 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20      int level;. 
15fd0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
15fe0 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63   for(level=1; (c
15ff0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65  = *cp)!=0 && (le
16000 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29  vel>1 || c!='}')
16010 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
16020 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16030 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
16040 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27   else if( c=='{'
16050 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20   ) level++;.    
16060 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
16070 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20  '}' ) level--;. 
16080 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
16090 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
160a0 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70  ='*' ){  /* Skip
160b0 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
160c0 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63         int prevc
160d0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d  ;.          cp =
160e0 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20   &cp[2];.       
160f0 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
16100 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
16110 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
16120 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d  !='/' || prevc!=
16130 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
16140 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
16150 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
16160 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
16170 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  c;.            c
16180 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  p++;.          }
16190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
161a0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
161b0 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53  1]=='/' ){  /* S
161c0 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f  kip C++ style co
161d0 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20  mments too */.  
161e0 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70          cp = &cp
161f0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77  [2];.          w
16200 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
16210 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63  0 && c!='\n' ) c
16220 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  p++;.          i
16230 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  f( c ) lineno++;
16240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
16250 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
16260 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
16270 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
16280 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
16290 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
162a0 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
162b0 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
162c0 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
162d0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
162e0 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
162f0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
16300 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
16310 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
16320 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16330 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16340 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
16350 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
16360 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
16370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
16380 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
16390 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
163a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
163b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
163c0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
163d0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
163e0 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e  ilename,ps.token
163f0 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20  lineno,."C code 
16400 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
16410 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
16420 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
16430 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
16440 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
16450 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
16460 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16470 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
16480 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
16490 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
164a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41     }else if( ISA
164b0 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20  LNUM(c) ){      
164c0 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65      /* Identifie
164d0 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  rs */.      whil
164e0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
164f0 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c  & (ISALNUM(c) ||
16500 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b   c=='_') ) cp++;
16510 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
16520 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
16530 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31  ( c==':' && cp[1
16540 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d  ]==':' && cp[2]=
16550 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f  ='=' ){ /* The o
16560 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f  perator "::=" */
16570 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a  .      cp += 3;.
16580 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16590 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
165a0 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27   (c=='/' || c=='
165b0 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28 63  |') && ISALPHA(c
165c0 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63  p[1]) ){.      c
165d0 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68  p += 2;.      wh
165e0 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d  ile( (c = *cp)!=
165f0 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29  0 && (ISALNUM(c)
16600 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
16610 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
16620 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
16630 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
16640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
16650 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61  l other (one cha
16660 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72  racter) operator
16670 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
16680 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
16690 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20  cp;.    }.    c 
166a0 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d  = *cp;.    *cp =
166b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
166c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
166d0 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
166e0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61   token */.    pa
166f0 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29  rseonetoken(&ps)
16700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16710 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e   Parse the token
16720 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63   */.    *cp = (c
16730 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20 20  har)c;          
16740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f          /* Resto
16750 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f  re the buffer */
16760 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70  .    cp = nextcp
16770 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c  ;.  }.  free(fil
16780 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20 20  ebuf);          
16790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c            /* Rel
167a0 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72 20  ease the buffer 
167b0 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f  after parsing */
167c0 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73  .  gp->rule = ps
167d0 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70  .firstrule;.  gp
167e0 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e  ->errorcnt = ps.
167f0 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a  errorcnt;.}./***
16800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16810 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
16820 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22  e file "plink.c"
16830 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
16840 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
16850 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
16860 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  g configuration 
16870 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
16880 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20  gation links.** 
16890 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
168a0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
168b0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
168c0 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65  plink *plink_fre
168d0 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41  elist = 0;../* A
168e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c  llocate a new pl
168f0 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c  ink */.struct pl
16900 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29  ink *Plink_new()
16910 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
16920 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66   *newlink;..  if
16930 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
16940 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
16950 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
16960 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
16970 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
16980 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
16990 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
169a0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
169b0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
169c0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
169d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
169e0 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
169f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
16a00 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
16a10 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
16a20 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
16a30 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
16a40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
16a50 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
16a60 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
16a70 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
16a80 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
16a90 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
16aa0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
16ab0 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20  ;.  }.  newlink 
16ac0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
16ad0 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ;.  plink_freeli
16ae0 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  st = plink_freel
16af0 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74  ist->next;.  ret
16b00 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a  urn newlink;.}..
16b10 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74  /* Add a plink t
16b20 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a  o a plink list *
16b30 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64  /.void Plink_add
16b40 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  (struct plink **
16b50 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63 6f 6e  plpp, struct con
16b60 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74  fig *cfp).{.  st
16b70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c  ruct plink *newl
16b80 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d  ink;.  newlink =
16b90 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20   Plink_new();.  
16ba0 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20  newlink->next = 
16bb0 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d  *plpp;.  *plpp =
16bc0 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c   newlink;.  newl
16bd0 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a  ink->cfp = cfp;.
16be0 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65  }../* Transfer e
16bf0 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68  very plink on th
16c00 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f  e list "from" to
16c10 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a   the list "to" *
16c20 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  /.void Plink_cop
16c30 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
16c40 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c 69 6e  *to, struct plin
16c50 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74 72  k *from).{.  str
16c60 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
16c70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d  l;.  while( from
16c80 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
16c90 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20   from->next;.   
16ca0 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74   from->next = *t
16cb0 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f  o;.    *to = fro
16cc0 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65  m;.    from = ne
16cd0 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  xtpl;.  }.}../* 
16ce0 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69  Delete every pli
16cf0 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  nk on the list *
16d00 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  /.void Plink_del
16d10 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  ete(struct plink
16d20 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75 63   *plp).{.  struc
16d30 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b  t plink *nextpl;
16d40 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29  ..  while( plp )
16d50 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70  {.    nextpl = p
16d60 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c  lp->next;.    pl
16d70 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f  p->next = plink_
16d80 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c  freelist;.    pl
16d90 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
16da0 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65  lp;.    plp = ne
16db0 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  xtpl;.  }.}./***
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
16de0 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a  le "report.c" **
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
16e10 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67  Procedures for g
16e20 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74  enerating report
16e30 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20  s and tables in 
16e40 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
16e50 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
16e60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66 69  /* Generate a fi
16e70 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  lename with the 
16e80 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53  given suffix.  S
16e90 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
16ea0 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66  .** name comes f
16eb0 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
16ec0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
16ed0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
16ee0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52   function..*/.PR
16ef0 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65  IVATE char *file
16f00 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75 63 74  _makename(struct
16f10 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f   lemon *lemp, co
16f20 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69 78  nst char *suffix
16f30 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  ).{.  char *name
16f40 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
16f50 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 6d   name = (char*)m
16f60 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
16f70 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  en(lemp->filenam
16f80 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  e) + lemonStrlen
16f90 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
16fa0 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
16fb0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
16fc0 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
16fd0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
16fe0 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
16ff0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
17000 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6e    lemon_strcpy(n
17010 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  ame,lemp->filena
17020 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72  me);.  cp = strr
17030 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  chr(name,'.');. 
17040 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20   if( cp ) *cp = 
17050 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61  0;.  lemon_strca
17060 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
17070 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
17080 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
17090 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
170a0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
170b0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
170c0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
170d0 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
170e0 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
170f0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
17100 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
17110 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
17120 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a  ILE *file_open(.
17130 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
17140 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lemp,.  const ch
17150 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f  ar *suffix,.  co
17160 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29  nst char *mode.)
17170 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  {.  FILE *fp;.. 
17180 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61   if( lemp->outna
17190 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e  me ) free(lemp->
171a0 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70  outname);.  lemp
171b0 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65  ->outname = file
171c0 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
171d0 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20  suffix);.  fp = 
171e0 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e  fopen(lemp->outn
171f0 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28  ame,mode);.  if(
17200 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d   fp==0 && *mode=
17210 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69  ='w' ){.    fpri
17220 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
17230 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73  t open file \"%s
17240 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74  \".\n",lemp->out
17250 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
17260 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
17270 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
17280 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
17290 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
172a0 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
172b0 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
172c0 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
172d0 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
172e0 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
172f0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
17300 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
17310 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
17320 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
17330 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
17340 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
17350 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
17360 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
17370 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
17380 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
17390 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
173a0 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
173b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
173c0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
173d0 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
173e0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
173f0 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
17400 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
17410 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
17420 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
17430 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
17440 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
17450 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
17460 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
17470 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
17480 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
17490 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
174a0 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
174b0 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
174c0 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
174d0 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
174e0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
174f0 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
17500 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
17510 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
17520 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
17530 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
17540 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
17550 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
17560 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
17570 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
17580 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
17590 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
175a0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
175b0 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
175c0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
175d0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
175e0 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
175f0 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
17600 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
17610 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
17620 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
17630 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
17640 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
17650 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74  .      if( sp->t
17660 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
17670 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  AL ){.        pr
17680 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e  intf(" %s", sp->
17690 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29  subsym[0]->name)
176a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
176b0 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; j<sp->nsubsym
176c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
176d0 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20    printf("|%s", 
176e0 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
176f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
17700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17710 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
17720 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
17730 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69      }.      /* i
17740 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
17750 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  i] ) printf("(%s
17760 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  )",rp->rhsalias[
17770 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  i]); */.    }.  
17780 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20    printf(".");. 
17790 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73     if( rp->precs
177a0 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25  ym ) printf(" [%
177b0 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d  s]",rp->precsym-
177c0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69  >name);.    /* i
177d0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72  f( rp->code ) pr
177e0 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c  intf("\n    %s",
177f0 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20  rp->code); */.  
17800 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
17810 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20    }.}../* Print 
17820 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a  a single rule..*
17830 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69 6e 74  /.void RulePrint
17840 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63  (FILE *fp, struc
17850 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20  t rule *rp, int 
17860 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74 72 75  iCursor){.  stru
17870 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
17880 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72   int i, j;.  fpr
17890 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22  intf(fp,"%s ::="
178a0 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
178b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72  .  for(i=0; i<=r
178c0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
178d0 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72 73 6f     if( i==iCurso
178e0 72 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  r ) fprintf(fp,"
178f0 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d   *");.    if( i=
17900 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61  =rp->nrhs ) brea
17910 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  k;.    sp = rp->
17920 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rhs[i];.    if( 
17930 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
17940 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
17950 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
17960 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  ", sp->subsym[0]
17970 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  ->name);.      f
17980 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
17990 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
179a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
179b0 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
179c0 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
179d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
179e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
179f0 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
17a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
17a10 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75 6c 65  * Print the rule
17a20 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75 72 61   for a configura
17a30 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f  tion..*/.void Co
17a40 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20 2a  nfigPrint(FILE *
17a50 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  fp, struct confi
17a60 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65 50  g *cfp){.  RuleP
17a70 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72 70  rint(fp, cfp->rp
17a80 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a  , cfp->dot);.}..
17a90 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20  /* #define TEST 
17aa0 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e  */.#if 0./* Prin
17ab0 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41  t a set */.PRIVA
17ac0 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74  TE void SetPrint
17ad0 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46  (out,set,lemp).F
17ae0 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a  ILE *out;.char *
17af0 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  set;.struct lemo
17b00 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
17b10 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63   i;.  char *spac
17b20 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22  er;.  spacer = "
17b30 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ";.  fprintf(out
17b40 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20  ,"%12s[","");.  
17b50 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
17b60 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
17b70 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69 6e  {.    if( SetFin
17b80 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20  d(set,i) ){.    
17b90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
17ba0 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70  s%s",spacer,lemp
17bb0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
17bc0 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65  me);.      space
17bd0 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20  r = " ";.    }. 
17be0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
17bf0 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50  ,"]\n");.}../* P
17c00 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61  rint a plink cha
17c10 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  in */.PRIVATE vo
17c20 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75  id PlinkPrint(ou
17c30 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20  t,plp,tag).FILE 
17c40 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69  *out;.struct pli
17c50 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74  nk *plp;.char *t
17c60 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70  ag;.{.  while( p
17c70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  lp ){.    fprint
17c80 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73  f(out,"%12s%s (s
17c90 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74  tate %2d) ","",t
17ca0 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70  ag,plp->cfp->stp
17cb0 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
17cc0 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74   ConfigPrint(out
17cd0 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20  ,plp->cfp);.    
17ce0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
17cf0 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70  );.    plp = plp
17d00 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65  ->next;.  }.}.#e
17d10 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  ndif../* Print a
17d20 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  n action to the 
17d30 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
17d40 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46  iptor.  Return F
17d50 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69  ALSE if.** nothi
17d60 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20  ng was actually 
17d70 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  printed..*/.int 
17d80 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20 73  PrintAction(.  s
17d90 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
17da0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
17db0 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72 69 6e  e action to prin
17dc0 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70 2c  t */.  FILE *fp,
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20     /* Print the 
17df0 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20  action here */. 
17e00 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20 20 20   int indent     
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73 20 61  Indent by this a
17e30 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mount */.){.  in
17e40 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
17e50 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
17e60 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
17e70 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74 72 75  FT: {.      stru
17e80 63 74 20 73 74 61 74 65 20 2a 73 74 70 20 3d 20  ct state *stp = 
17e90 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20  ap->x.stp;.     
17ea0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17eb0 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d   shift        %-
17ec0 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  7d",indent,ap->s
17ed0 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74 61  p->name,stp->sta
17ee0 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
17ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17f00 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a 20 20  ase REDUCE: {.  
17f10 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
17f20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a  *rp = ap->x.rp;.
17f30 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17f40 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20 20  ,"%*s reduce    
17f50 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c     %-7d",indent,
17f60 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d  ap->sp->name,rp-
17f70 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52  >iRule);.      R
17f80 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c  ulePrint(fp, rp,
17f90 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
17fa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17fb0 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20 7b  e SHIFTREDUCE: {
17fc0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75  .      struct ru
17fd0 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72  le *rp = ap->x.r
17fe0 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  p;.      fprintf
17ff0 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 2d 72  (fp,"%*s shift-r
18000 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e 64 65  educe %-7d",inde
18010 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
18020 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
18030 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20    RulePrint(fp, 
18040 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62  rp, -1);.      b
18050 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18060 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20  case ACCEPT:.   
18070 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18080 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e  *s accept",inden
18090 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
180a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
180b0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20    case ERROR:.  
180c0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
180d0 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e  %*s error",inden
180e0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
180f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18100 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43    case SRCONFLIC
18110 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f  T:.    case RRCO
18120 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70  NFLICT:.      fp
18130 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
18140 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64 20  duce       %-7d 
18150 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
18160 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
18170 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
18180 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
18190 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Rule);.      bre
181a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
181b0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
181c0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
181d0 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64  hift        %-7d
181e0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
181f0 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20  lict **", .     
18200 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
18210 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
18220 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
18230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18240 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a  se SH_RESOLVED:.
18250 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
18260 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
18270 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18280 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
18290 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2d 2d  t        %-7d --
182a0 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65 63   dropped by prec
182b0 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20  edence",.       
182c0 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c           indent,
182d0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
182e0 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
182f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18300 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
18310 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
18330 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
18340 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65       if( showPre
18350 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20  cedenceConflict 
18360 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18370 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
18380 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65  e %-7d -- droppe
18390 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
183a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
183b0 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
183c0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
183d0 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65  iRule);.      }e
183e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
183f0 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ult = 0;.      }
18400 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18410 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
18420 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
18430 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
18440 20 20 7d 0a 20 20 69 66 28 20 72 65 73 75 6c 74    }.  if( result
18450 20 26 26 20 61 70 2d 3e 73 70 4f 70 74 20 29 7b   && ap->spOpt ){
18460 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
18470 22 20 20 2f 2a 20 62 65 63 61 75 73 65 20 25 73  "  /* because %s
18480 3d 3d 25 73 20 2a 2f 22 2c 20 61 70 2d 3e 73 70  ==%s */", ap->sp
18490 2d 3e 6e 61 6d 65 2c 20 61 70 2d 3e 73 70 4f 70  ->name, ap->spOp
184a0 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  t->name);.  }.  
184b0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
184c0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68  ../* Generate th
184d0 65 20 22 2a 2e 6f 75 74 22 20 6c 6f 67 20 66 69  e "*.out" log fi
184e0 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  le */.void Repor
184f0 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20 6c  tOutput(struct l
18500 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
18510 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
18520 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
18530 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
18540 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
18550 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
18560 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
18570 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
18580 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
18590 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
185a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
185b0 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
185c0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
185d0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
185e0 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
185f0 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
18600 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
18610 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
18620 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
18630 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
18640 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
18650 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
18660 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
18670 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
18680 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
18690 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
186a0 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  {.        lemon_
186b0 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64  sprintf(buf,"(%d
186c0 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75 6c  )",cfp->rp->iRul
186d0 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  e);.        fpri
186e0 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20  ntf(fp,"    %5s 
186f0 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65  ",buf);.      }e
18700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
18710 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20  intf(fp,"       
18720 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20     ");.      }. 
18730 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74       ConfigPrint
18740 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  (fp,cfp);.      
18750 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
18760 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53 65  ;.#if 0.      Se
18770 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  tPrint(fp,cfp->f
18780 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20  ws,lemp);.      
18790 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
187a0 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b  p->fplp,"To  ");
187b0 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
187c0 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22  t(fp,cfp->bplp,"
187d0 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20  From");.#endif. 
187e0 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62       if( lemp->b
187f0 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63  asisflag ) cfp=c
18800 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c  fp->bp;.      el
18810 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
18820 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78      cfp=cfp->nex
18830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  t;.    }.    fpr
18840 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
18850 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
18860 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
18870 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  xt){.      if( P
18880 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70  rintAction(ap,fp
18890 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66  ,30) ) fprintf(f
188a0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  p,"\n");.    }. 
188b0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
188c0 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n");.  }.  fprin
188d0 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  tf(fp, "--------
188e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
188f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
18910 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  ;.  fprintf(fp, 
18920 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20  "Symbols:\n");. 
18930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18940 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
18950 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
18960 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18970 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  p;..    sp = lem
18980 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
18990 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
189a0 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73    %3d: %s", i, s
189b0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  p->name);.    if
189c0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
189d0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
189e0 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22   fprintf(fp, ":"
189f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
18a00 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20  >lambda ){.     
18a10 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
18a20 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20   <lambda>");.   
18a30 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
18a40 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; j<lemp->nter
18a50 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  minal; j++){.   
18a60 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72       if( sp->fir
18a70 73 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64  stset && SetFind
18a80 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a  (sp->firstset, j
18a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
18aa0 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22  printf(fp, " %s"
18ab0 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  , lemp->symbols[
18ac0 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
18ad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18ae0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
18af0 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  p, "\n");.  }.  
18b00 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65  fclose(fp);.  re
18b10 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72  turn;.}../* Sear
18b20 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ch for the file 
18b30 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20  "name" which is 
18b40 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
18b50 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
18b60 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52  exacutable */.PR
18b70 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68  IVATE char *path
18b80 73 65 61 72 63 68 28 63 68 61 72 20 2a 61 72 67  search(char *arg
18b90 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20  v0, char *name, 
18ba0 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a  int modemask).{.
18bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
18bc0 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a  thlist;.  char *
18bd0 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63 68  pathbufptr;.  ch
18be0 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20 63  ar *pathbuf;.  c
18bf0 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20  har *path,*cp;. 
18c00 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66   char c;..#ifdef
18c10 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20   __WIN32__.  cp 
18c20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
18c30 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63  '\\');.#else.  c
18c40 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
18c50 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20  0,'/');.#endif. 
18c60 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63   if( cp ){.    c
18c70 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
18c80 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20  = 0;.    path = 
18c90 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
18ca0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
18cb0 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0) + lemonStrlen
18cc0 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
18cd0 20 20 69 66 28 20 70 61 74 68 20 29 20 6c 65 6d    if( path ) lem
18ce0 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c  on_sprintf(path,
18cf0 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61  "%s/%s",argv0,na
18d00 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63  me);.    *cp = c
18d10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18d20 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76  athlist = getenv
18d30 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66  ("PATH");.    if
18d40 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20  ( pathlist==0 ) 
18d50 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62  pathlist = ".:/b
18d60 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20  in:/usr/bin";.  
18d70 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68 61    pathbuf = (cha
18d80 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
18d90 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
18da0 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61  t) + 1 );.    pa
18db0 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  th = (char *)mal
18dc0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
18dd0 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e  (pathlist)+lemon
18de0 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  Strlen(name)+2 )
18df0 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68 62  ;.    if( (pathb
18e00 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61 74  uf != 0) && (pat
18e10 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  h!=0) ){.      p
18e20 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74 68  athbufptr = path
18e30 62 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e  buf;.      lemon
18e40 5f 73 74 72 63 70 79 28 70 61 74 68 62 75 66 2c  _strcpy(pathbuf,
18e50 20 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20   pathlist);.    
18e60 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75    while( *pathbu
18e70 66 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20  f ){.        cp 
18e80 3d 20 73 74 72 63 68 72 28 70 61 74 68 62 75 66  = strchr(pathbuf
18e90 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69  ,':');.        i
18ea0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
18eb0 26 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74  &pathbuf[lemonSt
18ec0 72 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a  rlen(pathbuf)];.
18ed0 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b          c = *cp;
18ee0 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30  .        *cp = 0
18ef0 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  ;.        lemon_
18f00 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
18f10 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
18f20 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
18f30 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
18f40 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
18f50 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
18f60 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
18f70 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
18f80 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
18f90 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
18fa0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18fb0 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
18fc0 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
18fd0 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
18fe0 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
18ff0 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
19000 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
19010 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
19020 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
19030 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
19040 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
19050 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
19060 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
19070 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
19080 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
19090 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
190a0 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
190b0 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
190c0 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
190d0 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
190e0 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
190f0 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
19100 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
19110 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
19120 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19150 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
19160 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e  act = ap->x.rp->
19170 69 52 75 6c 65 20 2b 20 6c 65 6d 70 2d 3e 6e 73  iRule + lemp->ns
19180 74 61 74 65 3b 20 20 20 20 20 20 20 20 62 72 65  tate;        bre
19190 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44  ak;.    case RED
191a0 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78  UCE: act = ap->x
191b0 2e 72 70 2d 3e 69 52 75 6c 65 20 2b 20 6c 65 6d  .rp->iRule + lem
191c0 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
191d0 6e 72 75 6c 65 3b 20 62 72 65 61 6b 3b 0a 20 20  nrule; break;.  
191e0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61    case ERROR:  a
191f0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
19200 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a  e + lemp->nrule*
19210 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
19220 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19230 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c   ACCEPT: act = l
19240 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
19250 6d 70 2d 3e 6e 72 75 6c 65 2a 32 20 2b 20 31 3b  mp->nrule*2 + 1;
19260 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19270 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
19280 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65     act = -1; bre
19290 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
192a0 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65   act;.}..#define
192b0 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f   LINESIZE 1000./
192c0 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74  * The next clust
192d0 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  er of routines a
192e0 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74  re for reading t
192f0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
19300 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20  .** and writing 
19310 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
19320 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  he generated par
19330 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69  ser */./* The fi
19340 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61  rst function tra
19350 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d  nsfers data from
19360 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75   "in" to "out" u
19370 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69  ntil.** a line i
19380 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65 67  s seen which beg
19390 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20 20  ins with "%%".  
193a0 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  The line number 
193b0 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a  is.** tracked..*
193c0 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c  *.** if name!=0,
193d0 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74   then any word t
193e0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
193f0 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67 65  Parse" is change
19400 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69  d to.** begin wi
19410 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64  th *name instead
19420 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
19430 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72  d tplt_xfer(char
19440 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e   *name, FILE *in
19450 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74  , FILE *out, int
19460 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e   *lineno).{.  in
19470 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63  t i, iStart;.  c
19480 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
19490 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  E];.  while( fge
194a0 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
194b0 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d  ,in) && (line[0]
194c0 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d  !='%' || line[1]
194d0 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a  !='%') ){.    (*
194e0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69  lineno)++;.    i
194f0 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  Start = 0;.    i
19500 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  f( name ){.     
19510 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69   for(i=0; line[i
19520 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
19530 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50   if( line[i]=='P
19540 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69  ' && strncmp(&li
19550 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29  ne[i],"Parse",5)
19560 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
19570 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c 50   (i==0 || !ISALP
19580 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20  HA(line[i-1])). 
19590 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
195a0 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74      if( i>iStart
195b0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
195c0 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26  %.*s",i-iStart,&
195d0 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
195e0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
195f0 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b  (out,"%s",name);
19600 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
19610 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74  4;.          iSt
19620 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20  art = i+1;.     
19630 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19640 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
19650 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53  ut,"%s",&line[iS
19660 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart]);.  }.}../
19670 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74  * The next funct
19680 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65  ion finds the te
19690 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20  mplate file and 
196a0 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e  opens it, return
196b0 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ing.** a pointer
196c0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
196d0 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
196e0 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28  FILE *tplt_open(
196f0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
19700 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63  mp).{.  static c
19710 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  har templatename
19720 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b  [] = "lempar.c";
19730 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30 30  .  char buf[1000
19740 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ];.  FILE *in;. 
19750 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b   char *tpltname;
19760 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
19770 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69 66  /* first, see if
19780 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
19790 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e  a template filen
197a0 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ame on the comma
197b0 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66  nd line. */.  if
197c0 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e   (user_templaten
197d0 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20  ame != 0) {.    
197e0 69 66 28 20 61 63 63 65 73 73 28 75 73 65 72 5f  if( access(user_
197f0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
19800 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  )==-1 ){.      f
19810 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
19820 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
19830 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
19840 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
19850 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73  .\n",.        us
19860 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  er_templatename)
19870 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
19880 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
19890 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
198a0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75      in = fopen(u
198b0 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
198c0 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20  ,"rb");.    if( 
198d0 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  in==0 ){.      f
198e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
198f0 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65  an't open the te
19900 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
19910 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
19920 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
19930 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
19940 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
19950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
19970 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70  rn in;.  }..  cp
19980 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d   = strrchr(lemp-
19990 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a  >filename,'.');.
199a0 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
199b0 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75  lemon_sprintf(bu
199c0 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
199d0 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
199e0 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
199f0 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
19a00 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
19a10 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
19a20 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
19a30 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
19a40 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
19a50 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
19a60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63  ;.  }else if( ac
19a70 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d  cess(templatenam
19a80 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  e,004)==0 ){.   
19a90 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70   tpltname = temp
19aa0 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73  latename;.  }els
19ab0 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  e{.    tpltname 
19ac0 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d  = pathsearch(lem
19ad0 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74  p->argv0,templat
19ae0 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20  ename,0);.  }.  
19af0 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20  if( tpltname==0 
19b00 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
19b10 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
19b20 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
19b30 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
19b40 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
19b50 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b    templatename);
19b60 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
19b70 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
19b80 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  n 0;.  }.  in = 
19b90 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22  fopen(tpltname,"
19ba0 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
19bb0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
19bc0 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
19bd0 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
19be0 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
19bf0 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
19c00 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
19c10 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
19c20 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
19c30 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
19c40 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69   a #line directi
19c50 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f  ve line to the o
19c60 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50  utput file. */.P
19c70 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
19c80 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f  _linedir(FILE *o
19c90 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20  ut, int lineno, 
19ca0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a  char *filename).
19cb0 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
19cc0 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
19cd0 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
19ce0 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
19cf0 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
19d00 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
19d10 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
19d20 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
19d30 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
19d40 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
19d50 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
19d60 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
19d70 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
19d80 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
19d90 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
19da0 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
19db0 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45   tplt_print(FILE
19dc0 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65   *out, struct le
19dd0 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20  mon *lemp, char 
19de0 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e  *str, int *linen
19df0 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d  o).{.  if( str==
19e00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
19e10 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20  ile( *str ){.   
19e20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b   putc(*str,out);
19e30 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
19e40 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19e50 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20  +;.    str++;.  
19e60 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21  }.  if( str[-1]!
19e70 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74  ='\n' ){.    put
19e80 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20  c('\n',out);.   
19e90 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
19ea0 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e  }.  if (!lemp->n
19eb0 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a  olinenosflag) {.
19ec0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
19ed0 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
19ee0 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
19ef0 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20  outname); .  }. 
19f00 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
19f10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19f20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f  routine emits co
19f30 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72  de for the destr
19f40 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a  uctor for the.**
19f50 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f   symbol sp.*/.vo
19f60 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74  id emit_destruct
19f70 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  or_code(.  FILE 
19f80 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73  *out,.  struct s
19f90 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72  ymbol *sp,.  str
19fa0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
19fb0 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29  .  int *lineno.)
19fc0 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
19fd0 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
19fe0 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
19ff0 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
1a000 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
1a010 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1a020 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
1a030 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1a040 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
1a050 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
1a060 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
1a070 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
1a080 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
1a090 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28  ineno)++;.   if(
1a0a0 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1a0b0 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1a0c0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1a0d0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1a0e0 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c  ,sp->destLineno,
1a0f0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1a100 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28  .   }. }else if(
1a110 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
1a120 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
1a130 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
1a140 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
1a150 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a160 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
1a170 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61  ++;. }else{.   a
1a180 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
1a190 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f  Cannot happen */
1a1a0 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20  . }. for(; *cp; 
1a1b0 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63  cp++){.   if( *c
1a1c0 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d  p=='$' && cp[1]=
1a1d0 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72  ='$' ){.     fpr
1a1e0 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69  intf(out,"(yypmi
1a1f0 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e  nor->yy%d)",sp->
1a200 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b  dtnum);.     cp+
1a210 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  +;.     continue
1a220 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63  ;.   }.   if( *c
1a230 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  p=='\n' ) (*line
1a240 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28  no)++;.   fputc(
1a250 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70  *cp,out);. }. fp
1a260 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1a270 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69   (*lineno)++;. i
1a280 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
1a290 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28  nosflag) { .   (
1a2a0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
1a2b0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
1a2c0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
1a2d0 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74  me); . }. fprint
1a2e0 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
1a2f0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75  lineno)++;. retu
1a300 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
1a310 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
1a320 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
1a330 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
1a340 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
1a350 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1a360 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1a370 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p, struct lemon 
1a380 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72  *lemp).{.  int r
1a390 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
1a3a0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
1a3b0 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
1a3c0 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
1a3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
1a3e0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
1a3f0 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1a400 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
1a410 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
1a420 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
1a430 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
1a440 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
1a450 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
1a460 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
1a470 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
1a480 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
1a490 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
1a4a0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
1a4b0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
1a4c0 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
1a4d0 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
1a4e0 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
1a4f0 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
1a500 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
1a510 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
1a520 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
1a530 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
1a540 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
1a550 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
1a560 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
1a570 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
1a580 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
1a590 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
1a5a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a5b0 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
1a5c0 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
1a5d0 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
1a5e0 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
1a5f0 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
1a600 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
1a610 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
1a620 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
1a630 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
1a640 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
1a650 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b  atic char empty[
1a660 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74  1] = { 0 };.  st
1a670 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
1a680 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
1a690 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
1a6a0 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
1a6b0 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
1a6c0 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69  ar zInt[40];.  i
1a6d0 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
1a6e0 20 20 20 69 66 28 20 75 73 65 64 3d 3d 30 20 26     if( used==0 &
1a6f0 26 20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20  & z!=0 ) z[0] = 
1a700 30 3b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  0;.    used = 0;
1a710 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
1a720 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
1a730 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
1a740 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
1a750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
1a760 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
1a770 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
1a780 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
1a790 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
1a7a0 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
1a7b0 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
1a7c0 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
1a7d0 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
1a7e0 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
1a7f0 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
1a800 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
1a810 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
1a820 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1a830 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
1a840 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
1a850 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
1a860 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
1a870 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
1a880 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c  =='d' ){.      l
1a890 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e  emon_sprintf(zIn
1a8a0 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
1a8b0 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
1a8c0 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
1a8d0 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
1a8e0 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
1a8f0 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
1a900 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
1a910 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
1a920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a930 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68   z[used++] = (ch
1a940 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ar)c;.    }.  }.
1a950 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
1a960 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1a970 0a 2a 2a 20 57 72 69 74 65 20 61 6e 64 20 74 72  .** Write and tr
1a980 61 6e 73 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e  ansform the rp->
1a990 63 6f 64 65 20 73 74 72 69 6e 67 20 73 6f 20 74  code string so t
1a9a0 68 61 74 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  hat symbols are 
1a9b0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70  expanded..** Pop
1a9c0 75 6c 61 74 65 20 74 68 65 20 72 70 2d 3e 63 6f  ulate the rp->co
1a9d0 64 65 50 72 65 66 69 78 20 61 6e 64 20 72 70 2d  dePrefix and rp-
1a9e0 3e 63 6f 64 65 53 75 66 66 69 78 20 73 74 72 69  >codeSuffix stri
1a9f0 6e 67 73 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ngs, as appropri
1aa00 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
1aa10 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 61 6e  n 1 if the expan
1aa20 64 65 64 20 63 6f 64 65 20 72 65 71 75 69 72 65  ded code require
1aa30 73 20 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e  s that "yylhsmin
1aa40 6f 72 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  or" local variab
1aa50 6c 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69  le.** to be defi
1aa60 6e 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ned..*/.PRIVATE 
1aa70 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  int translate_co
1aa80 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
1aa90 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
1aaa0 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
1aab0 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
1aac0 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  i;.  int rc = 0;
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aae0 72 75 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f  rue if yylhsmino
1aaf0 72 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69  r is used */.  i
1ab00 6e 74 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d  nt dontUseRhs0 =
1ab10 20 30 3b 20 20 20 2f 2a 20 49 66 20 74 72 75 65   0;   /* If true
1ab20 2c 20 75 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f  , use of left-mo
1ab30 73 74 20 52 48 53 20 6c 61 62 65 6c 20 69 73 20  st RHS label is 
1ab40 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e  illegal */.  con
1ab50 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d  st char *zSkip =
1ab60 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72   0; /* The zOvwr
1ab70 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e  t comment within
1ab80 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55   rp->code, or NU
1ab90 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  LL */.  char lhs
1aba0 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 2f  used = 0;      /
1abb0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48  * True if the LH
1abc0 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65  S element has be
1abd0 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  en used */.  cha
1abe0 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20 20 20  r lhsdirect;    
1abf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4c      /* True if L
1ac00 48 53 20 77 72 69 74 65 73 20 64 69 72 65 63 74  HS writes direct
1ac10 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f  ly into stack */
1ac20 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  .  char used[MAX
1ac30 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75  RHS];     /* Tru
1ac40 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
1ac50 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
1ac60 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a  used */.  char z
1ac70 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20 20 20  Lhs[50];        
1ac80 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
1ac90 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20  LHS symbol into 
1aca0 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  this string */. 
1acb0 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39 30 30   char zOvwrt[900
1acc0 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65  ];      /* Comme
1acd0 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77  nt that to allow
1ace0 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72 69 74   LHS to overwrit
1acf0 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28  e RHS */..  for(
1ad00 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1ad10 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20   i++) used[i] = 
1ad20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30  0;.  lhsused = 0
1ad30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  ;..  if( rp->cod
1ad40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
1ad50 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73  ic char newlines
1ad60 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20  tr[2] = { '\n', 
1ad70 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e  '\0' };.    rp->
1ad80 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74  code = newlinest
1ad90 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20  r;.    rp->line 
1ada0 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a  = rp->ruleline;.
1adb0 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1adc0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1add0 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1ade0 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d  .  }...  if( rp-
1adf0 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20  >nrhs==0 ){.    
1ae00 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1ae10 6e 6f 20 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20  no RHS symbols, 
1ae20 74 68 65 6e 20 77 72 69 74 69 6e 67 20 64 69 72  then writing dir
1ae30 65 63 74 6c 79 20 74 6f 20 74 68 65 20 4c 48 53  ectly to the LHS
1ae40 20 69 73 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68   is ok */.    lh
1ae50 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d  sdirect = 1;.  }
1ae60 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
1ae70 61 6c 69 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20  alias[0]==0 ){. 
1ae80 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d     /* The left-m
1ae90 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 68  ost RHS symbol h
1aea0 61 73 20 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48  as no value.  LH
1aeb0 53 20 64 69 72 65 63 74 20 69 73 20 6f 6b 2e 20  S direct is ok. 
1aec0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 65 20 68   But.    ** we h
1aed0 61 76 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ave to call the 
1aee0 64 69 73 74 72 75 63 74 6f 72 20 6f 6e 20 74 68  distructor on th
1aef0 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 66 69 72  e RHS symbol fir
1af00 73 74 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69  st. */.    lhsdi
1af10 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  rect = 1;.    if
1af20 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
1af30 28 72 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70  (rp->rhs[0],lemp
1af40 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ) ){.      appen
1af50 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1af60 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1af70 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1af80 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1af90 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1afa0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1afb0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1afc0 73 5b 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70  s[0]->index,1-rp
1afd0 2d 3e 6e 72 68 73 29 3b 0a 20 20 20 20 20 20 72  ->nrhs);.      r
1afe0 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 3d 20  p->codePrefix = 
1aff0 53 74 72 73 61 66 65 28 61 70 70 65 6e 64 5f 73  Strsafe(append_s
1b000 74 72 28 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20  tr(0,0,0,0));.  
1b010 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1b020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1b030 65 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69  e if( rp->lhsali
1b040 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  as==0 ){.    /* 
1b050 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48 53 20  There is no LHS 
1b060 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f  value symbol. */
1b070 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1b080 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1b090 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c  strcmp(rp->lhsal
1b0a0 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ias,rp->rhsalias
1b0b0 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  [0])==0 ){.    /
1b0c0 2a 20 54 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  * The LHS symbol
1b0d0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f   and the left-mo
1b0e0 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 61 72  st RHS symbol ar
1b0f0 65 20 74 68 65 20 73 61 6d 65 2c 20 73 6f 20 0a  e the same, so .
1b100 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 77 72      ** direct wr
1b110 69 74 69 6e 67 20 69 73 20 61 6c 6c 6f 77 65 64  iting is allowed
1b120 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63   */.    lhsdirec
1b130 74 20 3d 20 31 3b 0a 20 20 20 20 6c 68 73 75 73  t = 1;.    lhsus
1b140 65 64 20 3d 20 31 3b 0a 20 20 20 20 75 73 65 64  ed = 1;.    used
1b150 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  [0] = 1;.    if(
1b160 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21   rp->lhs->dtnum!
1b170 3d 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e  =rp->rhs[0]->dtn
1b180 75 6d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  um ){.      Erro
1b190 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1b1a0 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1b1b0 2c 0a 20 20 20 20 20 20 20 20 22 25 73 28 25 73  ,.        "%s(%s
1b1c0 29 20 61 6e 64 20 25 73 28 25 73 29 20 73 68 61  ) and %s(%s) sha
1b1d0 72 65 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65  re the same labe
1b1e0 6c 20 62 75 74 20 68 61 76 65 20 22 0a 20 20 20  l but have ".   
1b1f0 20 20 20 20 20 22 64 69 66 66 65 72 65 6e 74 20       "different 
1b200 64 61 74 61 74 79 70 65 73 2e 22 2c 0a 20 20 20  datatypes.",.   
1b210 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61       rp->lhs->na
1b220 6d 65 2c 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  me, rp->lhsalias
1b230 2c 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61  , rp->rhs[0]->na
1b240 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  me, rp->rhsalias
1b250 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [0]);.      lemp
1b260 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1b270 20 20 7d 20 20 20 20 0a 20 20 7d 65 6c 73 65 7b    }    .  }else{
1b280 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  .    lemon_sprin
1b290 74 66 28 7a 4f 76 77 72 74 2c 20 22 2f 2a 25 73  tf(zOvwrt, "/*%s
1b2a0 2d 6f 76 65 72 77 72 69 74 65 73 2d 25 73 2a 2f  -overwrites-%s*/
1b2b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b2c0 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61       rp->lhsalia
1b2d0 73 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  s, rp->rhsalias[
1b2e0 30 5d 29 3b 0a 20 20 20 20 7a 53 6b 69 70 20 3d  0]);.    zSkip =
1b2f0 20 73 74 72 73 74 72 28 72 70 2d 3e 63 6f 64 65   strstr(rp->code
1b300 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20 69  , zOvwrt);.    i
1b310 66 28 20 7a 53 6b 69 70 21 3d 30 20 29 7b 0a 20  f( zSkip!=0 ){. 
1b320 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1b330 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70 65 63   contains a spec
1b340 69 61 6c 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74  ial comment that
1b350 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1b360 69 74 20 69 73 20 73 61 66 65 0a 20 20 20 20 20  it is safe.     
1b370 20 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53 20   ** for the LHS 
1b380 6c 61 62 65 6c 20 74 6f 20 6f 76 65 72 77 72 69  label to overwri
1b390 74 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53  te left-most RHS
1b3a0 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20 20 20 20   label. */.     
1b3b0 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a   lhsdirect = 1;.
1b3c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b3d0 20 6c 68 73 64 69 72 65 63 74 20 3d 20 30 3b 0a   lhsdirect = 0;.
1b3e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1b3f0 6c 68 73 64 69 72 65 63 74 20 29 7b 0a 20 20 20  lhsdirect ){.   
1b400 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22   sprintf(zLhs, "
1b410 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e  yymsp[%d].minor.
1b420 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e 72 68 73  yy%d",1-rp->nrhs
1b430 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29  ,rp->lhs->dtnum)
1b440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b450 63 20 3d 20 31 3b 0a 20 20 20 20 73 70 72 69 6e  c = 1;.    sprin
1b460 74 66 28 7a 4c 68 73 2c 20 22 79 79 6c 68 73 6d  tf(zLhs, "yylhsm
1b470 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c  inor.yy%d",rp->l
1b480 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 0a  hs->dtnum);.  }.
1b490 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
1b4a0 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  0,0,0);..  /* Th
1b4b0 69 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73  is const cast is
1b4c0 20 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c   wrong but harml
1b4d0 65 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61  ess, if we're ca
1b4e0 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28  reful. */.  for(
1b4f0 63 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63  cp=(char *)rp->c
1b500 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
1b510 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 7a 53 6b  .    if( cp==zSk
1b520 69 70 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65  ip ){.      appe
1b530 6e 64 5f 73 74 72 28 7a 4f 76 77 72 74 2c 30 2c  nd_str(zOvwrt,0,
1b540 30 2c 30 29 3b 0a 20 20 20 20 20 20 63 70 20 2b  0,0);.      cp +
1b550 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f  = lemonStrlen(zO
1b560 76 77 72 74 29 2d 31 3b 0a 20 20 20 20 20 20 64  vwrt)-1;.      d
1b570 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 31 3b 0a  ontUseRhs0 = 1;.
1b580 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
1b5a0 41 4c 50 48 41 28 2a 63 70 29 20 26 26 20 28 63  ALPHA(*cp) && (c
1b5b0 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28  p==rp->code || (
1b5c0 21 49 53 41 4c 4e 55 4d 28 63 70 5b 2d 31 5d 29  !ISALNUM(cp[-1])
1b5d0 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29   && cp[-1]!='_')
1b5e0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
1b5f0 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72  saved;.      for
1b600 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 49 53 41  (xp= &cp[1]; ISA
1b610 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c 20 2a 78 70  LNUM(*xp) || *xp
1b620 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20  =='_'; xp++);.  
1b630 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b      saved = *xp;
1b640 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a  .      *xp = 0;.
1b650 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
1b660 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70  salias && strcmp
1b670 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  (cp,rp->lhsalias
1b680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b690 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c  append_str(zLhs,
1b6a0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  0,0,0);.        
1b6b0 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
1b6c0 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
1b6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b6e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
1b6f0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
1b700 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
1b710 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73  rhsalias[i] && s
1b720 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73  trcmp(cp,rp->rhs
1b730 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a  alias[i])==0 ){.
1b740 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b750 69 3d 3d 30 20 26 26 20 64 6f 6e 74 55 73 65 52  i==0 && dontUseR
1b760 68 73 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  hs0 ){.         
1b770 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1b780 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1b790 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 61 62              "Lab
1b7b0 65 6c 20 25 73 20 75 73 65 64 20 61 66 74 65 72  el %s used after
1b7c0 20 27 25 73 27 2e 22 2c 0a 20 20 20 20 20 20 20   '%s'.",.       
1b7d0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1b7e0 73 61 6c 69 61 73 5b 30 5d 2c 20 7a 4f 76 77 72  salias[0], zOvwr
1b7f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1b800 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1b810 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1b820 7d 65 6c 73 65 20 69 66 28 20 63 70 21 3d 72 70  }else if( cp!=rp
1b830 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d  ->code && cp[-1]
1b840 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20  =='@' ){.       
1b850 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1b860 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
1b870 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e  the form @X then
1b880 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
1b890 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1b8a0 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f  e token number o
1b8b0 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c  f X, not the val
1b8c0 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20  ue of X */.     
1b8d0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f           append_
1b8e0 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d  str("yymsp[%d].m
1b8f0 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e  ajor",-1,i-rp->n
1b900 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20  rhs+1,0);.      
1b910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b920 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
1b930 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1b940 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
1b950 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e           int dtn
1b960 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
1b970 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
1b980 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
1b990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b9a0 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62   dtnum = sp->sub
1b9b0 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20  sym[0]->dtnum;. 
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1b9d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b9e0 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e      dtnum = sp->
1b9f0 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1ba00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ba10 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1ba20 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  "yymsp[%d].minor
1ba30 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e  .yy%d",0,i-rp->n
1ba40 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20  rhs+1, dtnum);. 
1ba50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ba60 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70           cp = xp
1ba70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ;.            us
1ba80 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20  ed[i] = 1;.     
1ba90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1baa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bac0 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20    *xp = saved;. 
1bad0 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f     }.    append_
1bae0 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29  str(cp, 1, 0, 0)
1baf0 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f  ;.  } /* End loo
1bb00 70 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 69 6e 20  p */..  /* Main 
1bb10 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1bb20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 20 20 63  completed */.  c
1bb30 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
1bb40 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 63  ,0,0,0);.  if( c
1bb50 70 20 26 26 20 63 70 5b 30 5d 20 29 20 72 70 2d  p && cp[0] ) rp-
1bb60 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
1bb70 63 70 29 3b 0a 20 20 61 70 70 65 6e 64 5f 73 74  cp);.  append_st
1bb80 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f  r(0,0,0,0);..  /
1bb90 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
1bba0 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61 73  sure the LHS has
1bbb0 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20   been used */.  
1bbc0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
1bbd0 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
1bbe0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1bbf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1bc00 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1bc10 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f  "Label \"%s\" fo
1bc20 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
1bc30 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
1bc40 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
1bc50 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  as,rp->lhs->name
1bc60 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  ,rp->lhsalias);.
1bc70 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1bc80 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nt++;.  }..  /* 
1bc90 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
1bca0 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
1bcb0 20 6d 69 6e 6f 72 20 76 61 6c 75 65 73 20 77 68   minor values wh
1bcc0 69 63 68 20 61 72 65 20 6e 6f 74 20 72 65 66 65  ich are not refe
1bcd0 72 65 6e 63 65 64 2e 0a 20 20 2a 2a 20 47 65 6e  renced..  ** Gen
1bce0 65 72 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  erate error mess
1bcf0 61 67 65 73 20 66 6f 72 20 75 6e 75 73 65 64 20  ages for unused 
1bd00 6c 61 62 65 6c 73 20 61 6e 64 20 64 75 70 6c 69  labels and dupli
1bd10 63 61 74 65 20 6c 61 62 65 6c 73 2e 0a 20 20 2a  cate labels..  *
1bd20 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.  for(i=0; i<r
1bd30 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
1bd40 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
1bd50 69 61 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ias[i] ){.      
1bd60 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
1bd70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
1bd80 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
1bd90 61 73 20 26 26 20 73 74 72 63 6d 70 28 72 70 2d  as && strcmp(rp-
1bda0 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72 68  >lhsalias,rp->rh
1bdb0 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
1bdc0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
1bdd0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1bde0 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1bdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73  .            "%s
1be00 28 25 73 29 20 68 61 73 20 74 68 65 20 73 61 6d  (%s) has the sam
1be10 65 20 6c 61 62 65 6c 20 61 73 20 74 68 65 20 4c  e label as the L
1be20 48 53 20 62 75 74 20 69 73 20 6e 6f 74 20 74 68  HS but is not th
1be30 65 20 6c 65 66 74 2d 6d 6f 73 74 20 22 0a 20 20  e left-most ".  
1be40 20 20 20 20 20 20 20 20 20 20 22 73 79 6d 62 6f            "symbo
1be50 6c 20 6f 6e 20 74 68 65 20 52 48 53 2e 22 2c 0a  l on the RHS.",.
1be60 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
1be70 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 20 72 70  rhs[i]->name, rp
1be80 2d 3e 72 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->rhsalias);.   
1be90 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
1bea0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
1beb0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
1bec0 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
1bed0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d           if( rp-
1bee0 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 20 26 26 20  >rhsalias[j] && 
1bef0 73 74 72 63 6d 70 28 72 70 2d 3e 72 68 73 61 6c  strcmp(rp->rhsal
1bf00 69 61 73 5b 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c  ias[j],rp->rhsal
1bf10 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20  ias[i])==0 ){.  
1bf20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
1bf30 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
1bf40 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
1bf60 61 62 65 6c 20 25 73 20 75 73 65 64 20 66 6f 72  abel %s used for
1bf70 20 6d 75 6c 74 69 70 6c 65 20 73 79 6d 62 6f 6c   multiple symbol
1bf80 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  s on the RHS of 
1bf90 61 20 72 75 6c 65 2e 22 2c 0a 20 20 20 20 20 20  a rule.",.      
1bfa0 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
1bfb0 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lias[i]);.      
1bfc0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1bfd0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
1bfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c010 66 28 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  f( !used[i] ){. 
1c020 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
1c030 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1c040 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1c050 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
1c060 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
1c070 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
1c080 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
1c090 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72  hsalias[i],rp->r
1c0a0 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  hs[i]->name,rp->
1c0b0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20  rhsalias[i]);.  
1c0c0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1c0d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
1c0e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3e      }else if( i>
1c0f0 30 20 26 26 20 68 61 73 5f 64 65 73 74 72 75 63  0 && has_destruc
1c100 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c  tor(rp->rhs[i],l
1c110 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 61 70  emp) ){.      ap
1c120 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64  pend_str("  yy_d
1c130 65 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72  estructor(yypPar
1c140 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64  ser,%d,&yymsp[%d
1c150 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c  ].minor);\n", 0,
1c160 0a 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68  .         rp->rh
1c170 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70  s[i]->index,i-rp
1c180 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 7d  ->nrhs+1);.    }
1c190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 6e  .  }..  /* If un
1c1a0 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 4c 48  able to write LH
1c1b0 53 20 76 61 6c 75 65 73 20 64 69 72 65 63 74 6c  S values directl
1c1c0 79 20 69 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  y into the stack
1c1d0 2c 20 77 72 69 74 65 20 74 68 65 0a 20 20 2a 2a  , write the.  **
1c1e0 20 73 61 76 65 64 20 4c 48 53 20 76 61 6c 75 65   saved LHS value
1c1f0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 6c   now. */.  if( l
1c200 68 73 64 69 72 65 63 74 3d 3d 30 20 29 7b 0a 20  hsdirect==0 ){. 
1c210 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20     append_str(" 
1c220 20 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72   yymsp[%d].minor
1c230 2e 79 79 25 64 20 3d 20 22 2c 20 30 2c 20 31 2d  .yy%d = ", 0, 1-
1c240 72 70 2d 3e 6e 72 68 73 2c 20 72 70 2d 3e 6c 68  rp->nrhs, rp->lh
1c250 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 61  s->dtnum);.    a
1c260 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c 20  ppend_str(zLhs, 
1c270 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 70  0, 0, 0);.    ap
1c280 70 65 6e 64 5f 73 74 72 28 22 3b 5c 6e 22 2c 20  pend_str(";\n", 
1c290 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
1c2a0 20 2f 2a 20 53 75 66 66 69 78 20 63 6f 64 65 20   /* Suffix code 
1c2b0 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c  generation compl
1c2c0 65 74 65 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70  ete */.  cp = ap
1c2d0 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1c2e0 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20 63  );.  if( cp && c
1c2f0 70 5b 30 5d 20 29 7b 0a 20 20 20 20 72 70 2d 3e  p[0] ){.    rp->
1c300 63 6f 64 65 53 75 66 66 69 78 20 3d 20 53 74 72  codeSuffix = Str
1c310 73 61 66 65 28 63 70 29 3b 0a 20 20 20 20 72 70  safe(cp);.    rp
1c320 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20  ->noCode = 0;.  
1c330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c340 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61  }../* .** Genera
1c350 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1c360 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
1c370 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64  rule "rp" is red
1c380 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20  uced.  Write.** 
1c390 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74  the code to "out
1c3a0 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69  ".  Make sure li
1c3b0 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f  neno stays up-to
1c3c0 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54  -date..*/.PRIVAT
1c3d0 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65  E void emit_code
1c3e0 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20  (.  FILE *out,. 
1c3f0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1c400 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ,.  struct lemon
1c410 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c   *lemp,.  int *l
1c420 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20  ineno.){. const 
1c430 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 53  char *cp;.. /* S
1c440 65 74 75 70 20 63 6f 64 65 20 70 72 69 6f 72 20  etup code prior 
1c450 74 6f 20 74 68 65 20 23 6c 69 6e 65 20 64 69 72  to the #line dir
1c460 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20 72  ective */. if( r
1c470 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 26 26  p->codePrefix &&
1c480 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 5b   rp->codePrefix[
1c490 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66  0] ){.   fprintf
1c4a0 28 6f 75 74 2c 20 22 7b 25 73 22 2c 20 72 70 2d  (out, "{%s", rp-
1c4b0 3e 63 6f 64 65 50 72 65 66 69 78 29 3b 0a 20 20  >codePrefix);.  
1c4c0 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1c4d0 50 72 65 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Prefix; *cp; cp+
1c4e0 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1c4f0 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1c500 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72   }. }.. /* Gener
1c510 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  ate code to do t
1c520 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
1c530 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
1c540 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c 65 6d  e ){.   if( !lem
1c550 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1c560 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1c570 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1c580 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e  linedir(out,rp->
1c590 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
1c5a0 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20 66 70  ame);.   }.   fp
1c5b0 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c  rintf(out,"{%s",
1c5c0 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f  rp->code);.   fo
1c5d0 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
1c5e0 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1c5f0 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1c600 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 66 70 72  eno)++; }.   fpr
1c610 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
1c620 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1c630 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if( !lemp->noli
1c640 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20  nenosflag ){.   
1c650 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
1c660 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72      tplt_linedir
1c670 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1c680 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
1c690 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  }. }.. /* Genera
1c6a0 74 65 20 62 72 65 61 6b 64 6f 77 6e 20 63 6f 64  te breakdown cod
1c6b0 65 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66  e that occurs af
1c6c0 74 65 72 20 74 68 65 20 23 6c 69 6e 65 20 64 69  ter the #line di
1c6d0 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20  rective */. if( 
1c6e0 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 26  rp->codeSuffix &
1c6f0 26 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  & rp->codeSuffix
1c700 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74  [0] ){.   fprint
1c710 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 72 70 2d  f(out, "%s", rp-
1c720 3e 63 6f 64 65 53 75 66 66 69 78 29 3b 0a 20 20  >codeSuffix);.  
1c730 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1c740 53 75 66 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Suffix; *cp; cp+
1c750 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1c760 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1c770 20 7d 0a 20 7d 0a 0a 20 69 66 28 20 72 70 2d 3e   }. }.. if( rp->
1c780 63 6f 64 65 50 72 65 66 69 78 20 29 7b 0a 20 20  codePrefix ){.  
1c790 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1c7a0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1c7b0 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75 72 6e 3b 0a  +;. }.. return;.
1c7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
1c7d0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1c7e0 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20   the union used 
1c7f0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73  for the parser's
1c800 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20   data stack..** 
1c810 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61  This union conta
1c820 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65  ins fields for e
1c830 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61  very possible da
1c840 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65  ta type for toke
1c850 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72  ns.** and nonter
1c860 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20  minals.  In the 
1c870 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75  process of compu
1c880 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e  ting and printin
1c890 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c  g this.** union,
1c8a0 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e   also set the ".
1c8b0 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
1c8c0 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61  every terminal a
1c8d0 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a  nd nonterminal.*
1c8e0 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69  * symbol..*/.voi
1c8f0 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e  d print_stack_un
1c900 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ion(.  FILE *out
1c910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c920 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
1c930 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72   stream */.  str
1c940 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1c950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c960 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74  main info struct
1c970 75 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72  ure for this par
1c980 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c  ser */.  int *pl
1c990 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  ineno,          
1c9a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c9b0 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  to the line numb
1c9c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c  er */.  int mhfl
1c9d0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
1c9e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67      /* True if g
1c9f0 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65  enerating makehe
1ca00 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a  aders output */.
1ca10 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  ){.  int lineno 
1ca20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f  = *plineno;    /
1ca30 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  * The line numbe
1ca40 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  r of the output 
1ca50 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65  */.  char **type
1ca60 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1ca70 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f  * A hash table o
1ca80 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20  f datatypes */. 
1ca90 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20   int arraysize; 
1caa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1cab0 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73  ze of the "types
1cac0 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  " array */.  int
1cad0 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20   maxdtlength;   
1cae0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1caf0 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20  m length of any 
1cb00 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c  ".datatype" fiel
1cb10 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  d. */.  char *st
1cb20 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddt;            
1cb30 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65    /* Standardize
1cb40 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74  d name for a dat
1cb50 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  atype */.  int i
1cb60 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ,j;             
1cb70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1cb80 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67  nters */.  unsig
1cb90 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20 20 20  ned hash;       
1cba0 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68       /* For hash
1cbb0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1cbc0 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73  a type */.  cons
1cbd0 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20  t char *name;   
1cbe0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cbf0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a   the parser */..
1cc00 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
1cc10 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70  d initialize typ
1cc20 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74  es[] and allocat
1cc30 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61  e stddt[] */.  a
1cc40 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d  rraysize = lemp-
1cc50 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20  >nsymbol * 2;.  
1cc60 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  types = (char**)
1cc70 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a  calloc( arraysiz
1cc80 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  e, sizeof(char*)
1cc90 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
1cca0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1ccb0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
1ccc0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
1ccd0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1cce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1ccf0 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
1cd00 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
1cd10 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
1cd20 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
1cd30 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
1cd40 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  gth = lemonStrle
1cd50 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29  n(lemp->vartype)
1cd60 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1cd70 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1cd80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1cd90 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20  len;.    struct 
1cda0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1cdb0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1cdc0 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74     if( sp->datat
1cdd0 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ype==0 ) continu
1cde0 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  e;.    len = lem
1cdf0 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74  onStrlen(sp->dat
1ce00 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  atype);.    if( 
1ce10 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20  len>maxdtlength 
1ce20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20  ) maxdtlength = 
1ce30 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74  len;.  }.  stddt
1ce40 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1ce50 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20  ( maxdtlength*2 
1ce60 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74 64  + 1 );.  if( std
1ce70 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  dt==0 ){.    fpr
1ce80 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
1ce90 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
1cea0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1ceb0 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20  }..  /* Build a 
1cec0 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
1ced0 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64  tatypes. The ".d
1cee0 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
1cef0 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20  ach symbol.  ** 
1cf00 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
1cf10 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78  h the hash index
1cf20 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74   plus 1.  A ".dt
1cf30 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20  num" value of 0 
1cf40 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  is.  ** used for
1cf50 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
1cf60 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
1cf70 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65  no %default_type
1cf80 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20   defined then.  
1cf90 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65  ** 0 is also use
1cfa0 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20  d as the .dtnum 
1cfb0 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72  value for nonter
1cfc0 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20  minals which do 
1cfd0 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a  not specify.  **
1cfe0 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e   a datatype usin
1cff0 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65  g the %type dire
1d000 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ctive..  */.  fo
1d010 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d020 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1d030 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1d040 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1d050 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72  ols[i];.    char
1d060 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70   *cp;.    if( sp
1d070 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  ==lemp->errsym )
1d080 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
1d090 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b  m = arraysize+1;
1d0a0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1d0b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1d0c0 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d  p->type!=NONTERM
1d0d0 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74  INAL || (sp->dat
1d0e0 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70  atype==0 && lemp
1d0f0 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b  ->vartype==0) ){
1d100 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1d110 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
1d120 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1d130 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70  cp = sp->datatyp
1d140 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30  e;.    if( cp==0
1d150 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61   ) cp = lemp->va
1d160 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30  rtype;.    j = 0
1d170 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 53 53  ;.    while( ISS
1d180 50 41 43 45 28 2a 63 70 29 20 29 20 63 70 2b 2b  PACE(*cp) ) cp++
1d190 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70  ;.    while( *cp
1d1a0 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20   ) stddt[j++] = 
1d1b0 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  *cp++;.    while
1d1c0 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41 43 45  ( j>0 && ISSPACE
1d1d0 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a  (stddt[j-1]) ) j
1d1e0 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d  --;.    stddt[j]
1d1f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 65   = 0;.    if( le
1d200 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26  mp->tokentype &&
1d210 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20 6c   strcmp(stddt, l
1d220 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d  emp->tokentype)=
1d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1d240 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
1d250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1d260 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20  .    hash = 0;. 
1d270 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64     for(j=0; stdd
1d280 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
1d290 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33    hash = hash*53
1d2a0 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20   + stddt[j];.   
1d2b0 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68   }.    hash = (h
1d2c0 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66  ash & 0x7fffffff
1d2d0 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20  )%arraysize;.   
1d2e0 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61   while( types[ha
1d2f0 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sh] ){.      if(
1d300 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61   strcmp(types[ha
1d310 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b  sh],stddt)==0 ){
1d320 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  .        sp->dtn
1d330 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
1d340 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d350 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68      }.      hash
1d360 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  ++;.      if( ha
1d370 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29 61 72  sh>=(unsigned)ar
1d380 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d  raysize ) hash =
1d390 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d3a0 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
1d3b0 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1d3c0 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a  num = hash + 1;.
1d3d0 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68        types[hash
1d3e0 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  ] = (char*)mallo
1d3f0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73  c( lemonStrlen(s
1d400 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
1d410 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
1d420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1d430 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1d440 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1d450 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
1d460 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1d470 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 74    lemon_strcpy(t
1d480 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1d490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d4a0 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65  /* Print out the
1d4b0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59   definition of Y
1d4c0 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59  YTOKENTYPE and Y
1d4d0 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20  YMINORTYPE */.  
1d4e0 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
1d4f0 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
1d500 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65   "Parse";.  line
1d510 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20  no = *plineno;. 
1d520 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
1d530 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1d540 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1d550 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72  ineno++; }.  fpr
1d560 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1d570 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73  e %sTOKENTYPE %s
1d580 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65  \n",name,.    le
1d590 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65  mp->tokentype?le
1d5a0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76  mp->tokentype:"v
1d5b0 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  oid*");  lineno+
1d5c0 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1d5d0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1d5e0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1d5f0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
1d600 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75  f(out,"typedef u
1d610 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  nion {\n"); line
1d620 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1d630 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e 69  out,"  int yyini
1d640 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t;\n"); lineno++
1d650 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1d660 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79  "  %sTOKENTYPE y
1d670 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  y0;\n",name); li
1d680 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1d690 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20  0; i<arraysize; 
1d6a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79  i++){.    if( ty
1d6b0 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  pes[i]==0 ) cont
1d6c0 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1d6d0 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64  f(out,"  %s yy%d
1d6e0 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b  ;\n",types[i],i+
1d6f0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1d700 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29    free(types[i])
1d710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  ;.  }.  if( lemp
1d720 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1d730 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1d740 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b  out,"  int yy%d;
1d750 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1d760 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1d770 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73  ++;.  }.  free(s
1d780 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79  tddt);.  free(ty
1d790 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  pes);.  fprintf(
1d7a0 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59  out,"} YYMINORTY
1d7b0 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PE;\n"); lineno+
1d7c0 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20  +;.  *plineno = 
1d7d0 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lineno;.}../*.**
1d7e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1d7f0 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65   of a C datatype
1d800 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65   able to represe
1d810 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  nt values betwee
1d820 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72  n.** lwr and upr
1d830 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 49 66  , inclusive.  If
1d840 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20 74 68   pnByte!=NULL th
1d850 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  en also write th
1d860 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20  e sizeof.** for 
1d870 74 68 61 74 20 74 79 70 65 20 28 31 2c 20 32 2c  that type (1, 2,
1d880 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70 6e 42   or 4) into *pnB
1d890 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  yte..*/.static c
1d8a0 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1d8b0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1d8c0 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69   lwr, int upr, i
1d8d0 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 63  nt *pnByte){.  c
1d8e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1d8f0 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e 74 20   = "int";.  int 
1d900 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28  nByte = 4;.  if(
1d910 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69   lwr>=0 ){.    i
1d920 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20  f( upr<=255 ){. 
1d930 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1d940 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1d950 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20      nByte = 1;. 
1d960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72     }else if( upr
1d970 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20  <65535 ){.      
1d980 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1d990 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20  d short int";.  
1d9a0 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20      nByte = 2;. 
1d9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9c0 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1d9d0 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42  d int";.      nB
1d9e0 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  yte = 4;.    }. 
1d9f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1da00 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
1da10 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
1da20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
1da30 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20     nByte = 1;.  
1da40 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1da50 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
1da60 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  67 ){.    zType 
1da70 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20 20 6e  = "short";.    n
1da80 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a 20 20  Byte = 2;.  }.  
1da90 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
1daa0 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Byte = nByte;.  
1dab0 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
1dac0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74  ./*.** Each stat
1dad0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74  e contains a set
1dae0 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61   of token transa
1daf0 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20  ction and a set 
1db00 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61  of.** nontermina
1db10 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  l transactions. 
1db20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73   Each of these s
1db30 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73  ets makes an ins
1db40 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
1db50 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1db60 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f  ure.  An array o
1db70 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
1db80 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  es is used.** to
1db90 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74   order the creat
1dba0 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ion of entries i
1dbb0 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  n the yy_action[
1dbc0 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  ] table..*/.stru
1dbd0 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72  ct axset {.  str
1dbe0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1dbf0 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74    /* A pointer t
1dc00 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  o a state */.  i
1dc10 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20  nt isTkn;       
1dc20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
1dc30 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73  se tokens.  Fals
1dc40 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e  e for non-termin
1dc50 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  als */.  int nAc
1dc60 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  tion;         /*
1dc70 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
1dc80 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64  ns */.  int iOrd
1dc90 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
1dca0 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f  Original order o
1dcb0 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f  f action sets */
1dcc0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .};../*.** Compa
1dcd0 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75  re to axset stru
1dce0 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69  ctures for sorti
1dcf0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
1dd00 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f  tatic int axset_
1dd10 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  compare(const vo
1dd20 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1dd30 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20  d *b){.  struct 
1dd40 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72  axset *p1 = (str
1dd50 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20  uct axset*)a;.  
1dd60 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32  struct axset *p2
1dd70 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1dd80 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *)b;.  int c;.  
1dd90 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20  c = p2->nAction 
1dda0 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20  - p1->nAction;. 
1ddb0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1ddc0 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65 72 20   c = p1->iOrder 
1ddd0 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a 20 20  - p2->iOrder;.  
1dde0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d 30  }.  assert( c!=0
1ddf0 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20   || p1==p2 );.  
1de00 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
1de10 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e  ** Write text on
1de20 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63   "out" that desc
1de30 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22  ribes the rule "
1de40 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rp"..*/.static v
1de50 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78  oid writeRuleTex
1de60 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72  t(FILE *out, str
1de70 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
1de80 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74   int j;.  fprint
1de90 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20  f(out,"%s ::=", 
1dea0 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
1deb0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
1dec0 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nrhs; j++){.   
1ded0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1dee0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b  sp = rp->rhs[j];
1def0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
1df00 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
1df10 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1df20 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
1df30 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  >name);.    }els
1df40 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  e{.      int k;.
1df50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1df60 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62  t," %s", sp->sub
1df70 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[0]->name);. 
1df80 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1df90 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
1dfa0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1dfb0 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d  tf(out,"|%s",sp-
1dfc0 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65  >subsym[k]->name
1dfd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1dfe0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1dff0 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f  rate C source co
1e000 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
1e010 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1e020 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20  Table(.  struct 
1e030 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69  lemon *lemp,.  i
1e040 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a  nt mhflag     /*
1e050 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68   Output in makeh
1e060 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66  eaders format if
1e070 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49   true */.){.  FI
1e080 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20  LE *out, *in;.  
1e090 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
1e0a0 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65  ZE];.  int  line
1e0b0 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  no;.  struct sta
1e0c0 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
1e0d0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
1e0e0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1e0f0 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62  .  struct acttab
1e100 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74   *pActtab;.  int
1e110 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20   i, j, n, sz;.  
1e120 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79 70 65  int szActionType
1e130 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28  ;     /* sizeof(
1e140 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20 2a 2f  YYACTIONTYPE) */
1e150 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54 79 70  .  int szCodeTyp
1e160 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65  e;       /* size
1e170 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29 20 20  of(YYCODETYPE)  
1e180 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e190 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e   *name;.  int mn
1e1a0 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66  TknOfst, mxTknOf
1e1b0 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66  st;.  int mnNtOf
1e1c0 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20  st, mxNtOfst;.  
1e1d0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78  struct axset *ax
1e1e0 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f  ;..  in = tplt_o
1e1f0 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28  pen(lemp);.  if(
1e200 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
1e210 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
1e220 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62  en(lemp,".c","wb
1e230 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
1e240 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69   ){.    fclose(i
1e250 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
1e260 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31    }.  lineno = 1
1e270 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e280 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e290 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e2a0 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63  Generate the inc
1e2b0 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e  lude code, if an
1e2c0 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  y */.  tplt_prin
1e2d0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1e2e0 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f  >include,&lineno
1e2f0 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  );.  if( mhflag 
1e300 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e 63  ){.    char *inc
1e310 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  Name = file_make
1e320 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29  name(lemp, ".h")
1e330 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e340 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73  t,"#include \"%s
1e350 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29 3b  \"\n", incName);
1e360 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1e370 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20 20  ree(incName);.  
1e380 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1e390 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e3a0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e3b0 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65  Generate #define
1e3c0 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73  s for all tokens
1e3d0 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67   */.  if( mhflag
1e3e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1e3f0 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
1e400 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
1e410 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
1e420 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
1e430 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1e440 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1e450 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1e460 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1e480 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
1e490 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1e4a0 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1e4b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1e4c0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1e4d0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1e4e0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1e4f0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1e500 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
1e510 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
1e520 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1e530 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1e540 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e550 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e560 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e570 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
1e580 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1e590 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44  t,"#define YYCOD
1e5a0 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  ETYPE %s\n",.   
1e5b0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1e5c0 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d  pe(0, lemp->nsym
1e5d0 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54 79  bol+1, &szCodeTy
1e5e0 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  pe)); lineno++;.
1e5f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e600 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20  define YYNOCODE 
1e610 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d  %d\n",lemp->nsym
1e620 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b  bol+1);  lineno+
1e630 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1e640 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49  ,"#define YYACTI
1e650 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  ONTYPE %s\n",.  
1e660 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1e670 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6e 73 74 61  ype(0,lemp->nsta
1e680 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32  te+lemp->nrule*2
1e690 2b 35 2c 26 73 7a 41 63 74 69 6f 6e 54 79 70 65  +5,&szActionType
1e6a0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1e6b0 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1e6c0 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1e6d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1e6e0 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1e6f0 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1e700 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1e710 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1e720 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1e730 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1e740 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1e750 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1e760 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1e770 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1e780 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1e790 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1e7a0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e7b0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1e7c0 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1e7d0 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1e7e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1e7f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e800 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1e810 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1e820 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1e830 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1e840 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1e850 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1e860 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e870 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1e880 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1e890 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1e8a0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1e8b0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1e8c0 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1e8d0 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1e8e0 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72      i = lemonStr
1e8f0 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
1e900 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
1e910 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d 70 2d  && ISSPACE(lemp-
1e920 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
1e930 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1e940 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c 65  1 && (ISALNUM(le
1e950 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
1e960 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
1e970 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
1e980 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1e990 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43  efine %sARG_SDEC
1e9a0 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
1e9b0 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1e9c0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1e9d0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1e9e0 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22  ARG_PDECL ,%s\n"
1e9f0 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1ea00 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ea10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ea20 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1ea30 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72  H %s = yypParser
1ea40 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1ea50 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
1ea60 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
1ea70 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
1ea80 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1ea90 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1eaa0 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
1eab0 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a  er->%s = %s\n",.
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
1eae0 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
1eaf0 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1eb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
1eb10 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1eb20 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
1eb30 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1eb40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1eb50 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1eb60 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _PDECL\n",name);
1eb70 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1eb80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1eb90 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1eba0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1ebb0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1ebc0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1ebd0 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d  ARG_STORE\n",nam
1ebe0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1ebf0 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
1ec00 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1ec10 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1ec20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1ec30 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  f( lemp->errsym-
1ec40 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1ec50 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ec60 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f  ine YYERRORSYMBO
1ec70 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  L %d\n",lemp->er
1ec80 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  rsym->index); li
1ec90 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1eca0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1ecb0 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1ecc0 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1ecd0 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1ece0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1ecf0 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1ed00 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1ed10 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
1ed20 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
1ed30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20  lineno++;.  }.. 
1ed40 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1ed50 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62 75  action table, bu
1ed60 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20  t do not output 
1ed70 69 74 20 79 65 74 2e 20 20 54 68 65 20 61 63 74  it yet.  The act
1ed80 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6d  ion.  ** table m
1ed90 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64 20  ust be computed 
1eda0 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69 6e  before generatin
1edb0 67 20 74 68 65 20 59 59 4e 53 54 41 54 45 20 6d  g the YYNSTATE m
1edc0 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20 2a  acro because.  *
1edd0 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  * we need to kno
1ede0 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74 65  w how many state
1edf0 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e 61  s can be elimina
1ee00 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20 3d  ted..  */.  ax =
1ee10 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20 2a   (struct axset *
1ee20 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e  ) calloc(lemp->n
1ee30 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  xstate*2, sizeof
1ee40 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  (ax[0]));.  if( 
1ee50 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ax==0 ){.    fpr
1ee60 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
1ee70 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
1ee80 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1ee90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1eea0 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b  mp->nxstate; i++
1eeb0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1eec0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1eed0 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20    ax[i*2].stp = 
1eee0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  stp;.    ax[i*2]
1eef0 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20  .isTkn = 1;.    
1ef00 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20  ax[i*2].nAction 
1ef10 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a  = stp->nTknAct;.
1ef20 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74      ax[i*2+1].st
1ef30 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1ef40 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30  i*2+1].isTkn = 0
1ef50 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1ef60 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1ef70 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54  NtAct;.  }.  mxT
1ef80 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  knOfst = mnTknOf
1ef90 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66  st = 0;.  mxNtOf
1efa0 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st = mnNtOfst = 
1efb0 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65 66  0;.  /* In an ef
1efc0 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  fort to minimize
1efd0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1efe0 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65 20  e size, use the 
1eff0 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20 6f  heuristic.  ** o
1f000 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
1f010 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65 74  rgest action set
1f020 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f 72  s first */.  for
1f030 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78  (i=0; i<lemp->nx
1f040 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78  state*2; i++) ax
1f050 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a  [i].iOrder = i;.
1f060 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70    qsort(ax, lemp
1f070 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a  ->nxstate*2, siz
1f080 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65  eof(ax[0]), axse
1f090 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41  t_compare);.  pA
1f0a0 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61  cttab = acttab_a
1f0b0 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
1f0c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61  0; i<lemp->nxsta
1f0d0 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41  te*2 && ax[i].nA
1f0e0 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20  ction>0; i++){. 
1f0f0 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73     stp = ax[i].s
1f100 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69  tp;.    if( ax[i
1f110 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20  ].isTkn ){.     
1f120 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1f130 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1f140 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1f150 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1f160 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1f170 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
1f180 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1f190 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1f1a0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f1b0 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1f1c0 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1f1d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f1e0 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1f1f0 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1f200 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1f210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f220 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61  tp->iTknOfst = a
1f230 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1f240 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1f250 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
1f260 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
1f270 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1f280 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1f290 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
1f2a0 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
1f2b0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1f2c0 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
1f2d0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
1f2e0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1f2f0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1f300 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
1f310 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1f320 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
1f330 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1f340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1f350 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
1f360 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
1f370 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1f380 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
1f390 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1f3a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
1f3b0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
1f3c0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
1f3d0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
1f3e0 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
1f3f0 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
1f400 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
1f410 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1f420 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1f430 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
1f440 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
1f450 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
1f460 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
1f470 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1f480 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
1f490 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1f4a0 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30  fst;.    }.#if 0
1f4b0 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20 66    /* Uncomment f
1f4c0 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20 68 6f  or a trace of ho
1f4d0 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  w the yy_action[
1f4e0 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f 75  ] table fills ou
1f4f0 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20 6a  t */.    { int j
1f500 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f 72  j, nn;.      for
1f510 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63  (jj=nn=0; jj<pAc
1f520 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a  ttab->nAction; j
1f530 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1f540 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74 69  ( pActtab->aActi
1f550 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20  on[jj].action<0 
1f560 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) nn++;.      }.
1f570 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34        printf("%4
1f580 64 3a 20 53 74 61 74 65 20 25 33 64 20 25 73 20  d: State %3d %s 
1f590 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35 64  n: %2d size: %5d
1f5a0 20 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c 6e   freespace: %d\n
1f5b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f5c0 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  i, stp->statenum
1f5d0 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20  , ax[i].isTkn ? 
1f5e0 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20 20  "Token" : "Var  
1f5f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f600 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70  ax[i].nAction, p
1f610 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c  Acttab->nAction,
1f620 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   nn);.    }.#end
1f630 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78  if.  }.  free(ax
1f640 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72 75  );..  /* Mark ru
1f650 6c 65 73 20 74 68 61 74 20 61 72 65 20 61 63 74  les that are act
1f660 75 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20 72  ually used for r
1f670 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61 66  educe actions af
1f680 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74  ter all.  ** opt
1f690 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65 20  imizations have 
1f6a0 62 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20 2a  been applied.  *
1f6b0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1f6c0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1f6d0 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65 73  ->next) rp->does
1f6e0 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
1f6f0 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
1f700 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
1f710 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
1f720 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
1f730 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
1f740 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1f750 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
1f760 44 55 43 45 20 7c 7c 20 61 70 2d 3e 74 79 70 65  DUCE || ap->type
1f770 3d 3d 53 48 49 46 54 52 45 44 55 43 45 20 29 7b  ==SHIFTREDUCE ){
1f780 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e 72  .        ap->x.r
1f790 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d 20  p->doesReduce = 
1f7a0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
1f7b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73  .  }..  /* Finis
1f7c0 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65 20  h rendering the 
1f7d0 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74 68  constants now th
1f7e0 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  at the action ta
1f7f0 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ble has.  ** bee
1f800 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20  n computed */.  
1f810 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f820 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20 20  fine YYNSTATE   
1f830 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
1f840 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b 20  lemp->nxstate); 
1f850 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f860 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f870 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20 20  e YYNRULE       
1f880 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
1f890 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
1f8a0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1f8b0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1f8c0 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20 20 20  MAX_SHIFT       
1f8d0 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78    %d\n",lemp->nx
1f8e0 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f  state-1); lineno
1f8f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1f900 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49  t,"#define YY_MI
1f910 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20  N_SHIFTREDUCE   
1f920 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61  %d\n",lemp->nsta
1f930 74 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  te); lineno++;. 
1f940 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   i = lemp->nstat
1f950 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
1f960 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1f970 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53  #define YY_MAX_S
1f980 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c  HIFTREDUCE   %d\
1f990 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", i-1); lineno
1f9a0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1f9b0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49  t,"#define YY_MI
1f9c0 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  N_REDUCE        
1f9d0 25 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e  %d\n", i); linen
1f9e0 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d  o++;.  i = lemp-
1f9f0 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1fa00 6e 72 75 6c 65 2a 32 3b 0a 20 20 66 70 72 69 6e  nrule*2;.  fprin
1fa10 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1fa20 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20 20  YY_MAX_REDUCE   
1fa30 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29       %d\n", i-1)
1fa40 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1fa50 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1fa60 6e 65 20 59 59 5f 45 52 52 4f 52 5f 41 43 54 49  ne YY_ERROR_ACTI
1fa70 4f 4e 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  ON      %d\n", i
1fa80 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1fa90 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1faa0 69 6e 65 20 59 59 5f 41 43 43 45 50 54 5f 41 43  ine YY_ACCEPT_AC
1fab0 54 49 4f 4e 20 20 20 20 20 25 64 5c 6e 22 2c 20  TION     %d\n", 
1fac0 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
1fad0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fae0 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41 43 54  define YY_NO_ACT
1faf0 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64 5c 6e  ION         %d\n
1fb00 22 2c 20 69 2b 32 29 3b 20 6c 69 6e 65 6e 6f 2b  ", i+2); lineno+
1fb10 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
1fb20 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1fb30 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1fb40 20 4e 6f 77 20 6f 75 74 70 75 74 20 74 68 65 20   Now output the 
1fb50 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64  action table and
1fb60 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 73 3a   its associates:
1fb70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61  .  **.  **  yy_a
1fb80 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41  ction[]        A
1fb90 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f   single table co
1fba0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74  ntaining all act
1fbb0 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c  ions..  **  yy_l
1fbc0 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20 41  ookahead[]     A
1fbd0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1fbe0 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  g the lookahead 
1fbf0 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 69  for each entry i
1fc00 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  n.  **          
1fc10 20 20 20 20 20 20 20 20 20 20 20 79 79 5f 61 63             yy_ac
1fc20 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f 20 64  tion.  Used to d
1fc30 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c 6c 69  etect hash colli
1fc40 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  sions..  **  yy_
1fc50 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20  shift_ofst[]    
1fc60 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1fc70 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1fc80 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1fc90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fca0 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1fcb0 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20  terminals..  ** 
1fcc0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1fcd0 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61  ]   For each sta
1fce0 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1fcf0 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1fd00 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1fd10 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1fd20 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ing non-terminal
1fd30 73 20 61 66 74 65 72 20 61 20 72 65 64 75 63 65  s after a reduce
1fd40 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66 61 75  ..  **  yy_defau
1fd50 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66 61 75  lt[]       Defau
1fd60 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  lt action for ea
1fd70 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a  ch state..  */..
1fd80 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1fd90 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1fda0 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 61 63 74 69  */.  lemp->nacti
1fdb0 6f 6e 74 61 62 20 3d 20 6e 20 3d 20 61 63 74 74  ontab = n = actt
1fdc0 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29  ab_size(pActtab)
1fdd0 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
1fde0 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
1fdf0 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  nType;.  fprintf
1fe00 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fe10 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
1fe20 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
1fe30 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1fe40 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1fe50 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1fe60 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
1fe70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1fe80 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1fe90 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
1fea0 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
1feb0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
1fec0 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
1fed0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
1fee0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1fef0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
1ff00 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1ff10 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1ff20 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1ff30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1ff40 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
1ff50 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1ff60 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1ff70 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1ff80 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ff90 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1ffa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1ffb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1ffc0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1ffd0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1ffe0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1fff0 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
20000 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c   */.  lemp->tabl
20010 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64  esize += n*szCod
20020 65 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  eType;.  fprintf
20030 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
20040 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79 79  st YYCODETYPE yy
20050 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b  _lookahead[] = {
20060 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20070 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
20080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
20090 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f  la = acttab_yylo
200a0 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62 2c  okahead(pActtab,
200b0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c   i);.    if( la<
200c0 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e  0 ) la = lemp->n
200d0 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20  symbol;.    if( 
200e0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
200f0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
20100 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
20110 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
20120 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  la);.    if( j==
20130 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
20140 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
20150 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
20160 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
20170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20180 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
20190 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
201a0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
201b0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
201c0 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  he yy_shift_ofst
201d0 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20  [] table */.  n 
201e0 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  = lemp->nxstate;
201f0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
20200 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d   lemp->sorted[n-
20210 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f  1]->iTknOfst==NO
20220 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
20230 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
20240 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
20250 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
20260 2c 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74  , lemp->nactiont
20270 61 62 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ab); lineno++;. 
20280 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
20290 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
202a0 43 4f 55 4e 54 20 20 20 20 28 25 64 29 5c 6e 22  COUNT    (%d)\n"
202b0 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , n-1); lineno++
202c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
202d0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
202e0 46 54 5f 4d 49 4e 20 20 20 20 20 20 28 25 64 29  FT_MIN      (%d)
202f0 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b  \n", mnTknOfst);
20300 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
20310 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
20320 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20  ne YY_SHIFT_MAX 
20330 20 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78       (%d)\n", mx
20340 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  TknOfst); lineno
20350 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
20360 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
20370 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73   %s yy_shift_ofs
20380 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20  t[] = {\n", .   
20390 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
203a0 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2c  _type(mnTknOfst,
203b0 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c   lemp->nterminal
203c0 2b 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61  +lemp->nactionta
203d0 62 2c 20 26 73 7a 29 29 3b 0a 20 20 20 20 20 20  b, &sz));.      
203e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d   lineno++;.  lem
203f0 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20  p->tablesize += 
20400 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  n*sz;.  for(i=j=
20410 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
20420 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
20430 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
20440 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
20450 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
20460 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
20470 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
20480 3d 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74  = lemp->nactiont
20490 61 62 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ab;.    if( j==0
204a0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
204b0 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
204c0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
204d0 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
204e0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
204f0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
20500 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20510 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
20520 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
20530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
20540 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
20550 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
20560 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20570 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
20580 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
20590 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
205a0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
205b0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53 45  ne YY_REDUCE_USE
205c0 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
205d0 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  nNtOfst-1); line
205e0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
205f0 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69  ->nxstate;.  whi
20600 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
20610 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e  >sorted[n-1]->iN
20620 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  tOfst==NO_OFFSET
20630 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
20640 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
20650 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20  YY_REDUCE_COUNT 
20660 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
20670 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20680 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
20690 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20   YY_REDUCE_MIN  
206a0 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
206b0 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  st); lineno++;. 
206c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
206d0 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
206e0 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
206f0 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mxNtOfst); linen
20700 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
20710 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
20720 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f  t %s yy_reduce_o
20730 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
20740 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
20750 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f  _size_type(mnNtO
20760 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c  fst-1, mxNtOfst,
20770 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   &sz)); lineno++
20780 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
20790 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66  ize += n*sz;.  f
207a0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
207b0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
207c0 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
207d0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
207e0 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e    ofst = stp->iN
207f0 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  tOfst;.    if( o
20800 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
20810 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74   ofst = mnNtOfst
20820 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
20830 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
20840 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
20850 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
20860 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
20870 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
20880 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
20890 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
208a0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
208b0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
208c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208d0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
208e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
208f0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
20900 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
20910 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
20920 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
20930 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
20940 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
20950 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b  TYPE yy_default[
20960 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
20970 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
20980 3e 6e 78 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70  >nxstate;.  lemp
20990 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
209a0 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20  *szActionType;. 
209b0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
209c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
209d0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
209e0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
209f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
20a00 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
20a10 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20a20 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69   " %4d,", stp->i
20a30 44 66 6c 74 52 65 64 75 63 65 2b 6c 65 6d 70 2d  DfltReduce+lemp-
20a40 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72  >nstate+lemp->nr
20a50 75 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  ule);.    if( j=
20a60 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
20a70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
20a80 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
20a90 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
20aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ab0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
20ac0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
20ad0 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
20ae0 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
20af0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
20b00 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
20b10 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
20b20 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
20b30 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
20b40 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
20b50 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  lback ){.    int
20b60 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72   mx = lemp->nter
20b70 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77  minal - 1;.    w
20b80 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c 65  hile( mx>0 && le
20b90 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d  mp->symbols[mx]-
20ba0 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20  >fallback==0 ){ 
20bb0 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65 6d 70  mx--; }.    lemp
20bc0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 28  ->tablesize += (
20bd0 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79 70 65  mx+1)*szCodeType
20be0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20bf0 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <=mx; i++){.    
20c00 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
20c10 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
20c20 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
20c30 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
20c40 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
20c50 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
20c60 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
20c70 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
20c80 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
20c90 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
20ca0 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
20cb0 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
20cc0 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
20cd0 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
20ce0 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
20cf0 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
20d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
20d10 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
20d20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
20d30 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
20d40 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
20d50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
20d60 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
20d70 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
20d80 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
20d90 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
20da0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
20db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f  ; i++){.    lemo
20dc0 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22  n_sprintf(line,"
20dd0 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
20de0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
20df0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20e00 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
20e10 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
20e20 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
20e30 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
20e40 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
20e50 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
20e60 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
20e70 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
20e80 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
20e90 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
20ea0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
20eb0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
20ec0 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
20ed0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
20ee0 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
20ef0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
20f00 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
20f10 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
20f20 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
20f30 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
20f40 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
20f50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
20f60 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
20f70 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
20f80 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
20f90 72 70 2d 3e 69 52 75 6c 65 3d 3d 69 20 29 3b 0a  rp->iRule==i );.
20fa0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20fb0 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c  " /* %3d */ \"",
20fc0 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75   i);.    writeRu
20fd0 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
20fe0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20ff0 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
21000 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
21010 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
21020 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
21030 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
21040 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
21050 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
21060 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
21070 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
21080 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
21090 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
210a0 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
210b0 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
210c0 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
210d0 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
210e0 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
210f0 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
21100 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
21110 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  t ){.    int onc
21120 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
21130 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
21140 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
21150 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
21160 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
21170 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
21180 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
21190 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63  pe!=TERMINAL ) c
211a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
211b0 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
211c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
211d0 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e  "      /* TERMIN
211e0 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
211f0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
21200 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
21210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21220 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
21230 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
21240 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
21250 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
21260 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
21270 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
21280 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d  ->nsymbol && lem
21290 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74  p->symbols[i]->t
212a0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69  ype!=TERMINAL; i
212b0 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c  ++);.    if( i<l
212c0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
212d0 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
212e0 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
212f0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
21300 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
21310 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21320 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
21330 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21340 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65    }.  }.  if( le
21350 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
21360 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
21370 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20   *dflt_sp = 0;. 
21380 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
21390 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
213a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
213b0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
213c0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
213d0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
213e0 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
213f0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
21400 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20  RMINAL ||.      
21410 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30      sp->index<=0
21420 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
21430 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or!=0 ) continue
21440 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
21450 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
21460 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20  ntf(out, "      
21470 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54  /* Default NON-T
21480 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74  ERMINAL Destruct
21490 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e  or */\n"); linen
214a0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63  o++;.        onc
214b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
214c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
214d0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
214e0 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e  * %s */\n", sp->
214f0 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
21500 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
21510 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
21520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
21530 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
21540 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
21550 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
21560 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
21570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
21580 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
21590 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
215a0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  o++;.  }.  for(i
215b0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
215c0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
215d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
215e0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
215f0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  [i];.    if( sp=
21600 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
21610 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
21620 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20  destructor==0 ) 
21630 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
21640 28 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  ( sp->destLineno
21650 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  <0 ) continue;  
21660 2f 2a 20 41 6c 72 65 61 64 79 20 65 6d 69 74 74  /* Already emitt
21670 65 64 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74  ed */.    fprint
21680 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
21690 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
216a0 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
216b0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
216c0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
216d0 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
216e0 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
216f0 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
21700 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
21710 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
21720 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
21730 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
21740 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
21750 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
21760 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
21770 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
21780 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
21790 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
217a0 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
217b0 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
217c0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
217d0 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
217e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
217f0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
21800 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
21810 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21820 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
21830 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
21840 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
21850 20 73 70 32 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f   sp2->destLineno
21860 20 3d 20 2d 31 3b 20 20 2f 2a 20 41 76 6f 69 64   = -1;  /* Avoid
21870 20 65 6d 69 74 74 69 6e 67 20 74 68 69 73 20 64   emitting this d
21880 65 73 74 72 75 63 74 6f 72 20 61 67 61 69 6e 20  estructor again 
21890 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
218a0 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72  ..    emit_destr
218b0 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
218c0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
218d0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
218e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
218f0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
21900 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
21910 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
21920 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
21930 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
21940 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
21950 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
21960 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73  ver the parser s
21970 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a  tack overflows *
21980 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
21990 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76  ut,lemp,lemp->ov
219a0 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b  erflow,&lineno);
219b0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
219c0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
219d0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
219e0 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c  enerate the tabl
219f0 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d  e of rule inform
21a00 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ation .  **.  **
21a10 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65   Note: This code
21a20 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
21a30 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73 20  fact that rules 
21a40 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  are number.  ** 
21a50 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67  sequentually beg
21a60 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20  inning with 0.. 
21a70 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
21a80 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
21a90 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66  rp->next){.    f
21aa0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20  printf(out,"  { 
21ab0 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d  %d, %d },\n",rp-
21ac0 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e  >lhs->index,rp->
21ad0 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  nrhs); lineno++;
21ae0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
21af0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
21b00 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
21b10 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
21b20 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e   which execution
21b30 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44   during each RED
21b40 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  UCE action */.  
21b50 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70 3d  i = 0;.  for(rp=
21b60 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
21b70 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
21b80 20 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74 65    i += translate
21b90 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b  _code(lemp, rp);
21ba0 0a 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b 0a  .  }.  if( i ){.
21bb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21bc0 22 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f 52  "        YYMINOR
21bd0 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b  TYPE yylhsminor;
21be0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
21bf0 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f    }.  /* First o
21c00 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65  utput rules othe
21c10 72 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75  r than the defau
21c20 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f  lt: rule */.  fo
21c30 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
21c40 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
21c50 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  ){.    struct ru
21c60 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20  le *rp2;        
21c70 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20         /* Other 
21c80 72 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73  rules with the s
21c90 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ame action */.  
21ca0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d    if( rp->codeEm
21cb0 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  itted ) continue
21cc0 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f  ;.    if( rp->no
21cd0 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Code ){.      /*
21ce0 20 4e 6f 20 43 20 63 6f 64 65 20 61 63 74 69 6f   No C code actio
21cf0 6e 73 2c 20 73 6f 20 74 68 69 73 20 77 69 6c 6c  ns, so this will
21d00 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 20   be part of the 
21d10 22 64 65 66 61 75 6c 74 3a 22 20 72 75 6c 65 20  "default:" rule 
21d20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
21d30 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  e;.    }.    fpr
21d40 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
21d50 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72  case %d: /* ", r
21d60 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77  p->iRule);.    w
21d70 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
21d80 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
21d90 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29  tf(out, " */\n")
21da0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
21db0 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74  for(rp2=rp->next
21dc0 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e  ; rp2; rp2=rp2->
21dd0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
21de0 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e   rp2->code==rp->
21df0 63 6f 64 65 20 26 26 20 72 70 32 2d 3e 63 6f 64  code && rp2->cod
21e00 65 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63 6f 64  ePrefix==rp->cod
21e10 65 50 72 65 66 69 78 0a 20 20 20 20 20 20 20 20  ePrefix.        
21e20 20 20 20 20 20 26 26 20 72 70 32 2d 3e 63 6f 64       && rp2->cod
21e30 65 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63 6f 64  eSuffix==rp->cod
21e40 65 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20 20  eSuffix ){.     
21e50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21e60 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
21e70 2a 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29  * ", rp2->iRule)
21e80 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52  ;.        writeR
21e90 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32  uleText(out, rp2
21ea0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
21eb0 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65  tf(out," */ yyte
21ec0 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
21ed0 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69  =%d);\n", rp2->i
21ee0 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Rule); lineno++;
21ef0 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f  .        rp2->co
21f00 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  deEmitted = 1;. 
21f10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21f20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
21f30 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
21f40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21f50 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
21f60 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
21f70 20 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74      rp->codeEmit
21f80 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f  ted = 1;.  }.  /
21f90 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75  * Finally, outpu
21fa0 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72  t the default: r
21fb0 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20  ule.  We choose 
21fc0 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  as the default: 
21fd0 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61  all.  ** empty a
21fe0 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72  ctions. */.  fpr
21ff0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
22000 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69  default:\n"); li
22010 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70  neno++;.  for(rp
22020 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
22030 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
22040 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45     if( rp->codeE
22050 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  mitted ) continu
22060 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  e;.    assert( r
22070 70 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20 20 20  p->noCode );.   
22080 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
22090 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72      /* (%d) ", r
220a0 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77  p->iRule);.    w
220b0 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
220c0 2c 20 72 70 29 3b 0a 20 20 20 20 69 66 28 20 72  , rp);.    if( r
220d0 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 29 7b  p->doesReduce ){
220e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
220f0 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63  ut, " */ yytestc
22100 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
22110 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75 6c 65  );\n", rp->iRule
22120 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
22130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
22140 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 4f 50  rintf(out, " (OP
22150 54 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a 2f 20  TIMIZED OUT) */ 
22160 61 73 73 65 72 74 28 79 79 72 75 6c 65 6e 6f 21  assert(yyruleno!
22170 3d 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20  =%d);\n",.      
22180 20 20 20 20 20 20 20 20 72 70 2d 3e 69 52 75 6c          rp->iRul
22190 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
221a0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
221b0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
221c0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
221d0 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
221e0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
221f0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
22200 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
22210 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
22220 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73  if a parse fails
22230 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
22240 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
22250 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29  failure,&lineno)
22260 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
22270 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
22280 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
22290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
222a0 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
222b0 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  n a syntax error
222c0 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c   occurs */.  tpl
222d0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
222e0 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69  ,lemp->error,&li
222f0 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
22300 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
22310 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
22320 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
22330 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
22340 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
22350 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
22360 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
22370 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
22380 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e  p->accept,&linen
22390 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
223a0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
223b0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
223c0 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64  * Append any add
223d0 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75  ition code the u
223e0 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20  ser desires */. 
223f0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
22400 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61  lemp,lemp->extra
22410 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  code,&lineno);..
22420 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
22430 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72  fclose(out);.  r
22440 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  eturn;.}../* Gen
22450 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66  erate a header f
22460 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ile for the pars
22470 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
22480 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
22490 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
224a0 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
224b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
224c0 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e  efix;.  char lin
224d0 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63  e[LINESIZE];.  c
224e0 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45  har pattern[LINE
224f0 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  SIZE];.  int i;.
22500 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b  .  if( lemp->tok
22510 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69  enprefix ) prefi
22520 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  x = lemp->tokenp
22530 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20  refix;.  else   
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
22560 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  in = file_open(l
22570 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a  emp,".h","rb");.
22580 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
22590 69 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20 20  int nextChar;.  
225a0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
225b0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
225c0 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
225d0 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20  IZE,in); i++){. 
225e0 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
225f0 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66  tf(pattern,"#def
22600 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c  ine %s%-30s %3d\
22610 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22620 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 6c          prefix,l
22630 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
22640 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
22650 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c  if( strcmp(line,
22660 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b  pattern) ) break
22670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74  ;.    }.    next
22680 43 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29  Char = fgetc(in)
22690 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
226a0 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d  ;.    if( i==lem
226b0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
226c0 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b  nextChar==EOF ){
226d0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61  .      /* No cha
226e0 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  nge in the file.
226f0 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20    Don't rewrite 
22700 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  it. */.      ret
22710 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
22720 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
22730 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29  (lemp,".h","wb")
22740 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
22750 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
22760 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
22770 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
22780 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
22790 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 70  %s%-30s %3d\n",p
227a0 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
227b0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
227c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
227d0 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20  e(out);  .  }.  
227e0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
227f0 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66  duce the size of
22800 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
22810 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  es, if possible,
22820 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a   by making use.*
22830 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a  * of defaults..*
22840 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
22850 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68  sion, we take th
22860 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20  e most frequent 
22870 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e  REDUCE action an
22880 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65  d make.** it the
22890 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70   default.  Excep
228a0 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  t, there is no d
228b0 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69  efault if the wi
228c0 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ldcard token.** 
228d0 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f  is a possible lo
228e0 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69  ok-ahead..*/.voi
228f0 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
22900 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
22910 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
22920 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
22930 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
22940 20 2a 61 70 32 2c 20 2a 6e 65 78 74 61 70 3b 0a   *ap2, *nextap;.
22950 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
22960 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b  p, *rp2, *rbest;
22970 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b  .  int nbest, n;
22980 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
22990 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20  usesWildcard;.. 
229a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
229b0 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
229c0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
229d0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
229e0 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
229f0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  est = 0;.    use
22a00 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a  sWildcard = 0;..
22a10 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
22a20 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
22a30 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
22a40 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
22a50 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d  && ap->sp==lemp-
22a60 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
22a70 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72       usesWildcar
22a80 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
22a90 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
22aa0 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
22ab0 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
22ac0 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
22ad0 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72   if( rp->lhsStar
22ae0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
22af0 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
22b00 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
22b10 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
22b20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
22b30 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
22b40 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
22b50 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
22b60 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
22b70 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
22b80 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
22b90 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
22ba0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
22bb0 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
22bc0 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
22bd0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
22be0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
22bf0 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
22c00 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
22c10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
22c20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
22c30 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  a default if the
22c40 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   number of rules
22c50 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
22c60 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  ** is not at lea
22c70 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77  st 1 or if the w
22c80 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73  ildcard token is
22c90 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   a possible.    
22ca0 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20  ** lookahead..  
22cb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65    */.    if( nbe
22cc0 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64  st<1 || usesWild
22cd0 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  card ) continue;
22ce0 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ...    /* Combin
22cf0 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43  e matching REDUC
22d00 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61  E actions into a
22d10 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20   single default 
22d20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  */.    for(ap=st
22d30 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
22d40 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
22d50 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
22d60 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
22d70 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a  =rbest ) break;.
22d80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22d90 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e  ( ap );.    ap->
22da0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
22db0 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
22dc0 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78    for(ap=ap->nex
22dd0 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  t; ap; ap=ap->ne
22de0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
22df0 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
22e00 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
22e10 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20  st ) ap->type = 
22e20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a  NOT_USED;.    }.
22e30 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
22e40 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
22e50 70 29 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d  p);..    for(ap=
22e60 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
22e70 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
22e80 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53   if( ap->type==S
22e90 48 49 46 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  HIFT ) break;.  
22ea0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
22eb0 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e  ==REDUCE && ap->
22ec0 78 2e 72 70 21 3d 72 62 65 73 74 20 29 20 62 72  x.rp!=rbest ) br
22ed0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
22ee0 66 28 20 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( ap==0 ){.    
22ef0 20 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63    stp->autoReduc
22f00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 74 70  e = 1;.      stp
22f10 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 20 3d 20  ->pDfltReduce = 
22f20 72 62 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rbest;.    }.  }
22f30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65  ..  /* Make a se
22f40 63 6f 6e 64 20 70 61 73 73 20 6f 76 65 72 20 61  cond pass over a
22f50 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 61 63  ll states and ac
22f60 74 69 6f 6e 73 2e 20 20 43 6f 6e 76 65 72 74 0a  tions.  Convert.
22f70 20 20 2a 2a 20 65 76 65 72 79 20 61 63 74 69 6f    ** every actio
22f80 6e 20 74 68 61 74 20 69 73 20 61 20 53 48 49 46  n that is a SHIF
22f90 54 20 74 6f 20 61 6e 20 61 75 74 6f 52 65 64 75  T to an autoRedu
22fa0 63 65 20 73 74 61 74 65 20 69 6e 74 6f 0a 20 20  ce state into.  
22fb0 2a 2a 20 61 20 53 48 49 46 54 52 45 44 55 43 45  ** a SHIFTREDUCE
22fc0 20 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20   action..  */.  
22fd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
22fe0 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
22ff0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
23000 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
23010 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
23020 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
23030 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
23040 74 65 20 2a 70 4e 65 78 74 53 74 61 74 65 3b 0a  te *pNextState;.
23050 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
23060 70 65 21 3d 53 48 49 46 54 20 29 20 63 6f 6e 74  pe!=SHIFT ) cont
23070 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e 65 78  inue;.      pNex
23080 74 53 74 61 74 65 20 3d 20 61 70 2d 3e 78 2e 73  tState = ap->x.s
23090 74 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  tp;.      if( pN
230a0 65 78 74 53 74 61 74 65 2d 3e 61 75 74 6f 52 65  extState->autoRe
230b0 64 75 63 65 20 26 26 20 70 4e 65 78 74 53 74 61  duce && pNextSta
230c0 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 21  te->pDfltReduce!
230d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
230e0 2d 3e 74 79 70 65 20 3d 20 53 48 49 46 54 52 45  ->type = SHIFTRE
230f0 44 55 43 45 3b 0a 20 20 20 20 20 20 20 20 61 70  DUCE;.        ap
23100 2d 3e 78 2e 72 70 20 3d 20 70 4e 65 78 74 53 74  ->x.rp = pNextSt
23110 61 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65  ate->pDfltReduce
23120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23130 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
23140 48 49 46 54 52 45 44 55 43 45 20 61 63 74 69 6f  HIFTREDUCE actio
23150 6e 20 73 70 65 63 69 66 69 65 73 20 61 20 72 75  n specifies a ru
23160 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 73 69  le that has a si
23170 6e 67 6c 65 20 52 48 53 20 74 65 72 6d 0a 20 20  ngle RHS term.  
23180 2a 2a 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ** (meaning that
23190 20 74 68 65 20 53 48 49 46 54 52 45 44 55 43 45   the SHIFTREDUCE
231a0 20 77 69 6c 6c 20 6c 61 6e 64 20 62 61 63 6b 20   will land back 
231b0 69 6e 20 74 68 65 20 73 74 61 74 65 20 77 68 65  in the state whe
231c0 72 65 20 69 74 0a 20 20 2a 2a 20 73 74 61 72 74  re it.  ** start
231d0 65 64 29 20 61 6e 64 20 69 66 20 74 68 65 72 65  ed) and if there
231e0 20 69 73 20 6e 6f 20 43 2d 63 6f 64 65 20 61 73   is no C-code as
231f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
23200 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 2c  e reduce action,
23210 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61  .  ** then we ca
23220 6e 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63  n go ahead and c
23230 6f 6e 76 65 72 74 20 74 68 65 20 61 63 74 69 6f  onvert the actio
23240 6e 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  n to be the same
23250 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   as the.  ** act
23260 69 6f 6e 20 66 6f 72 20 74 68 65 20 52 48 53 20  ion for the RHS 
23270 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 20 20 2a  of the rule..  *
23280 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
23290 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
232a0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
232b0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
232c0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
232d0 3b 20 61 70 3b 20 61 70 3d 6e 65 78 74 61 70 29  ; ap; ap=nextap)
232e0 7b 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d  {.      nextap =
232f0 20 61 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20   ap->next;.     
23300 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 53   if( ap->type!=S
23310 48 49 46 54 52 45 44 55 43 45 20 29 20 63 6f 6e  HIFTREDUCE ) con
23320 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20  tinue;.      rp 
23330 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
23340 20 20 69 66 28 20 72 70 2d 3e 6e 6f 43 6f 64 65    if( rp->noCode
23350 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23360 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 72        if( rp->nr
23370 68 73 21 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65  hs!=1 ) continue
23380 3b 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a  ;.#if 1.      /*
23390 20 4f 6e 6c 79 20 61 70 70 6c 79 20 74 68 69 73   Only apply this
233a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f   optimization to
233b0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 2e 20   non-terminals. 
233c0 20 49 74 20 77 6f 75 6c 64 20 62 65 20 4f 4b 20   It would be OK 
233d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 6c  to.      ** appl
233e0 79 20 69 74 20 74 6f 20 74 65 72 6d 69 6e 61 6c  y it to terminal
233f0 20 73 79 6d 62 6f 6c 73 20 74 6f 6f 2c 20 62 75   symbols too, bu
23400 74 20 74 68 61 74 20 6d 61 6b 65 73 20 74 68 65  t that makes the
23410 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 0a 20   parser tables. 
23420 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20       ** larger. 
23430 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  */.      if( ap-
23440 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
23450 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
23460 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20  tinue;.#endif.  
23470 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
23480 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
23490 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69  t means the opti
234a0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
234b0 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 20 20 20  applied */.     
234c0 20 6e 65 78 74 61 70 20 3d 20 61 70 3b 0a 20 20   nextap = ap;.  
234d0 20 20 20 20 66 6f 72 28 61 70 32 3d 73 74 70 2d      for(ap2=stp-
234e0 3e 61 70 3b 20 61 70 32 20 26 26 20 28 61 70 32  >ap; ap2 && (ap2
234f0 3d 3d 61 70 20 7c 7c 20 61 70 32 2d 3e 73 70 21  ==ap || ap2->sp!
23500 3d 72 70 2d 3e 6c 68 73 29 3b 20 61 70 32 3d 61  =rp->lhs); ap2=a
23510 70 32 2d 3e 6e 65 78 74 29 7b 7d 0a 20 20 20 20  p2->next){}.    
23520 20 20 61 73 73 65 72 74 28 20 61 70 32 21 3d 30    assert( ap2!=0
23530 20 29 3b 0a 20 20 20 20 20 20 61 70 2d 3e 73 70   );.      ap->sp
23540 4f 70 74 20 3d 20 61 70 32 2d 3e 73 70 3b 0a 20  Opt = ap2->sp;. 
23550 20 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20       ap->type = 
23560 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 20 20 20  ap2->type;.     
23570 20 61 70 2d 3e 78 20 3d 20 61 70 32 2d 3e 78 3b   ap->x = ap2->x;
23580 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
23590 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
235a0 20 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74   states for sort
235b0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
235c0 68 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65  he smaller state
235d0 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77   is the.** one w
235e0 69 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e  ith the most non
235f0 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e  -terminal action
23600 73 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65  s.  If they have
23610 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
23620 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69  .** of non-termi
23630 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65  nal actions, the
23640 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73  n the smaller is
23650 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
23660 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20  e most.** token 
23670 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  actions..*/.stat
23680 69 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f  ic int stateReso
23690 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  rtCompare(const 
236a0 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
236b0 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74  oid *b){.  const
236c0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
236d0 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  A = *(const stru
236e0 63 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20  ct state**)a;.  
236f0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
23700 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74  te *pB = *(const
23710 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29   struct state**)
23720 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  b;.  int n;..  n
23730 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20   = pB->nNtAct - 
23740 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66  pA->nNtAct;.  if
23750 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ( n==0 ){.    n 
23760 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20  = pB->nTknAct - 
23770 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20  pA->nTknAct;.   
23780 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
23790 20 20 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65     n = pB->state
237a0 6e 75 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e  num - pA->staten
237b0 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  um;.    }.  }.  
237c0 61 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a  assert( n!=0 );.
237d0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
237e0 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61  /*.** Renumber a
237f0 6e 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73  nd resort states
23800 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
23810 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
23820 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74  es.** occur at t
23830 68 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c  he end.  Except,
23840 20 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73   keep state 0 as
23850 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
23860 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74  ..*/.void Resort
23870 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65  States(struct le
23880 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
23890 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
238a0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
238b0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
238c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
238d0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
238e0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
238f0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
23900 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20   stp->nTknAct = 
23910 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b  stp->nNtAct = 0;
23920 0a 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52  .    stp->iDfltR
23930 65 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e 72  educe = lemp->nr
23940 75 6c 65 3b 20 20 2f 2a 20 49 6e 69 74 20 64 66  ule;  /* Init df
23950 6c 74 20 61 63 74 69 6f 6e 20 74 6f 20 22 73 79  lt action to "sy
23960 6e 74 61 78 20 65 72 72 6f 72 22 20 2a 2f 0a 20  ntax error" */. 
23970 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
23980 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20   = NO_OFFSET;.  
23990 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d    stp->iNtOfst =
239a0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
239b0 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
239c0 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
239d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 63 74  {.      int iAct
239e0 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  ion = compute_ac
239f0 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3b 0a 20  tion(lemp,ap);. 
23a00 20 20 20 20 20 69 66 28 20 69 41 63 74 69 6f 6e       if( iAction
23a10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
23a20 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
23a30 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
23a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
23a50 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20  p->nTknAct++;.  
23a60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23a70 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
23a80 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
23a90 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e           stp->nN
23aa0 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tAct++;.        
23ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23ac0 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 75   assert( stp->au
23ad0 74 6f 52 65 64 75 63 65 3d 3d 30 20 7c 7c 20 73  toReduce==0 || s
23ae0 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 3d  tp->pDfltReduce=
23af0 3d 61 70 2d 3e 78 2e 72 70 20 29 3b 0a 20 20 20  =ap->x.rp );.   
23b00 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c         stp->iDfl
23b10 74 52 65 64 75 63 65 20 3d 20 69 41 63 74 69 6f  tReduce = iActio
23b20 6e 20 2d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n - lemp->nstate
23b30 20 2d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a   - lemp->nrule;.
23b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23b50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73  }.    }.  }.  qs
23b60 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  ort(&lemp->sorte
23b70 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  d[1], lemp->nsta
23b80 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d  te-1, sizeof(lem
23b90 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20  p->sorted[0]),. 
23ba0 20 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f         stateReso
23bb0 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f  rtCompare);.  fo
23bc0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
23bd0 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
23be0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
23bf0 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a  ->statenum = i;.
23c00 20 20 7d 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74    }.  lemp->nxst
23c10 61 74 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  ate = lemp->nsta
23c20 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d  te;.  while( lem
23c30 70 2d 3e 6e 78 73 74 61 74 65 3e 31 20 26 26 20  p->nxstate>1 && 
23c40 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d  lemp->sorted[lem
23c50 70 2d 3e 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61  p->nxstate-1]->a
23c60 75 74 6f 52 65 64 75 63 65 20 29 7b 0a 20 20 20  utoReduce ){.   
23c70 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d   lemp->nxstate--
23c80 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
23c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
23ca0 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e  m the file "set.
23cb0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
23cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cd0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53  *******/./*.** S
23ce0 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20  et manipulation 
23cf0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65  routines for the
23d00 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
23d10 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61  nerator..*/..sta
23d20 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30  tic int size = 0
23d30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65  ;../* Set the se
23d40 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53  t size */.void S
23d50 65 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a  etSize(int n).{.
23d60 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a    size = n+1;.}.
23d70 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
23d80 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a  ew set */.char *
23d90 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72  SetNew(){.  char
23da0 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72   *s;.  s = (char
23db0 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20  *)calloc( size, 
23dc0 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29  1);.  if( s==0 )
23dd0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
23de0 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
23df0 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ;.    memory_err
23e00 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
23e10 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c  rn s;.}../* Deal
23e20 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
23e30 76 6f 69 64 20 53 65 74 46 72 65 65 28 63 68 61  void SetFree(cha
23e40 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73  r *s).{.  free(s
23e50 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  );.}../* Add a n
23e60 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
23e70 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54  e set.  Return T
23e80 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65  RUE if the eleme
23e90 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20  nt was added.** 
23ea0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20  and FALSE if it 
23eb0 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72  was already ther
23ec0 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64  e. */.int SetAdd
23ed0 28 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29  (char *s, int e)
23ee0 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61  .{.  int rv;.  a
23ef0 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65  ssert( e>=0 && e
23f00 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20  <size );.  rv = 
23f10 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
23f20 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
23f30 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
23f40 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
23f50 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
23f60 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
23f70 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
23f80 28 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20  (char *s1, char 
23f90 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  *s2).{.  int i, 
23fa0 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67  progress;.  prog
23fb0 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ress = 0;.  for(
23fc0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
23fd0 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d  ){.    if( s2[i]
23fe0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23ff0 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30      if( s1[i]==0
24000 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65   ){.      progre
24010 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31  ss = 1;.      s1
24020 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  [i] = 1;.    }. 
24030 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67   }.  return prog
24040 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ress;.}./*******
24050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
24060 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
24070 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.c" ********
24080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24090 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
240a0 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
240b0 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
240c0 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
240d0 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
240e0 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
240f0 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
24100 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
24110 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
24120 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
24130 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
24140 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
24150 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
24160 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
24170 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
24180 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
24190 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
241a0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
241b0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
241c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
241d0 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
241e0 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45  tor..*/..PRIVATE
241f0 20 75 6e 73 69 67 6e 65 64 20 73 74 72 68 61 73   unsigned strhas
24200 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29  h(const char *x)
24210 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 20  .{.  unsigned h 
24220 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78  = 0;.  while( *x
24230 20 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28   ) h = h*13 + *(
24240 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68  x++);.  return h
24250 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69  ;.}../* Works li
24260 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20  ke strdup, sort 
24270 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69  of.  Save a stri
24280 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d  ng in malloced m
24290 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65  emory, but.** ke
242a0 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  ep strings in a 
242b0 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  table so that th
242c0 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73  e same string is
242d0 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20   not in more.** 
242e0 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a  than one place..
242f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  */.const char *S
24300 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61  trsafe(const cha
24310 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  r *y).{.  const 
24320 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20  char *z;.  char 
24330 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d 3d  *cpy;..  if( y==
24340 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
24350 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64  z = Strsafe_find
24360 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  (y);.  if( z==0 
24370 26 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a 29  && (cpy=(char *)
24380 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
24390 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29  len(y)+1 ))!=0 )
243a0 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63  {.    lemon_strc
243b0 70 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a  py(cpy,y);.    z
243c0 20 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73   = cpy;.    Strs
243d0 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20  afe_insert(z);. 
243e0 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b   }.  MemoryCheck
243f0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  (z);.  return z;
24400 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
24410 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
24420 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
24430 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
24440 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
24450 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
24460 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  1"..*/.struct s_
24470 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x1 {.  int size;
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24490 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
244a0 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
244b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244d0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
244e0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
244f0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
24520 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
24530 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
24540 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24550 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
24560 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
24570 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x1node *tbl;
24580 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
24590 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
245a0 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
245b0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
245c0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
245d0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
245e0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
245f0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24600 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
24610 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
24620 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
24630 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
24640 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
24650 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20  uct s_x1node {. 
24660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74   const char *dat
24670 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  a;        /* The
24680 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
24690 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74  t s_x1node *next
246a0 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
246b0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
246c0 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
246d0 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x1node **from
246e0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
246f0 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b  ink */.} x1node;
24700 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
24710 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
24720 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
24730 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
24740 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
24750 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b  truct s_x1 *x1a;
24760 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
24770 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
24780 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
24790 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20  rsafe_init(){.  
247a0 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e  if( x1a ) return
247b0 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63  ;.  x1a = (struc
247c0 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x1*)malloc( 
247d0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
247e0 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61  x1) );.  if( x1a
247f0 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a   ){.    x1a->siz
24800 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31  e = 1024;.    x1
24810 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
24820 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31    x1a->tbl = (x1
24830 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32  node*)calloc(102
24840 34 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  4, sizeof(x1node
24850 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
24860 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31  e*));.    if( x1
24870 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
24880 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
24890 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
248a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
248b0 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
248c0 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
248d0 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
248e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
248f0 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
24900 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
24910 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
24920 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
24930 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
24940 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
24950 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
24960 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
24970 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
24980 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
24990 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
249a0 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
249b0 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f   *data).{.  x1no
249c0 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
249d0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
249e0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d   ph;..  if( x1a=
249f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24a00 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61   ph = strhash(da
24a10 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
24a20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
24a30 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
24a40 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
24a50 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
24a60 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
24a70 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
24a80 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
24a90 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
24aa0 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
24ab0 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
24ac0 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
24ad0 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
24ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
24af0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
24b00 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
24b10 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x1a->count>=
24b20 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x1a->size ){.   
24b30 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
24b40 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
24b50 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
24b60 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20  t i,arrSize;.   
24b70 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
24b80 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
24b90 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78  ze = arrSize = x
24ba0 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
24bb0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
24bc0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
24bd0 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
24be0 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  e*)calloc(arrSiz
24bf0 65 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  e, sizeof(x1node
24c00 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
24c10 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72  e*));.    if( ar
24c20 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
24c30 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
24c40 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
24c50 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
24c60 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  ay.ht = (x1node*
24c70 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72  *)&(array.tbl[ar
24c80 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  rSize]);.    for
24c90 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b  (i=0; i<arrSize;
24ca0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
24cb0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
24cc0 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
24cd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
24ce0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
24cf0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
24d00 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
24d10 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
24d20 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
24d30 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
24d40 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
24d50 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
24d60 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
24d70 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
24d80 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
24d90 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
24da0 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
24db0 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
24dc0 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
24dd0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
24de0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
24df0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
24e00 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
24e10 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
24e20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d   }.    free(x1a-
24e30 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20  >tbl);.    *x1a 
24e40 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
24e50 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
24e60 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
24e70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
24e80 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d  );.  np = &(x1a-
24e90 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x1a->count+
24ea0 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
24eb0 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31  = data;.  if( x1
24ec0 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e  a->ht[h] ) x1a->
24ed0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
24ee0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
24ef0 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b  >next = x1a->ht[
24f00 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d  h];.  x1a->ht[h]
24f10 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
24f20 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d  m = &(x1a->ht[h]
24f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
24f40 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
24f50 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
24f60 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
24f70 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
24f80 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
24f90 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73  uch key. */.cons
24fa0 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  t char *Strsafe_
24fb0 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20  find(const char 
24fc0 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  *key).{.  unsign
24fd0 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a  ed h;.  x1node *
24fe0 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  np;..  if( x1a==
24ff0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25000 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
25010 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
25020 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
25030 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
25040 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
25050 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29  mp(np->data,key)
25060 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25070 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
25080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
25090 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
250a0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
250b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74  ointer to the (t
250c0 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65  erminal or nonte
250d0 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22  rminal) symbol "
250e0 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  x"..** Create a 
250f0 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68  new symbol if th
25100 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
25110 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65  time "x" has bee
25120 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63  n seen..*/.struc
25130 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
25140 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20  _new(const char 
25150 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  *x).{.  struct s
25160 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70  ymbol *sp;..  sp
25170 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
25180 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29  );.  if( sp==0 )
25190 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75  {.    sp = (stru
251a0 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c  ct symbol *)call
251b0 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
251c0 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20  uct symbol) );. 
251d0 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
251e0 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65  p);.    sp->name
251f0 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20   = Strsafe(x);. 
25200 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53     sp->type = IS
25210 55 50 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d  UPPER(*x) ? TERM
25220 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e  INAL : NONTERMIN
25230 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65  AL;.    sp->rule
25240 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61   = 0;.    sp->fa
25250 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
25260 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20  sp->prec = -1;. 
25270 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55     sp->assoc = U
25280 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73  NK;.    sp->firs
25290 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70  tset = 0;.    sp
252a0 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
252b0 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e  _FALSE;.    sp->
252c0 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
252d0 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65      sp->destLine
252e0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  no = 0;.    sp->
252f0 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
25300 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30    sp->useCnt = 0
25310 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.    Symbol_ins
25320 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29  ert(sp,sp->name)
25330 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43  ;.  }.  sp->useC
25340 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73  nt++;.  return s
25350 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  p;.}../* Compare
25360 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72   two symbols for
25370 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
25380 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
25390 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72  ive,.** zero, or
253a0 20 70 6f 73 69 74 69 76 65 20 69 66 20 61 20 69   positive if a i
253b0 73 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75  s less then, equ
253c0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
253d0 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a  r.** than b..**.
253e0 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20  ** Symbols that 
253f0 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72  begin with upper
25400 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74   case letters (t
25410 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65  erminals or toke
25420 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74  ns).** must sort
25430 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20   before symbols 
25440 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
25450 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65  lower case lette
25460 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69  rs.** (non-termi
25470 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54  nals).  And MULT
25480 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c  ITERMINAL symbol
25490 73 20 28 63 72 65 61 74 65 64 20 75 73 69 6e 67  s (created using
254a0 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63   the.** %token_c
254b0 6c 61 73 73 20 64 69 72 65 63 74 69 76 65 29 20  lass directive) 
254c0 6d 75 73 74 20 73 6f 72 74 20 61 74 20 74 68 65  must sort at the
254d0 20 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72   very end. Other
254e0 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74   than.** that, t
254f0 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f  he order does no
25500 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  t matter..**.** 
25510 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65  We find experime
25520 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76  ntally that leav
25530 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  ing the symbols 
25540 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
25550 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20  l.** order (the 
25560 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61  order they appea
25570 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  red in the gramm
25580 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74  ar file) gives t
25590 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70  he.** smallest p
255a0 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20  arser tables in 
255b0 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53  SQLite..*/.int S
255c0 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20  ymbolcmpp(const 
255d0 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20  void *_a, const 
255e0 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  void *_b).{.  co
255f0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
25600 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73  l *a = *(const s
25610 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
25620 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   _a;.  const str
25630 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20  uct symbol *b = 
25640 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
25650 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20  ymbol **) _b;.  
25660 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65  int i1 = a->type
25670 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
25680 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : a->name[0]
25690 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
256a0 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65  int i2 = b->type
256b0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
256c0 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : b->name[0]
256d0 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
256e0 72 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20  return i1==i2 ? 
256f0 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e  a->index - b->in
25700 64 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d  dex : i1 - i2;.}
25710 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
25720 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
25730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
25740 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
25750 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
25760 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
25770 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32  ..*/.struct s_x2
25780 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257a0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
257b0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
257c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
257d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
257e0 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
257f0 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
25800 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25820 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
25830 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
25840 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
25860 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
25870 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
25880 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x2node *tbl;  
25890 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
258a0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
258b0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68  uct s_x2node **h
258c0 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
258d0 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
258e0 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
258f0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
25900 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
25910 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
25920 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
25930 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
25940 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a  y of type "x2"..
25950 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
25960 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73  t s_x2node {.  s
25970 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
25980 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ta;     /* The d
25990 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
259a0 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
259b0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
259c0 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
259d0 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
259e0 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
259f0 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
25a00 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
25a10 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
25a20 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
25a30 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x2node;../* Ther
25a40 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
25a50 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
25a60 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
25a70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
25a80 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
25a90 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  2 *x2a;../* Allo
25aa0 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
25ab0 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
25ac0 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
25ad0 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29 20  (){.  if( x2a ) 
25ae0 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d 20  return;.  x2a = 
25af0 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d 61  (struct s_x2*)ma
25b00 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
25b10 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20 69  uct s_x2) );.  i
25b20 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78 32  f( x2a ){.    x2
25b30 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20  a->size = 128;. 
25b40 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d 20     x2a->count = 
25b50 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c 20  0;.    x2a->tbl 
25b60 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x2node*)callo
25b70 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78 32  c(128, sizeof(x2
25b80 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
25b90 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  2node*));.    if
25ba0 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x2a->tbl==0 ){
25bb0 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29  .      free(x2a)
25bc0 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b  ;.      x2a = 0;
25bd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25be0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
25bf0 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65  2a->ht = (x2node
25c00 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32  **)&(x2a->tbl[12
25c10 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
25c20 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
25c30 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x2a->ht[i] = 0;.
25c40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
25c50 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
25c60 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
25c70 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
25c80 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
25c90 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
25ca0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
25cb0 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
25cc0 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  n */.int Symbol_
25cd0 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 79  insert(struct sy
25ce0 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e 73  mbol *data, cons
25cf0 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
25d00 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x2node *np;.  u
25d10 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
25d20 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
25d30 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
25d40 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
25d50 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
25d60 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
25d70 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
25d80 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
25d90 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
25da0 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
25db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
25dc0 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
25dd0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
25de0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
25df0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
25e00 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
25e10 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
25e20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
25e30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
25e40 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
25e50 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74    if( x2a->count
25e60 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x2a->size ){. 
25e70 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
25e80 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
25e90 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
25ea0 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20  int i,arrSize;. 
25eb0 20 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61     struct s_x2 a
25ec0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
25ed0 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d  size = arrSize =
25ee0 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
25ef0 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
25f00 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
25f10 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
25f20 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53  ode*)calloc(arrS
25f30 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f  ize, sizeof(x2no
25f40 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
25f50 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
25f60 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
25f70 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
25f80 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
25f90 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
25fa0 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64  rray.ht = (x2nod
25fb0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
25fc0 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66  arrSize]);.    f
25fd0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
25fe0 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
25ff0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
26000 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
26010 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
26020 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
26030 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
26040 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
26050 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
26060 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
26070 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29  y) & (arrSize-1)
26080 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
26090 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
260a0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
260b0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
260c0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
260d0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
260e0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
260f0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
26100 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
26110 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
26120 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
26130 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
26140 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
26150 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
26160 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
26170 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
26180 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d   }.    free(x2a-
26190 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20  >tbl);.    *x2a 
261a0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
261b0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
261c0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
261d0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
261e0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d  );.  np = &(x2a-
261f0 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x2a->count+
26200 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
26210 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
26220 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
26230 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d  2a->ht[h] ) x2a-
26240 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
26250 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
26260 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74  ->next = x2a->ht
26270 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68  [h];.  x2a->ht[h
26280 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
26290 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68  om = &(x2a->ht[h
262a0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
262b0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
262c0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
262d0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
262e0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
262f0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
26300 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
26310 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
26320 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
26330 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73  ar *key).{.  uns
26340 69 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e 6f 64  igned h;.  x2nod
26350 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32  e *np;..  if( x2
26360 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
26370 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b  .  h = strhash(k
26380 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65  ey) & (x2a->size
26390 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
263a0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
263b0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
263c0 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
263d0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
263e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
263f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
26400 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
26410 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
26420 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52  he n-th data.  R
26430 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20  eturn NULL if n 
26440 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
26450 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
26460 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e  l *Symbol_Nth(in
26470 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  t n).{.  struct 
26480 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20  symbol *data;.  
26490 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26  if( x2a && n>0 &
264a0 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20  & n<=x2a->count 
264b0 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32  ){.    data = x2
264c0 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61  a->tbl[n-1].data
264d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
264e0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ata = 0;.  }.  r
264f0 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f  eturn data;.}../
26500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
26510 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a  e of the array *
26520 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75  /.int Symbol_cou
26530 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20  nt().{.  return 
26540 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74  x2a ? x2a->count
26550 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
26560 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  rn an array of p
26570 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64  ointers to all d
26580 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ata in the table
26590 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  ..** The array i
265a0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
265b0 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20  malloc.  Return 
265c0 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61  NULL if memory a
265d0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f  llocation.** pro
265e0 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65  blems, or if the
265f0 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e   array is empty.
26600 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
26610 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79  l **Symbol_array
26620 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  of().{.  struct 
26630 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a  symbol **array;.
26640 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
26650 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
26660 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72 72 53  return 0;.  arrS
26670 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  ize = x2a->count
26680 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
26690 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61  uct symbol **)ca
266a0 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
266b0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
266c0 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72  ol *));.  if( ar
266d0 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
266e0 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
266f0 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
26700 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  2a->tbl[i].data;
26710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
26720 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  ray;.}../* Compa
26730 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61  re two configura
26740 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e  tions */.int Con
26750 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61  figcmp(const cha
26760 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72  r *_a,const char
26770 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20   *_b).{.  const 
26780 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
26790 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
267a0 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74  g *) _a;.  const
267b0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
267c0 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  b = (struct conf
267d0 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20  ig *) _b;.  int 
267e0 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e  x;.  x = a->rp->
267f0 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69  index - b->rp->i
26800 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30  ndex;.  if( x==0
26810 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20   ) x = a->dot - 
26820 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  b->dot;.  return
26830 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72   x;.}../* Compar
26840 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a  e two states */.
26850 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
26860 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66  ecmp(struct conf
26870 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f  ig *a, struct co
26880 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74  nfig *b).{.  int
26890 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b   rc;.  for(rc=0;
268a0 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62   rc==0 && a && b
268b0 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d  ;  a=a->bp, b=b-
268c0 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  >bp){.    rc = a
268d0 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
268e0 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20  >rp->index;.    
268f0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
26900 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
26910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26920 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29  0 ){.    if( a )
26930 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28   rc = 1;.    if(
26940 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20   b ) rc = -1;.  
26950 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26960 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74  ../* Hash a stat
26970 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73  e */.PRIVATE uns
26980 69 67 6e 65 64 20 73 74 61 74 65 68 61 73 68 28  igned statehash(
26990 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
269a0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
269b0 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29  =0;.  while( a )
269c0 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20  {.    h = h*571 
269d0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
269e0 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20  7 + a->dot;.    
269f0 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20  a = a->bp;.  }. 
26a00 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
26a10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
26a20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
26a30 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
26a40 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20  *State_new().{. 
26a50 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
26a60 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73 74  ewstate;.  newst
26a70 61 74 65 20 3d 20 28 73 74 72 75 63 74 20 73 74  ate = (struct st
26a80 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20  ate *)calloc(1, 
26a90 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
26aa0 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79  ate) );.  Memory
26ab0 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29 3b  Check(newstate);
26ac0 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74 61  .  return newsta
26ad0 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  te;.}../* There 
26ae0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
26af0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
26b00 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
26b10 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
26b20 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
26b30 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
26b40 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
26b50 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
26b60 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
26b70 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
26b80 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
26bb0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
26bc0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
26bf0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
26c00 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
26c10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26c20 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
26c30 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
26c40 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
26c50 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
26c60 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
26c70 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
26c80 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
26c90 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
26ca0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
26cb0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
26cc0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
26cd0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
26ce0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
26cf0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
26d00 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
26d10 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
26d20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
26d30 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
26d40 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
26d50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26d60 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
26d70 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
26da0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
26db0 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
26dc0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
26dd0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
26de0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
26df0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
26e00 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
26e10 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
26e20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
26e30 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
26e40 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
26e50 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
26e60 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
26e70 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
26e80 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
26e90 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
26ea0 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
26eb0 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
26ec0 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
26ed0 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
26ee0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
26ef0 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
26f00 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
26f10 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
26f20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
26f30 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
26f40 78 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31  x3node*)calloc(1
26f50 32 38 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  28, sizeof(x3nod
26f60 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
26f70 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78  de*));.    if( x
26f80 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  3a->tbl==0 ){.  
26f90 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20      free(x3a);. 
26fa0 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20       x3a = 0;.  
26fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
26fc0 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d  nt i;.      x3a-
26fd0 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  >ht = (x3node**)
26fe0 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x3a->tbl[128])
26ff0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
27000 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61   i<128; i++) x3a
27010 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
27020 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
27030 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
27040 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
27050 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
27060 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
27070 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
27080 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
27090 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
270a0 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  /.int State_inse
270b0 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20  rt(struct state 
270c0 2a 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f  *data, struct co
270d0 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78  nfig *key).{.  x
270e0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73  3node *np;.  uns
270f0 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67  igned h;.  unsig
27100 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  ned ph;..  if( x
27110 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
27120 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61  ;.  ph = stateha
27130 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
27140 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
27150 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
27160 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
27170 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
27180 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
27190 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
271a0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
271b0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
271c0 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
271d0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
271e0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
271f0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
27200 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
27210 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
27220 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
27230 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75  }.  if( x3a->cou
27240 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x3a->size ){
27250 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
27260 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
27270 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
27280 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
27290 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33  .    struct s_x3
272a0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
272b0 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65  y.size = arrSize
272c0 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x3a->size*2;.
272d0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
272e0 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
272f0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
27300 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72  3node*)calloc(ar
27310 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33  rSize, sizeof(x3
27320 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
27330 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  3node*));.    if
27340 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
27350 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
27360 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
27370 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
27380 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e   array.ht = (x3n
27390 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
273a0 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20  l[arrSize]);.   
273b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
273c0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
273d0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
273e0 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63  or(i=0; i<x3a->c
273f0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
27400 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x3node *oldnp,
27410 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
27420 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62  ldnp = &(x3a->tb
27430 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
27440 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70   statehash(oldnp
27450 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a  ->key) & (arrSiz
27460 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
27470 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
27480 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
27490 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
274a0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
274b0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
274c0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
274d0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
274e0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
274f0 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
27500 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
27510 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
27520 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
27530 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
27540 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
27550 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
27560 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
27570 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x3a->tbl);.    *
27580 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x3a = array;.  }
27590 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
275a0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
275b0 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
275c0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
275d0 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f  x3a->tbl[x3a->co
275e0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
275f0 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
27600 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
27610 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x3a->ht[h] ) 
27620 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x3a->ht[h]->from
27630 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
27640 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61    np->next = x3a
27650 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e  ->ht[h];.  x3a->
27660 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
27670 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e  ->from = &(x3a->
27680 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
27690 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
276a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
276b0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
276c0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
276d0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
276e0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
276f0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
27700 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74  tate_find(struct
27710 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a   config *key).{.
27720 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
27730 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
27740 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
27750 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
27760 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
27770 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
27780 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
27790 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
277a0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
277b0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
277c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
277d0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
277e0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
277f0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
27800 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
27810 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
27820 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
27830 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
27840 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
27850 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
27860 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
27870 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
27880 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
27890 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
278a0 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
278b0 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
278c0 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
278d0 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
278e0 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a  ;.  int i,arrSiz
278f0 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
27900 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72  ) return 0;.  ar
27910 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75  rSize = x3a->cou
27920 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
27930 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 63  truct state **)c
27940 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
27950 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61  izeof(struct sta
27960 74 65 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72  te *));.  if( ar
27970 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
27980 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
27990 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
279a0 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  3a->tbl[i].data;
279b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
279c0 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20  ray;.}../* Hash 
279d0 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
279e0 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67  */.PRIVATE unsig
279f0 6e 65 64 20 63 6f 6e 66 69 67 68 61 73 68 28 73  ned confighash(s
27a00 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29  truct config *a)
27a10 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3d  .{.  unsigned h=
27a20 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b  0;.  h = h*571 +
27a30 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37   a->rp->index*37
27a40 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74   + a->dot;.  ret
27a50 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn h;.}../* The
27a60 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
27a70 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
27a80 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
27a90 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
27aa0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
27ab0 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72  ype "x4"..*/.str
27ac0 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74  uct s_x4 {.  int
27ad0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
27ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
27af0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27b00 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
27b30 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
27b40 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
27b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
27b70 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
27b80 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
27b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27ba0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
27bb0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
27bc0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
27bd0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
27be0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
27bf0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
27c00 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
27c10 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
27c20 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
27c30 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
27c40 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
27c50 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
27c60 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
27c70 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
27c80 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
27c90 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x4"..*/.typed
27ca0 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  ef struct s_x4no
27cb0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  de {.  struct co
27cc0 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20  nfig *data;     
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ce0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
27cf0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e  ruct s_x4node *n
27d00 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
27d10 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
27d20 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
27d30 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66  uct s_x4node **f
27d40 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
27d50 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f  s link */.} x4no
27d60 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
27d70 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
27d80 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
27d90 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
27da0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
27db0 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78  c struct s_x4 *x
27dc0 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  4a;../* Allocate
27dd0 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
27de0 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
27df0 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
27e00 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29  t(){.  if( x4a )
27e10 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d   return;.  x4a =
27e20 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d   (struct s_x4*)m
27e30 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
27e40 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20  ruct s_x4) );.  
27e50 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78  if( x4a ){.    x
27e60 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20  4a->size = 64;. 
27e70 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20     x4a->count = 
27e80 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20  0;.    x4a->tbl 
27e90 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x4node*)callo
27ea0 63 28 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e  c(64, sizeof(x4n
27eb0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
27ec0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
27ed0 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
27ee0 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
27ef0 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
27f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27f10 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
27f20 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
27f30 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
27f40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
27f50 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
27f60 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
27f70 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
27f80 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
27f90 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
27fa0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
27fb0 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
27fc0 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
27fd0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
27fe0 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
27ff0 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
28000 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
28010 63 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a  config *data).{.
28020 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x4node *np;.  
28030 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
28040 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
28050 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
28060 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66  n 0;.  ph = conf
28070 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  ighash(data);.  
28080 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
28090 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
280a0 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
280b0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
280c0 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e  ( Configcmp((con
280d0 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64  st char *) np->d
280e0 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20  ata,(const char 
280f0 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  *) data)==0 ){. 
28100 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
28110 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
28120 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
28130 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
28140 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
28150 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
28160 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
28170 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
28180 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
28190 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
281a0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
281b0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
281c0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
281d0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
281e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72   */.    int i,ar
281f0 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  rSize;.    struc
28200 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
28210 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61    array.size = a
28220 72 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  rrSize = x4a->si
28230 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
28240 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
28250 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
28260 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c  l = (x4node*)cal
28270 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
28280 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
28290 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
282a0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
282b0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
282c0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
282d0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
282e0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
282f0 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
28300 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d  ray.tbl[arrSize]
28310 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
28320 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
28330 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
28340 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28350 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
28360 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
28370 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
28380 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
28390 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
283a0 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
283b0 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
283c0 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
283d0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
283e0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
283f0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
28400 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
28410 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
28420 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
28430 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
28440 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
28450 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
28460 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
28470 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
28480 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
28490 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
284a0 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
284b0 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
284c0 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
284d0 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
284e0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
284f0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
28500 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
28510 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
28520 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
28530 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
28540 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
28550 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
28560 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
28570 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
28580 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
28590 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
285a0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
285b0 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
285c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
285d0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
285e0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
285f0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
28600 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
28610 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
28620 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
28630 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
28640 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ble_find(struct 
28650 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
28660 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65   int h;.  x4node
28670 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61   *np;..  if( x4a
28680 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
28690 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
286a0 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69  (key) & (x4a->si
286b0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
286c0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
286d0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
286e0 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73   Configcmp((cons
286f0 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61  t char *) np->da
28700 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta,(const char *
28710 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  ) key)==0 ) brea
28720 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
28730 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
28740 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
28750 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f   : 0;.}../* Remo
28760 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  ve all data from
28770 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73   the table.  Pas
28780 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74  s each data to t
28790 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a  he function "f".
287a0 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f  ** as it is remo
287b0 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62  ved.  ("f" may b
287c0 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20  e null to avoid 
287d0 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76  this step.) */.v
287e0 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
287f0 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74  clear(int(*f)(st
28800 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a  ruct config *)).
28810 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
28820 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
28830 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
28840 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
28850 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
28860 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
28870 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
28880 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
28890 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
288a0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
288b0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
288c0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.