/ Hex Artifact Content
Login

Artifact cc43148d2793ab93668e74a6a6319bb71c2e65c1ffcd6deeaa59e12be9362a43:


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 65 78 74 65 72 6e 20 76 6f 69 64 20  if..extern void 
0470: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
0480: 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f 77 50  static int showP
0490: 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63  recedenceConflic
04a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 63 68  t = 0;.static ch
04b0: 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c  ar *msort(char*,
04c0: 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f  char**,int(*)(co
04d0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
04e0: 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char*));../*.** 
04f0: 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65  Compilers are ge
0500: 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67  tting increasing
0510: 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75  ly pedantic abou
0520: 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f  t type conversio
0530: 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76  ns.** as C evolv
0540: 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74  es ever closer t
0550: 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f  o Ada....  To wo
0560: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61  rk around the la
0570: 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a  test problems.**
0580: 20 77 65 20 68 61 76 65 20 74 6f 20 64 65 66 69   we have to defi
0590: 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ne the following
05a0: 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c   variant of strl
05b0: 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  en()..*/.#define
05c0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20   lemonStrlen(X) 
05d0: 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58    ((int)strlen(X
05e0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ))../*.** Compil
05f0: 65 72 73 20 61 72 65 20 73 74 61 72 74 69 6e 67  ers are starting
0600: 20 74 6f 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f   to complain abo
0610: 75 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 70  ut the use of sp
0620: 72 69 6e 74 66 28 29 20 61 6e 64 20 73 74 72 63  rintf() and strc
0630: 70 79 28 29 2c 0a 2a 2a 20 73 61 79 69 6e 67 20  py(),.** saying 
0640: 74 68 65 79 20 61 72 65 20 75 6e 73 61 66 65 2e  they are unsafe.
0650: 20 20 53 6f 20 77 65 20 64 65 66 69 6e 65 20 6f    So we define o
0660: 75 72 20 6f 77 6e 20 76 65 72 73 69 6f 6e 73 20  ur own versions 
0670: 6f 66 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65  of those routine
0680: 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  s too..**.** The
0690: 72 65 20 61 72 65 20 74 68 72 65 65 20 72 6f 75  re are three rou
06a0: 74 69 6e 65 73 20 68 65 72 65 3a 20 20 6c 65 6d  tines here:  lem
06b0: 6f 6e 5f 73 70 72 69 6e 74 66 28 29 2c 20 6c 65  on_sprintf(), le
06c0: 6d 6f 6e 5f 76 73 70 72 69 6e 74 66 28 29 2c 20  mon_vsprintf(), 
06d0: 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e 5f 61 64 64  and.** lemon_add
06e0: 74 65 78 74 28 29 2e 20 54 68 65 20 66 69 72 73  text(). The firs
06f0: 74 20 74 77 6f 20 61 72 65 20 72 65 70 6c 61 63  t two are replac
0700: 65 6d 65 6e 74 73 20 66 6f 72 20 73 70 72 69 6e  ements for sprin
0710: 74 66 28 29 20 61 6e 64 20 76 73 70 72 69 6e 74  tf() and vsprint
0720: 66 28 29 2e 0a 2a 2a 20 54 68 65 20 74 68 69 72  f()..** The thir
0730: 64 20 69 73 20 61 20 68 65 6c 70 65 72 20 72 6f  d is a helper ro
0740: 75 74 69 6e 65 20 66 6f 72 20 76 73 6e 70 72 69  utine for vsnpri
0750: 6e 74 66 28 29 20 74 68 61 74 20 61 64 64 73 20  ntf() that adds 
0760: 74 65 78 74 73 20 74 6f 20 74 68 65 20 65 6e 64  texts to the end
0770: 20 6f 66 20 61 0a 2a 2a 20 62 75 66 66 65 72 2c   of a.** buffer,
0780: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
0790: 20 62 75 66 66 65 72 20 69 73 20 61 6c 77 61 79   buffer is alway
07a0: 73 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  s zero-terminate
07b0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72  d..**.** The str
07c0: 69 6e 67 20 66 6f 72 6d 61 74 74 65 72 20 69 73  ing formatter is
07d0: 20 61 20 6d 69 6e 69 6d 61 6c 20 73 75 62 73 65   a minimal subse
07e0: 74 20 6f 66 20 73 74 64 6c 69 62 20 73 70 72 69  t of stdlib spri
07f0: 6e 74 66 28 29 20 73 75 70 70 6f 72 74 69 6e 67  ntf() supporting
0800: 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66 65 77 20 73   only.** a few s
0810: 69 6d 70 6c 79 20 63 6f 6e 76 65 72 73 69 6f 6e  imply conversion
0820: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25 64 0a 2a 2a  s:.**.**   %d.**
0830: 20 20 20 25 73 0a 2a 2a 20 20 20 25 2e 2a 73 0a     %s.**   %.*s.
0840: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
0850: 64 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28  d lemon_addtext(
0860: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20  .  char *zBuf,  
0870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0880: 62 75 66 66 65 72 20 74 6f 20 77 68 69 63 68 20  buffer to which 
0890: 74 65 78 74 20 69 73 20 61 64 64 65 64 20 2a 2f  text is added */
08a0: 0a 20 20 69 6e 74 20 2a 70 6e 55 73 65 64 2c 20  .  int *pnUsed, 
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74           /* Slot
08c0: 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
08d0: 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  used so far */. 
08e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
08f0: 2c 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74  ,      /* Text t
0900: 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  o add */.  int n
0910: 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  In,             
0920: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 74 65 78   /* Bytes of tex
0930: 74 20 74 6f 20 61 64 64 2e 20 20 2d 31 20 74 6f  t to add.  -1 to
0940: 20 75 73 65 20 73 74 72 6c 65 6e 28 29 20 2a 2f   use strlen() */
0950: 0a 20 20 69 6e 74 20 69 57 69 64 74 68 20 20 20  .  int iWidth   
0960: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
0970: 64 20 77 69 64 74 68 2e 20 20 4e 65 67 61 74 69  d width.  Negati
0980: 76 65 20 74 6f 20 6c 65 66 74 20 6a 75 73 74 69  ve to left justi
0990: 66 79 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  fy */.){.  if( n
09a0: 49 6e 3c 30 20 29 20 66 6f 72 28 6e 49 6e 3d 30  In<0 ) for(nIn=0
09b0: 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20 6e 49 6e 2b  ; zIn[nIn]; nIn+
09c0: 2b 29 7b 7d 0a 20 20 77 68 69 6c 65 28 20 69 57  +){}.  while( iW
09d0: 69 64 74 68 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  idth>nIn ){ zBuf
09e0: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
09f0: 27 20 27 3b 20 69 57 69 64 74 68 2d 2d 3b 20 7d  ' '; iWidth--; }
0a00: 0a 20 20 69 66 28 20 6e 49 6e 3d 3d 30 20 29 20  .  if( nIn==0 ) 
0a10: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79  return;.  memcpy
0a20: 28 26 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d 2c  (&zBuf[*pnUsed],
0a30: 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 2a 70   zIn, nIn);.  *p
0a40: 6e 55 73 65 64 20 2b 3d 20 6e 49 6e 3b 0a 20 20  nUsed += nIn;.  
0a50: 77 68 69 6c 65 28 20 28 2d 69 57 69 64 74 68 29  while( (-iWidth)
0a60: 3e 6e 49 6e 20 29 7b 20 7a 42 75 66 5b 28 2a 70  >nIn ){ zBuf[(*p
0a70: 6e 55 73 65 64 29 2b 2b 5d 20 3d 20 27 20 27 3b  nUsed)++] = ' ';
0a80: 20 69 57 69 64 74 68 2b 2b 3b 20 7d 0a 20 20 7a   iWidth++; }.  z
0a90: 42 75 66 5b 2a 70 6e 55 73 65 64 5d 20 3d 20 30  Buf[*pnUsed] = 0
0aa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  ;.}.static int l
0ab0: 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66 28 63 68  emon_vsprintf(ch
0ac0: 61 72 20 2a 73 74 72 2c 20 63 6f 6e 73 74 20 63  ar *str, const c
0ad0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
0ae0: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 69 6e 74  _list ap){.  int
0af0: 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b 0a 20 20 69   i, j, k, c;.  i
0b00: 6e 74 20 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20  nt nUsed = 0;.  
0b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
0b20: 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b   char zTemp[50];
0b30: 0a 20 20 73 74 72 5b 30 5d 20 3d 20 30 3b 0a 20  .  str[0] = 0;. 
0b40: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
0b50: 20 7a 46 6f 72 6d 61 74 5b 69 5d 29 21 3d 30 3b   zFormat[i])!=0;
0b60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   i++){.    if( c
0b70: 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 69  =='%' ){.      i
0b80: 6e 74 20 69 57 69 64 74 68 20 3d 20 30 3b 0a 20  nt iWidth = 0;. 
0b90: 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65       lemon_addte
0ba0: 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20  xt(str, &nUsed, 
0bb0: 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a  &zFormat[j], i-j
0bc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , 0);.      c = 
0bd0: 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d 3b 0a 20 20  zFormat[++i];.  
0be0: 20 20 20 20 69 66 28 20 49 53 44 49 47 49 54 28      if( ISDIGIT(
0bf0: 63 29 20 7c 7c 20 28 63 3d 3d 27 2d 27 20 26 26  c) || (c=='-' &&
0c00: 20 49 53 44 49 47 49 54 28 7a 46 6f 72 6d 61 74   ISDIGIT(zFormat
0c10: 5b 69 2b 31 5d 29 29 20 29 7b 0a 20 20 20 20 20  [i+1])) ){.     
0c20: 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 29 20     if( c=='-' ) 
0c30: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69  i++;.        whi
0c40: 6c 65 28 20 49 53 44 49 47 49 54 28 7a 46 6f 72  le( ISDIGIT(zFor
0c50: 6d 61 74 5b 69 5d 29 20 29 20 69 57 69 64 74 68  mat[i]) ) iWidth
0c60: 20 3d 20 69 57 69 64 74 68 2a 31 30 20 2b 20 7a   = iWidth*10 + z
0c70: 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20 2d 20 27 30  Format[i++] - '0
0c80: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ';.        if( c
0c90: 3d 3d 27 2d 27 20 29 20 69 57 69 64 74 68 20 3d  =='-' ) iWidth =
0ca0: 20 2d 69 57 69 64 74 68 3b 0a 20 20 20 20 20 20   -iWidth;.      
0cb0: 20 20 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d    c = zFormat[i]
0cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0cd0: 69 66 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20 20  if( c=='d' ){.  
0ce0: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 76 61        int v = va
0cf0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0d00: 20 20 20 20 20 20 20 69 66 28 20 76 3c 30 20 29         if( v<0 )
0d10: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6d 6f  {.          lemo
0d20: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0d30: 6e 55 73 65 64 2c 20 22 2d 22 2c 20 31 2c 20 69  nUsed, "-", 1, i
0d40: 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20 20 20  Width);.        
0d50: 20 20 76 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20    v = -v;.      
0d60: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 30    }else if( v==0
0d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
0d80: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0d90: 20 26 6e 55 73 65 64 2c 20 22 30 22 2c 20 31 2c   &nUsed, "0", 1,
0da0: 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20   iWidth);.      
0db0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 20 3d 20    }.        k = 
0dc0: 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  0;.        while
0dd0: 28 20 76 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( v>0 ){.       
0de0: 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20     k++;.        
0df0: 20 20 7a 54 65 6d 70 5b 73 69 7a 65 6f 66 28 7a    zTemp[sizeof(z
0e00: 54 65 6d 70 29 2d 6b 5d 20 3d 20 28 76 25 31 30  Temp)-k] = (v%10
0e10: 29 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ) + '0';.       
0e20: 20 20 20 76 20 2f 3d 20 31 30 3b 0a 20 20 20 20     v /= 10;.    
0e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65      }.        le
0e40: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0e50: 20 26 6e 55 73 65 64 2c 20 26 7a 54 65 6d 70 5b   &nUsed, &zTemp[
0e60: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d  sizeof(zTemp)-k]
0e70: 2c 20 6b 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , k, iWidth);.  
0e80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
0e90: 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='s' ){.        
0ea0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
0eb0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
0ec0: 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65       lemon_addte
0ed0: 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20  xt(str, &nUsed, 
0ee0: 7a 2c 20 2d 31 2c 20 69 57 69 64 74 68 29 3b 0a  z, -1, iWidth);.
0ef0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0f00: 63 3d 3d 27 2e 27 20 26 26 20 6d 65 6d 63 6d 70  c=='.' && memcmp
0f10: 28 26 7a 46 6f 72 6d 61 74 5b 69 5d 2c 20 22 2e  (&zFormat[i], ".
0f20: 2a 73 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  *s", 3)==0 ){.  
0f30: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
0f40: 20 20 20 20 20 20 6b 20 3d 20 76 61 5f 61 72 67        k = va_arg
0f50: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
0f60: 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61 70     z = va_arg(ap
0f70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
0f80: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0f90: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fa0: 64 2c 20 7a 2c 20 6b 2c 20 69 57 69 64 74 68 29  d, z, k, iWidth)
0fb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0fc0: 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  ( c=='%' ){.    
0fd0: 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78      lemon_addtex
0fe0: 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22  t(str, &nUsed, "
0ff0: 25 22 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  %", 1, 0);.     
1000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1010: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1020: 22 69 6c 6c 65 67 61 6c 20 66 6f 72 6d 61 74 5c  "illegal format\
1030: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  n");.        exi
1040: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
1050: 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20      j = i+1;.   
1060: 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 61   }.  }.  lemon_a
1070: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
1080: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
1090: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 72 65 74 75   i-j, 0);.  retu
10a0: 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a 73 74 61 74  rn nUsed;.}.stat
10b0: 69 63 20 69 6e 74 20 6c 65 6d 6f 6e 5f 73 70 72  ic int lemon_spr
10c0: 69 6e 74 66 28 63 68 61 72 20 2a 73 74 72 2c 20  intf(char *str, 
10d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d  const char *form
10e0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
10f0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
1100: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1110: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 72 63 20 3d   format);.  rc =
1120: 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66 28   lemon_vsprintf(
1130: 73 74 72 2c 20 66 6f 72 6d 61 74 2c 20 61 70 29  str, format, ap)
1140: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1150: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
1160: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e  tatic void lemon
1170: 5f 73 74 72 63 70 79 28 63 68 61 72 20 2a 64 65  _strcpy(char *de
1180: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1190: 73 72 63 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  src){.  while( (
11a0: 2a 28 64 65 73 74 2b 2b 29 20 3d 20 2a 28 73 72  *(dest++) = *(sr
11b0: 63 2b 2b 29 29 21 3d 30 20 29 7b 7d 0a 7d 0a 73  c++))!=0 ){}.}.s
11c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e  tatic void lemon
11d0: 5f 73 74 72 63 61 74 28 63 68 61 72 20 2a 64 65  _strcat(char *de
11e0: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
11f0: 73 72 63 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a  src){.  while( *
1200: 64 65 73 74 20 29 20 64 65 73 74 2b 2b 3b 0a 20  dest ) dest++;. 
1210: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 64 65   lemon_strcpy(de
1220: 73 74 2c 20 73 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  st, src);.}.../*
1230: 20 61 20 66 65 77 20 66 6f 72 77 61 72 64 20 64   a few forward d
1240: 65 63 6c 61 72 61 74 69 6f 6e 73 2e 2e 2e 20 2a  eclarations... *
1250: 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 3b 0a 73  /.struct rule;.s
1260: 74 72 75 63 74 20 6c 65 6d 6f 6e 3b 0a 73 74 72  truct lemon;.str
1270: 75 63 74 20 61 63 74 69 6f 6e 3b 0a 0a 73 74 61  uct action;..sta
1280: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
1290: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
12a0: 69 64 29 3b 0a 73 74 61 74 69 63 20 73 74 72 75  id);.static stru
12b0: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
12c0: 6e 5f 73 6f 72 74 28 73 74 72 75 63 74 20 61 63  n_sort(struct ac
12d0: 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  tion *);../*****
12e0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
12f0: 69 6c 65 20 22 62 75 69 6c 64 2e 68 22 20 2a 2a  ile "build.h" **
1300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  **/.void FindRul
1330: 65 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72  ePrecedences(str
1340: 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b 0a 76 6f 69  uct lemon*);.voi
1350: 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28  d FindFirstSets(
1360: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b 0a  struct lemon*);.
1370: 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28  void FindStates(
1380: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b 0a  struct lemon*);.
1390: 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73  void FindLinks(s
13a0: 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b 0a 76  truct lemon*);.v
13b0: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
13c0: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ts(struct lemon*
13d0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  );.void FindActi
13e0: 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ons(struct lemon
13f0: 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *);../********* 
1400: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63  From the file "c
1410: 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20 2a 2a 2a  onfiglist.h" ***
1420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1440: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1450: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 73 74 72 75  init(void);.stru
1460: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
1470: 67 6c 69 73 74 5f 61 64 64 28 73 74 72 75 63 74  glist_add(struct
1480: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 73   rule *, int);.s
1490: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
14a0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
14b0: 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c  s(struct rule *,
14c0: 20 69 6e 74 29 3b 0a 76 6f 69 64 20 43 6f 6e 66   int);.void Conf
14d0: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 73  iglist_closure(s
14e0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 28 76 6f 69 64 29 3b 0a 76 6f 69 64  sort(void);.void
1510: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
1520: 62 61 73 69 73 28 76 6f 69 64 29 3b 0a 73 74 72  basis(void);.str
1530: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
1540: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 76 6f  iglist_return(vo
1550: 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  id);.struct conf
1560: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
1570: 61 73 69 73 28 76 6f 69 64 29 3b 0a 76 6f 69 64  asis(void);.void
1580: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
1590: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
15a0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
15b0: 74 5f 72 65 73 65 74 28 76 6f 69 64 29 3b 0a 0a  t_reset(void);..
15c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  /********* From 
15d0: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
15e0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
15f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
1610: 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20   ErrorMsg(const 
1620: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 63 6f 6e 73  char *, int,cons
1630: 74 20 63 68 61 72 20 2a 2c 20 2e 2e 2e 29 3b 0a  t char *, ...);.
1640: 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ./****** From th
1650: 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 68  e file "option.h
1660: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 65 6e  ************/.en
1690: 75 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 7b  um option_type {
16a0: 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50   OPT_FLAG=1,  OP
16b0: 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c  T_INT,  OPT_DBL,
16c0: 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20 20 20    OPT_STR,.     
16d0: 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f      OPT_FFLAG, O
16e0: 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42  PT_FINT, OPT_FDB
16f0: 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 3b 0a 73 74  L, OPT_FSTR};.st
1700: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 7b  ruct s_options {
1710: 0a 20 20 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74  .  enum option_t
1720: 79 70 65 20 74 79 70 65 3b 0a 20 20 63 6f 6e 73  ype type;.  cons
1730: 74 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20  t char *label;. 
1740: 20 63 68 61 72 20 2a 61 72 67 3b 0a 20 20 63 6f   char *arg;.  co
1750: 6e 73 74 20 63 68 61 72 20 2a 6d 65 73 73 61 67  nst char *messag
1760: 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74  e;.};.int    Opt
1770: 49 6e 69 74 28 63 68 61 72 2a 2a 2c 73 74 72 75  Init(char**,stru
1780: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49  ct s_options*,FI
1790: 4c 45 2a 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74  LE*);.int    Opt
17a0: 4e 41 72 67 73 28 76 6f 69 64 29 3b 0a 63 68 61  NArgs(void);.cha
17b0: 72 20 20 2a 4f 70 74 41 72 67 28 69 6e 74 29 3b  r  *OptArg(int);
17c0: 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28 69  .void   OptErr(i
17d0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50  nt);.void   OptP
17e0: 72 69 6e 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a  rint(void);../**
17f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1800: 66 69 6c 65 20 22 70 61 72 73 65 2e 68 22 20 2a  file "parse.h" *
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 76 6f 69 64 20 50  ********/.void P
1840: 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  arse(struct lemo
1850: 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f 2a 2a 2a 2a  n *lemp);../****
1860: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1870: 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a 2a  ile "plink.h" **
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a0: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70 6c  *****/.struct pl
18b0: 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76  ink *Plink_new(v
18c0: 6f 69 64 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b  oid);.void Plink
18d0: 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e  _add(struct plin
18e0: 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  k **, struct con
18f0: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 50 6c 69  fig *);.void Pli
1900: 6e 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70  nk_copy(struct p
1910: 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20  link **, struct 
1920: 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f 69 64 20 50  plink *);.void P
1930: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 73 74 72 75  link_delete(stru
1940: 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 0a 2f 2a  ct plink *);../*
1950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1960: 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
1970: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1990: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 52  ********/.void R
19a0: 65 70 72 69 6e 74 28 73 74 72 75 63 74 20 6c 65  eprint(struct le
19b0: 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70  mon *);.void Rep
19c0: 6f 72 74 4f 75 74 70 75 74 28 73 74 72 75 63 74  ortOutput(struct
19d0: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
19e0: 52 65 70 6f 72 74 54 61 62 6c 65 28 73 74 72 75  ReportTable(stru
19f0: 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 69 6e 74 29  ct lemon *, int)
1a00: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  ;.void ReportHea
1a10: 64 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  der(struct lemon
1a20: 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65   *);.void Compre
1a30: 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20  ssTables(struct 
1a40: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 52  lemon *);.void R
1a50: 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75  esortStates(stru
1a60: 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 0a 2f 2a  ct lemon *);../*
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1a80: 68 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20  he file "set.h" 
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20  ********/.void  
1ac0: 53 65 74 53 69 7a 65 28 69 6e 74 29 3b 20 20 20  SetSize(int);   
1ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1ae0: 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20 6f 66   sets will be of
1af0: 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61 72 20   size N */.char 
1b00: 2a 53 65 74 4e 65 77 28 76 6f 69 64 29 3b 20 20  *SetNew(void);  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b20: 41 20 6e 65 77 20 73 65 74 20 66 6f 72 20 65 6c  A new set for el
1b30: 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f  ement 0..N */.vo
1b40: 69 64 20 20 53 65 74 46 72 65 65 28 63 68 61 72  id  SetFree(char
1b50: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
1b60: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
1b70: 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  set */.int SetAd
1b80: 64 28 63 68 61 72 2a 2c 69 6e 74 29 3b 20 20 20  d(char*,int);   
1b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1ba0: 65 6c 65 6d 65 6e 74 20 74 6f 20 61 20 73 65 74  element to a set
1bb0: 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
1bc0: 28 63 68 61 72 20 2a 2c 63 68 61 72 20 2a 29 3b  (char *,char *);
1bd0: 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20      /* A <- A U 
1be0: 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e 74 20  B, thru element 
1bf0: 4e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 65 74  N */.#define Set
1c00: 46 69 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29  Find(X,Y) (X[Y])
1c10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c20: 66 20 59 20 69 73 20 69 6e 20 73 65 74 20 58 20  f Y is in set X 
1c30: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  */../********** 
1c40: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1c50: 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  truct.h" *******
1c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c80: 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20  /*.** Principal 
1c90: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
1ca0: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1cb0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1cc0: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  */..typedef enum
1cd0: 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c   {LEMON_FALSE=0,
1ce0: 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f   LEMON_TRUE} Boo
1cf0: 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c  lean;../* Symbol
1d00: 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  s (terminals and
1d10: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f   nonterminals) o
1d20: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72  f the grammar ar
1d30: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  e stored.** in t
1d40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
1d50: 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70  .enum symbol_typ
1d60: 65 20 7b 0a 20 20 54 45 52 4d 49 4e 41 4c 2c 0a  e {.  TERMINAL,.
1d70: 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20    NONTERMINAL,. 
1d80: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 0a 7d   MULTITERMINAL.}
1d90: 3b 0a 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b  ;.enum e_assoc {
1da0: 0a 20 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52  .    LEFT,.    R
1db0: 49 47 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a  IGHT,.    NONE,.
1dc0: 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63      UNK.};.struc
1dd0: 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e  t symbol {.  con
1de0: 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  st char *name;  
1df0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1e00: 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20   the symbol */. 
1e10: 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20   int index;     
1e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1e30: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
1e40: 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  is symbol */.  e
1e50: 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20  num symbol_type 
1e60: 74 79 70 65 3b 20 20 20 2f 2a 20 53 79 6d 62 6f  type;   /* Symbo
1e70: 6c 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ls are all eithe
1e80: 72 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e  r TERMINALS or N
1e90: 54 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  Ts */.  struct r
1ea0: 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20  ule *rule;      
1eb0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1ec0: 6f 66 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73  of rules of this
1ed0: 20 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20   (if an NT) */. 
1ee0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1ef0: 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c  fallback; /* fal
1f00: 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63  lback token in c
1f10: 61 73 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64  ase this token d
1f20: 6f 65 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a  oesn't parse */.
1f30: 20 20 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20    int prec;     
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1f50: 65 63 65 64 65 6e 63 65 20 69 66 20 64 65 66 69  ecedence if defi
1f60: 6e 65 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73  ned (-1 otherwis
1f70: 65 29 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  e) */.  enum e_a
1f80: 73 73 6f 63 20 61 73 73 6f 63 3b 20 20 20 20 20  ssoc assoc;     
1f90: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
1fa0: 79 20 69 66 20 70 72 65 63 65 64 65 6e 63 65 20  y if precedence 
1fb0: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
1fc0: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1fe0: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
1ff0: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
2000: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
2010: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
2020: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
2030: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
2040: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
2050: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 6e 74 3b  */.  int useCnt;
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
2080: 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
2090: 2a 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20  *destructor;    
20a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63      /* Code whic
20b0: 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
20c0: 76 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  ver this symbol 
20d0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20f0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
2100: 20 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72   stack during er
2110: 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ror processing *
2120: 2f 0a 20 20 69 6e 74 20 64 65 73 74 4c 69 6e 65  /.  int destLine
2130: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no;          /* 
2140: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
2150: 73 74 61 72 74 20 6f 66 20 64 65 73 74 72 75 63  start of destruc
2160: 74 6f 72 2e 20 20 53 65 74 20 74 6f 0a 20 20 20  tor.  Set to.   
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 2a 2a 20 2d 31 20 66 6f          ** -1 fo
2190: 72 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74  r duplicate dest
21a0: 72 75 63 74 6f 72 73 2e 20 2a 2f 0a 20 20 63 68  ructors. */.  ch
21b0: 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20 20  ar *datatype;   
21c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
21d0: 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f 72  ta type of infor
21e0: 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20 74  mation held by t
21f0: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2210: 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75  * object. Only u
2220: 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e  sed if type==NON
2230: 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e  TERMINAL */.  in
2240: 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  t dtnum;        
2250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2260: 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 20  ta type number. 
2270: 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   In the parser, 
2280: 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 73       ** stack is
22b0: 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e   a union.  The .
22c0: 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  yy%d element of 
22d0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65 20  ** union is the 
2300: 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79 70  correct data typ
2310: 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65 63  e for this objec
2320: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6f 6e 74  t */.  int bCont
2330: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
2340: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2350: 73 79 6d 62 6f 6c 20 65 76 65 72 20 63 61 72 72  symbol ever carr
2360: 69 65 73 20 63 6f 6e 74 65 6e 74 20 2d 20 69 66  ies content - if
2370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2380: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2390: 74 20 69 73 20 65 76 65 72 20 6d 6f 72 65 20 74  t is ever more t
23a0: 68 61 6e 20 6a 75 73 74 20 73 79 6e 74 61 78 20  han just syntax 
23b0: 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  */.  /* The foll
23c0: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
23d0: 20 75 73 65 64 20 62 79 20 4d 55 4c 54 49 54 45   used by MULTITE
23e0: 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20 2a 2f 0a  RMINALs only */.
23f0: 20 20 69 6e 74 20 6e 73 75 62 73 79 6d 3b 20 20    int nsubsym;  
2400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2410: 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 69 74 75  mber of constitu
2420: 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  ent symbols in t
2430: 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20 20 73 74  he MULTI */.  st
2440: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 75  ruct symbol **su
2450: 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  bsym;  /* Array 
2460: 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73  of constituent s
2470: 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ymbols */.};../*
2480: 20 45 61 63 68 20 70 72 6f 64 75 63 74 69 6f 6e   Each production
2490: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
24a0: 6d 6d 61 72 20 69 73 20 73 74 6f 72 65 64 20 69  mmar is stored i
24b0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
24c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ** structure.  *
24d0: 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 20 7b 0a  /.struct rule {.
24e0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
24f0: 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a 20 4c 65  *lhs;      /* Le
2500: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
2510: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f  the rule */.  co
2520: 6e 73 74 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  nst char *lhsali
2530: 61 73 3b 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  as;    /* Alias 
2540: 66 6f 72 20 74 68 65 20 4c 48 53 20 28 4e 55 4c  for the LHS (NUL
2550: 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20  L if none) */.  
2560: 69 6e 74 20 6c 68 73 53 74 61 72 74 3b 20 20 20  int lhsStart;   
2570: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2580: 20 69 66 20 6c 65 66 74 2d 68 61 6e 64 20 73 69   if left-hand si
2590: 64 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20  de is the start 
25a0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20  symbol */.  int 
25b0: 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20 20 20 20  ruleline;       
25c0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
25d0: 62 65 72 20 66 6f 72 20 74 68 65 20 72 75 6c 65  ber for the rule
25e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 48 53 20  * Number of RHS 
2610: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2620: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73  uct symbol **rhs
2630: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 52 48 53  ;     /* The RHS
2640: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f   symbols */.  co
2650: 6e 73 74 20 63 68 61 72 20 2a 2a 72 68 73 61 6c  nst char **rhsal
2660: 69 61 73 3b 20 20 20 2f 2a 20 41 6e 20 61 6c 69  ias;   /* An ali
2670: 61 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  as for each RHS 
2680: 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20  symbol (NULL if 
2690: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c  none) */.  int l
26a0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
26b0: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
26c0: 65 72 20 61 74 20 77 68 69 63 68 20 63 6f 64 65  er at which code
26d0: 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 63 6f 6e   begins */.  con
26e0: 73 74 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20  st char *code;  
26f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
2700: 65 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20  e executed when 
2710: 74 68 69 73 20 72 75 6c 65 20 69 73 20 72 65 64  this rule is red
2720: 75 63 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uced */.  const 
2730: 63 68 61 72 20 2a 63 6f 64 65 50 72 65 66 69 78  char *codePrefix
2740: 3b 20 20 2f 2a 20 53 65 74 75 70 20 63 6f 64 65  ;  /* Setup code
2750: 20 62 65 66 6f 72 65 20 63 6f 64 65 5b 5d 20 61   before code[] a
2760: 62 6f 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  bove */.  const 
2770: 63 68 61 72 20 2a 63 6f 64 65 53 75 66 66 69 78  char *codeSuffix
2780: 3b 20 20 2f 2a 20 42 72 65 61 6b 64 6f 77 6e 20  ;  /* Breakdown 
2790: 63 6f 64 65 20 61 66 74 65 72 20 63 6f 64 65 5b  code after code[
27a0: 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e 74  ] above */.  int
27b0: 20 6e 6f 43 6f 64 65 3b 20 20 20 20 20 20 20 20   noCode;        
27c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
27d0: 20 74 68 69 73 20 72 75 6c 65 20 68 61 73 20 6e   this rule has n
27e0: 6f 20 61 73 73 6f 63 69 61 74 65 64 20 43 20 63  o associated C c
27f0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 64  ode */.  int cod
2800: 65 45 6d 69 74 74 65 64 3b 20 20 20 20 20 20 20  eEmitted;       
2810: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2820: 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 65   code has been e
2830: 6d 69 74 74 65 64 20 61 6c 72 65 61 64 79 20 2a  mitted already *
2840: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2850: 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20  l *precsym;  /* 
2860: 50 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  Precedence symbo
2870: 6c 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20  l for this rule 
2880: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a0: 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72   An index number
28b0: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
28c0: 2f 0a 20 20 69 6e 74 20 69 52 75 6c 65 3b 20 20  /.  int iRule;  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e0: 52 75 6c 65 20 6e 75 6d 62 65 72 20 61 73 20 75  Rule number as u
28f0: 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72  sed in the gener
2900: 61 74 65 64 20 74 61 62 6c 65 73 20 2a 2f 0a 20  ated tables */. 
2910: 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75   Boolean canRedu
2920: 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ce;       /* Tru
2930: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69  e if this rule i
2940: 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a  s ever reduced *
2950: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 64 6f 65 73  /.  Boolean does
2960: 52 65 64 75 63 65 3b 20 20 20 20 20 20 2f 2a 20  Reduce;      /* 
2970: 52 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 6f  Reduce actions o
2980: 63 63 75 72 20 61 66 74 65 72 20 6f 70 74 69 6d  ccur after optim
2990: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  ization */.  str
29a0: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68  uct rule *nextlh
29b0: 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75  s;    /* Next ru
29c0: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
29d0: 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72 75 63 74   LHS */.  struct
29e0: 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20   rule *next;    
29f0: 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20     /* Next rule 
2a00: 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  in the global li
2a10: 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63  st */.};../* A c
2a20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20  onfiguration is 
2a30: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  a production rul
2a40: 65 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  e of the grammar
2a50: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
2a60: 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74 29 20 73  * a mark (dot) s
2a70: 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75 63 68 20  howing how much 
2a80: 6f 66 20 74 68 61 74 20 72 75 6c 65 20 68 61 73  of that rule has
2a90: 20 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20   been processed 
2aa0: 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69  so far..** Confi
2ab0: 67 75 72 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63  gurations also c
2ac0: 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d  ontain a follow-
2ad0: 73 65 74 20 77 68 69 63 68 20 69 73 20 61 20 6c  set which is a l
2ae0: 69 73 74 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a  ist of terminal.
2af0: 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  ** symbols which
2b00: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
2b10: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
2b20: 6f 77 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ow the end of th
2b30: 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79  e rule..** Every
2b40: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
2b50: 73 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e  s recorded as an
2b60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2b70: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65   following: */.e
2b80: 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20 7b 0a  num cfgstatus {.
2b90: 20 20 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 49 4e    COMPLETE,.  IN
2ba0: 43 4f 4d 50 4c 45 54 45 0a 7d 3b 0a 73 74 72 75  COMPLETE.};.stru
2bb0: 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20 73 74  ct config {.  st
2bc0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75         /* The ru
2be0: 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 68  le upon which th
2bf0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2c00: 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20 69 6e  is based */.  in
2c10: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
2c20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2c30: 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 63  rse point */.  c
2c40: 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20 20 20  har *fws;       
2c50: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f          /* Follo
2c60: 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73 20 63  w-set for this c
2c70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 6e 6c  onfiguration onl
2c80: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c  y */.  struct pl
2c90: 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20 20 20  ink *fplp;      
2ca0: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
2cb0: 72 77 61 72 64 20 70 72 6f 70 61 67 61 74 69 6f  rward propagatio
2cc0: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
2cd0: 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b  uct plink *bplp;
2ce0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2cf0: 73 65 74 20 62 61 63 6b 77 61 72 64 73 20 70 72  set backwards pr
2d00: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
2d10: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
2d20: 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20 2f 2a  e *stp;       /*
2d30: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 61 74   Pointer to stat
2d40: 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  e which contains
2d50: 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75 6d 20   this */.  enum 
2d60: 63 66 67 73 74 61 74 75 73 20 73 74 61 74 75 73  cfgstatus status
2d70: 3b 20 20 20 2f 2a 20 75 73 65 64 20 64 75 72 69  ;   /* used duri
2d80: 6e 67 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64  ng followset and
2d90: 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61 74 69   shift computati
2da0: 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
2db0: 63 6f 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20  config *next;   
2dc0: 20 20 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67    /* Next config
2dd0: 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  uration in the s
2de0: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2df0: 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20   config *bp;    
2e00: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62     /* The next b
2e10: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
2e20: 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 65 6e 75 6d 20 65  on */.};..enum e
2e30: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 53 48 49 46  _action {.  SHIF
2e40: 54 2c 0a 20 20 41 43 43 45 50 54 2c 0a 20 20 52  T,.  ACCEPT,.  R
2e50: 45 44 55 43 45 2c 0a 20 20 45 52 52 4f 52 2c 0a  EDUCE,.  ERROR,.
2e60: 20 20 53 53 43 4f 4e 46 4c 49 43 54 2c 20 20 20    SSCONFLICT,   
2e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
2e80: 73 68 69 66 74 2f 73 68 69 66 74 20 63 6f 6e 66  shift/shift conf
2e90: 6c 69 63 74 20 2a 2f 0a 20 20 53 52 43 4f 4e 46  lict */.  SRCONF
2ea0: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2eb0: 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75     /* Was a redu
2ec0: 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20  ce, but part of 
2ed0: 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  a conflict */.  
2ee0: 52 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  RRCONFLICT,     
2ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2f00: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2f10: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2f20: 20 2a 2f 0a 20 20 53 48 5f 52 45 53 4f 4c 56 45   */.  SH_RESOLVE
2f30: 44 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  D,             /
2f40: 2a 20 57 61 73 20 61 20 73 68 69 66 74 2e 20 20  * Was a shift.  
2f50: 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c  Precedence resol
2f60: 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ved conflict */.
2f70: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
2f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2f90: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
2fa0: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
2fb0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 4e 4f 54  onflict */.  NOT
2fc0: 5f 55 53 45 44 2c 20 20 20 20 20 20 20 20 20 20  _USED,          
2fd0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 64        /* Deleted
2fe0: 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20   by compression 
2ff0: 2a 2f 0a 20 20 53 48 49 46 54 52 45 44 55 43 45  */.  SHIFTREDUCE
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 53 68 69 66 74 20 66 69 72 73 74 2c 20 74 68   Shift first, th
3020: 65 6e 20 72 65 64 75 63 65 20 2a 2f 0a 7d 3b 0a  en reduce */.};.
3030: 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20  ./* Every shift 
3040: 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74  or reduce operat
3050: 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73  ion is stored as
3060: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
3070: 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20  owing */.struct 
3080: 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63  action {.  struc
3090: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
30a0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d      /* The look-
30b0: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a  ahead symbol */.
30c0: 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20    enum e_action 
30d0: 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a  type;.  union {.
30e0: 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65      struct state
30f0: 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68   *stp;     /* Th
3100: 65 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20  e new state, if 
3110: 61 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73  a shift */.    s
3120: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20  truct rule *rp; 
3130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c        /* The rul
3140: 65 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a  e, if a reduce *
3150: 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63  /.  } x;.  struc
3160: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 4f 70 74 3b  t symbol *spOpt;
3170: 20 20 20 20 2f 2a 20 53 48 49 46 54 52 45 44 55      /* SHIFTREDU
3180: 43 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CE optimization 
3190: 74 6f 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  to this symbol *
31a0: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
31b0: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
31c0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
31d0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
31e0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
31f0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
3200: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
3210: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
3220: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
3230: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
3240: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
3250: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
3260: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
3270: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3280: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3290: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
32a0: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
32b0: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
32c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
32d0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
32e0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
32f0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
3300: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
3310: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
3320: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
3330: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75  */.  int statenu
3340: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
3350: 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62   Sequential numb
3360: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
3370: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
3380: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
3390: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 63 74 69 6f  /* List of actio
33a0: 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  ns for this stat
33b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e 41  e */.  int nTknA
33c0: 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20 20  ct, nNtAct;     
33d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
33e0: 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61 6c  ions on terminal
33f0: 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  s and nontermina
3400: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b 6e  ls */.  int iTkn
3410: 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20 20  Ofst, iNtOfst;  
3420: 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20   /* yy_action[] 
3430: 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d 69  offset for termi
3440: 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  nals and nonterm
3450: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c 74  s */.  int iDflt
3460: 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20 20  Reduce;         
3470: 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f  /* Default actio
3480: 6e 20 69 73 20 74 6f 20 52 45 44 55 43 45 20 62  n is to REDUCE b
3490: 79 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  y this rule */. 
34a0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 44   struct rule *pD
34b0: 66 6c 74 52 65 64 75 63 65 3b 2f 2a 20 54 68 65  fltReduce;/* The
34c0: 20 64 65 66 61 75 6c 74 20 52 45 44 55 43 45 20   default REDUCE 
34d0: 72 75 6c 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 61  rule. */.  int a
34e0: 75 74 6f 52 65 64 75 63 65 3b 20 20 20 20 20 20  utoReduce;      
34f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3500: 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 72  his is an auto-r
3510: 65 64 75 63 65 20 73 74 61 74 65 20 2a 2f 0a 7d  educe state */.}
3520: 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46  ;.#define NO_OFF
3530: 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34 37  SET (-2147483647
3540: 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65  )../* A followse
3550: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  t propagation li
3560: 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  nk indicates tha
3570: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
3580: 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75  f one.** configu
3590: 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74  ration followset
35a0: 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61   should be propa
35b0: 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72  gated to another
35c0: 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65   whenever.** the
35d0: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20   first changes. 
35e0: 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
35f0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
3600: 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20  g *cfp;      /* 
3610: 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  The configuratio
3620: 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65  n to which linke
3630: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c  d */.  struct pl
3640: 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20  ink *next;      
3650: 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70  /* The next prop
3660: 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b  agate link */.};
3670: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76  ../* The state v
3680: 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e  ector for the en
3690: 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e 65  tire parser gene
36a0: 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65  rator is recorde
36b0: 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e  d as.** follows.
36c0: 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f    (LEMON uses no
36d0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
36e0: 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74  s and makes litt
36f0: 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61  le use of.** sta
3700: 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20  tic variables.  
3710: 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f  Fields in the fo
3720: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3730: 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74  e can be thought
3740: 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20  .** of as begin 
3750: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3760: 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   in the program.
3770: 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ) */.struct lemo
3780: 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  n {.  struct sta
3790: 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f  te **sorted;   /
37a0: 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65  * Table of state
37b0: 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61 74  s sorted by stat
37c0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74  e number */.  st
37d0: 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b  ruct rule *rule;
37e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
37f0: 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20  f all rules */. 
3800: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 73 74   struct rule *st
3810: 61 72 74 52 75 6c 65 3b 20 20 2f 2a 20 46 69 72  artRule;  /* Fir
3820: 73 74 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  st rule */.  int
3830: 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20   nstate;        
3840: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3850: 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69  of states */.  i
3860: 6e 74 20 6e 78 73 74 61 74 65 3b 20 20 20 20 20  nt nxstate;     
3870: 20 20 20 20 20 20 20 20 2f 2a 20 6e 73 74 61 74          /* nstat
3880: 65 20 77 69 74 68 20 74 61 69 6c 20 64 65 67 65  e with tail dege
3890: 6e 65 72 61 74 65 20 73 74 61 74 65 73 20 72 65  nerate states re
38a0: 6d 6f 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  moved */.  int n
38b0: 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  rule;           
38c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
38d0: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
38e0: 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20  nsymbol;        
38f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3900: 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e  f terminal and n
3910: 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  onterminal symbo
3920: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72  ls */.  int nter
3930: 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  minal;          
3940: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
3950: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
3960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 53 68 69 66 74  /.  int minShift
3970: 52 65 64 75 63 65 3b 20 20 20 20 20 20 2f 2a 20  Reduce;      /* 
3980: 4d 69 6e 69 6d 75 6d 20 73 68 69 66 74 2d 72 65  Minimum shift-re
3990: 64 75 63 65 20 61 63 74 69 6f 6e 20 76 61 6c 75  duce action valu
39a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 41 63  e */.  int errAc
39b0: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
39c0: 2f 2a 20 45 72 72 6f 72 20 61 63 74 69 6f 6e 20  /* Error action 
39d0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 61  value */.  int a
39e0: 63 63 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  ccAction;       
39f0: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 20 61 63      /* Accept ac
3a00: 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  tion value */.  
3a10: 69 6e 74 20 6e 6f 41 63 74 69 6f 6e 3b 20 20 20  int noAction;   
3a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f           /* No-o
3a30: 70 20 61 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a  p action value *
3a40: 2f 0a 20 20 69 6e 74 20 6d 69 6e 52 65 64 75 63  /.  int minReduc
3a50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a60: 4d 69 6e 69 6d 75 6d 20 72 65 64 75 63 65 20 61  Minimum reduce a
3a70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d  ction */.  int m
3a80: 61 78 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  axAction;       
3a90: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
3aa0: 63 74 69 6f 6e 20 76 61 6c 75 65 20 6f 66 20 61  ction value of a
3ab0: 6e 79 20 6b 69 6e 64 20 2a 2f 0a 20 20 73 74 72  ny kind */.  str
3ac0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
3ad0: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
3ae0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
3af0: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
3b00: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
3b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b20: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
3b30: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
3b40: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
3b50: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
3b60: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
3b70: 62 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f  bol *wildcard; /
3b80: 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74  * Token that mat
3b90: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ches anything */
3ba0: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3bc0: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
3bd0: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
3be0: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
3bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
3c00: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
3c10: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
3c20: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
3c30: 20 2a 63 74 78 3b 20 20 20 20 20 20 20 20 20 20   *ctx;          
3c40: 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74       /* Declarat
3c50: 69 6f 6e 20 6f 66 20 32 6e 64 20 61 72 67 75 6d  ion of 2nd argum
3c60: 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ent to construct
3c70: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  or */.  char *to
3c80: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
3c90: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
3ca0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
3cb0: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
3cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
3cd0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
3ce0: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
3cf0: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
3d00: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
3d10: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3d30: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
3d40: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
3d50: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
3d60: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
3d70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
3d80: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
3d90: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
3da0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3db0: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
3dc0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
3dd0: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  C file */.  char
3de0: 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20   *error;        
3df0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3e00: 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20  execute when an 
3e10: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  error is seen */
3e20: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
3e30: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
3e40: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
3e50: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
3e60: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61  ow */.  char *fa
3e70: 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20  ilure;          
3e80: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
3e90: 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61  ute on parser fa
3ea0: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
3eb0: 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20  *accept;        
3ec0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
3ed0: 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20  xecute when the 
3ee0: 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a  parser excepts *
3ef0: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
3f00: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
3f10: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
3f20: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
3f30: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
3f40: 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20  okendest;       
3f50: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3f60: 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20  cute to destroy 
3f70: 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20  token data */.  
3f80: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
3f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
3fa0: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
3fb0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
3fc0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68  structor */.  ch
3fd0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
3fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3ff0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
4000: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
4010: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
4020: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
4030: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
4040: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
4050: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
4060: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
4070: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
4080: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
4090: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
40a0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
40b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
40c0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
40d0: 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61 62    int nactiontab
40e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
40f0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4100: 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  in the yy_action
4110: 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  [] table */.  in
4120: 74 20 6e 6c 6f 6f 6b 61 68 65 61 64 74 61 62 3b  t nlookaheadtab;
4130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4140: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 79   of entries in y
4150: 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f  y_lookahead[] */
4160: 0a 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65  .  int tablesize
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
4180: 6f 74 61 6c 20 74 61 62 6c 65 20 73 69 7a 65 20  otal table size 
4190: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
41a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
41b0: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
41c0: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
41d0: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
41e0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
41f0: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
4200: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4210: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
4220: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
4230: 61 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ammar */.  int n
4240: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20  olinenosflag;   
4250: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23      /* True if #
4260: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20  line statements 
4270: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72  should not be pr
4280: 69 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  inted */.  char 
4290: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
42a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
42b0: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
42c0: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
42d0: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
42e0: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
42f0: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
4300: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
4310: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
4320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
4330: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
4340: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
4350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
4370: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
4380: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
4390: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
43a0: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
43b0: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
43c0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
43e0: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
43f0: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
4400: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
4410: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
4420: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
4430: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
4440: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
4450: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
4460: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
4470: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
4480: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
4490: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
44a0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
44b0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20  enerator..*/./* 
44c0: 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e  Routines for han
44d0: 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20  dling a strings 
44e0: 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  */..const char *
44f0: 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68  Strsafe(const ch
4500: 61 72 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72  ar *);..void Str
4510: 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  safe_init(void);
4520: 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
4530: 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ert(const char *
4540: 29 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  );.const char *S
4550: 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73  trsafe_find(cons
4560: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52  t char *);../* R
4570: 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64  outines for hand
4580: 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20  ling symbols of 
4590: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a  the grammar */..
45a0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
45b0: 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
45c0: 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d  char *);.int Sym
45d0: 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f  bolcmpp(const vo
45e0: 69 64 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64  id *, const void
45f0: 20 2a 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c   *);.void Symbol
4600: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4610: 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
4620: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20  truct symbol *, 
4630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73  const char *);.s
4640: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
4650: 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20  mbol_find(const 
4660: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4670: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e  symbol *Symbol_N
4680: 74 68 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d  th(int);.int Sym
4690: 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b  bol_count(void);
46a0: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
46b0: 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28  *Symbol_arrayof(
46c0: 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  void);../* Routi
46d0: 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68  nes to manage th
46e0: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
46f0: 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  ..int Configcmp(
4700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f  const char *, co
4710: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
4720: 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
4730: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
4740: 20 53 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64   State_init(void
4750: 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73  );.int State_ins
4760: 65 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65  ert(struct state
4770: 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69   *, struct confi
4780: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61  g *);.struct sta
4790: 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73  te *State_find(s
47a0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b  truct config *);
47b0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
47c0: 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 76 6f  State_arrayof(vo
47d0: 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  id);../* Routine
47e0: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
47f0: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
4800: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
4810: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
4820: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f 6e  t(void);.int Con
4830: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
4840: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
4850: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
4860: 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
4870: 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
4880: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  *);.void Configt
4890: 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
48a0: 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
48b0: 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *));../*********
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
48d0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
48e0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
4910: 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61  es processing pa
4920: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20  rser actions in 
4930: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
4940: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
4950: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
4960: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20  w parser action 
4970: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4980: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
4990: 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  new(void){.  sta
49a0: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
49b0: 6e 20 2a 61 63 74 69 6f 6e 66 72 65 65 6c 69 73  n *actionfreelis
49c0: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
49d0: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
49e0: 6e 3b 0a 0a 20 20 69 66 28 20 61 63 74 69 6f 6e  n;..  if( action
49f0: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
4a00: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4a10: 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
4a20: 20 61 63 74 69 6f 6e 66 72 65 65 6c 69 73 74 20   actionfreelist 
4a30: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4a40: 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73   *)calloc(amt, s
4a50: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74  izeof(struct act
4a60: 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 61  ion));.    if( a
4a70: 63 74 69 6f 6e 66 72 65 65 6c 69 73 74 3d 3d 30  ctionfreelist==0
4a80: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4a90: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
4aa0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
4ab0: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
4ac0: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
4ad0: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
4ae0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4af0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
4b00: 61 63 74 69 6f 6e 66 72 65 65 6c 69 73 74 5b 69  actionfreelist[i
4b10: 5d 2e 6e 65 78 74 20 3d 20 26 61 63 74 69 6f 6e  ].next = &action
4b20: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
4b30: 20 20 20 61 63 74 69 6f 6e 66 72 65 65 6c 69 73     actionfreelis
4b40: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4b50: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4b60: 6f 6e 20 3d 20 61 63 74 69 6f 6e 66 72 65 65 6c  on = actionfreel
4b70: 69 73 74 3b 0a 20 20 61 63 74 69 6f 6e 66 72 65  ist;.  actionfre
4b80: 65 6c 69 73 74 20 3d 20 61 63 74 69 6f 6e 66 72  elist = actionfr
4b90: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
4ba0: 72 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e  return newaction
4bb0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
4bc0: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
4bd0: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
4be0: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
4bf0: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
4c00: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
4c10: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
4c20: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
4c30: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
4c40: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
4c50: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
4c60: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
4c70: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
4c80: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
4c90: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
4ca0: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
4cb0: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
4cc0: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
4cd0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
4ce0: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
4cf0: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
4d00: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
4d10: 3d 3d 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70  ==0 && (ap1->typ
4d20: 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31  e==REDUCE || ap1
4d30: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44  ->type==SHIFTRED
4d40: 55 43 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  UCE) ){.    rc =
4d50: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
4d60: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
4d70: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
4d80: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4d90: 3d 20 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61  = (int) (ap2 - a
4da0: 70 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p1);.  }.  retur
4db0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
4dc0: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
4dd0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4de0: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
4df0: 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61  sort(.  struct a
4e00: 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61  ction *ap.){.  a
4e10: 70 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  p = (struct acti
4e20: 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  on *)msort((char
4e30: 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26   *)ap,(char **)&
4e40: 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20  ap->next,.      
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28          (int(*)(
4e70: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
4e80: 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63  t char*))actionc
4e90: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70  mp);.  return ap
4ea0: 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e  ;.}..void Action
4eb0: 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 61  _add(.  struct a
4ec0: 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65  ction **app,.  e
4ed0: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
4ee0: 65 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  e,.  struct symb
4ef0: 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a  ol *sp,.  char *
4f00: 61 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  arg.){.  struct 
4f10: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
4f20: 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d  n;.  newaction =
4f30: 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20   Action_new();. 
4f40: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74   newaction->next
4f50: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
4f60: 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e  = newaction;.  n
4f70: 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d  ewaction->type =
4f80: 20 74 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69   type;.  newacti
4f90: 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e  on->sp = sp;.  n
4fa0: 65 77 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20  ewaction->spOpt 
4fb0: 3d 20 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d  = 0;.  if( type=
4fc0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
4fd0: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
4fe0: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
4ff0: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
5000: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
5010: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
5020: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
5030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5040: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
5050: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5060: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
5070: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
5080: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
5090: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
50a0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
50b0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
50c0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
50d0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
50e0: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
50f0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
5100: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
5110: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
5120: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5130: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
5140: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
5150: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
5160: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
5170: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
5180: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
5190: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
51a0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
51b0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
51c0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
51d0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
51e0: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
51f0: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
5200: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
5210: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
5220: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
5230: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
5240: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
5250: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
5260: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
5270: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
5280: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
5290: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
52a0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
52b0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
52c0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
52d0: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
52e0: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
52f0: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
5300: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
5310: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
5320: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
5330: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
5340: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
5350: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
5360: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
5370: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
5380: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
5390: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
53a0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
53b0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
53c0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
53d0: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
53e0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
53f0: 68 65 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f  hen the.** actio
5400: 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67  ns for that sing
5410: 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20  le state_number 
5420: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20  are placed into 
5430: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a  the aAction[].**
5440: 20 61 72 72 61 79 20 77 69 74 68 20 61 20 73 69   array with a si
5450: 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74  ngle call to act
5460: 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54  tab_insert().  T
5470: 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  he acttab_insert
5480: 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  () call.** also 
5490: 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b  resets the aLook
54a0: 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e  ahead[] array in
54b0: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
54c0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61   the next.** sta
54d0: 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  te number..*/.st
54e0: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
54f0: 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f  ction {.  int lo
5500: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5510: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
5520: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74   the lookahead t
5530: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63  oken */.  int ac
5540: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
5550: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74       /* Action t
5560: 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69  o take on the gi
5570: 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f  ven lookahead */
5580: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
5590: 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61 62  ct acttab acttab
55a0: 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62 20  ;.struct acttab 
55b0: 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  {.  int nAction;
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
55e0: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74  ed slots in aAct
55f0: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ion[] */.  int n
5600: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20  ActionAlloc;    
5610: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
5620: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
5630: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74  Action[] */.  st
5640: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
5650: 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69  ction.    *aActi
5660: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
5670: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
5680: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
5690: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
56a0: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
56b0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
56c0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
56d0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
56e0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
56f0: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5700: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
5710: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
5720: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5730: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
5740: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
5750: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
5760: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
5770: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
5780: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
5790: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
57a0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
57b0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
57c0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
57d0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
57e0: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
57f0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
5800: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
5810: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
5820: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
5830: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
5840: 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20   nterminal;     
5850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5860: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
5870: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
5880: 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20   nsymbol;       
5890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 74            /* tot
58a0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6d  al number of sym
58b0: 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  bols */.};../* R
58c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
58d0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
58e0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
58f0: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63  le */.#define ac
5900: 74 74 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73  ttab_lookahead_s
5910: 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63  ize(X) ((X)->nAc
5920: 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61  tion)../* The va
5930: 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  lue for the N-th
5940: 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74   entry in yy_act
5950: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ion */.#define a
5960: 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58  cttab_yyaction(X
5970: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
5980: 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f  on[N].action)../
5990: 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * The value for 
59a0: 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69  the N-th entry i
59b0: 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a  n yy_lookahead *
59c0: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
59d0: 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e  _yylookahead(X,N
59e0: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
59f0: 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a  [N].lookahead)..
5a00: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  /* Free all memo
5a10: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
5a20: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 63 74  th the given act
5a30: 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74  tab */.void actt
5a40: 61 62 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a  ab_free(acttab *
5a50: 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61  p){.  free( p->a
5a60: 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65  Action );.  free
5a70: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20  ( p->aLookahead 
5a80: 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a  );.  free( p );.
5a90: 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
5aa0: 20 6e 65 77 20 61 63 74 74 61 62 20 73 74 72 75   new acttab stru
5ab0: 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20  cture */.acttab 
5ac0: 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 69 6e  *acttab_alloc(in
5ad0: 74 20 6e 73 79 6d 62 6f 6c 2c 20 69 6e 74 20 6e  t nsymbol, int n
5ae0: 74 65 72 6d 69 6e 61 6c 29 7b 0a 20 20 61 63 74  terminal){.  act
5af0: 74 61 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62  tab *p = (acttab
5b00: 20 2a 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73   *) calloc( 1, s
5b10: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
5b20: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( p==0 ){.    f
5b30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
5b40: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
5b50: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
5b60: 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20  ew acttab.");.  
5b70: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
5b80: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
5b90: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e  zeof(*p));.  p->
5ba0: 6e 73 79 6d 62 6f 6c 20 3d 20 6e 73 79 6d 62 6f  nsymbol = nsymbo
5bb0: 6c 3b 0a 20 20 70 2d 3e 6e 74 65 72 6d 69 6e 61  l;.  p->ntermina
5bc0: 6c 20 3d 20 6e 74 65 72 6d 69 6e 61 6c 3b 0a 20  l = nterminal;. 
5bd0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
5be0: 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f   Add a new actio
5bf0: 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  n to the current
5c00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
5c10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5c20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
5c30: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f  nce for each loo
5c40: 6b 61 68 65 61 64 20 66 6f 72 20 61 20 70 61 72  kahead for a par
5c50: 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65  ticular.** state
5c60: 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  ..*/.void acttab
5c70: 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a  _action(acttab *
5c80: 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64  p, int lookahead
5c90: 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20  , int action){. 
5ca0: 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65   if( p->nLookahe
5cb0: 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ad>=p->nLookahea
5cc0: 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  dAlloc ){.    p-
5cd0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
5ce0: 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61   += 25;.    p->a
5cf0: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72  Lookahead = (str
5d00: 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63  uct lookahead_ac
5d10: 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28  tion *) realloc(
5d20: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a   p->aLookahead,.
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
5d50: 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  eof(p->aLookahea
5d60: 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68  d[0])*p->nLookah
5d70: 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  eadAlloc );.    
5d80: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
5d90: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  d==0 ){.      fp
5da0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
5db0: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
5dc0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
5dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5de0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30  p->nLookahead==0
5df0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f   ){.    p->mxLoo
5e00: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5e10: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  ad;.    p->mnLoo
5e20: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5e30: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ad;.    p->mnAct
5e40: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
5e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
5e60: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f  ->mxLookahead<lo
5e70: 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c  okahead ) p->mxL
5e80: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5e90: 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  head;.    if( p-
5ea0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f  >mnLookahead>loo
5eb0: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
5ec0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
5ed0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5ee0: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
5ef0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
5f00: 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  }.  p->aLookahea
5f10: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
5f20: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  .lookahead = loo
5f30: 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f  kahead;.  p->aLo
5f40: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
5f50: 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20  ahead].action = 
5f60: 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f  action;.  p->nLo
5f70: 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  okahead++;.}../*
5f80: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e  .** Add the tran
5f90: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c  saction set buil
5fa0: 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20  t up with prior 
5fb0: 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f  calls to acttab_
5fc0: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f  action().** into
5fd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
5fe0: 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  ion table.  Then
5ff0: 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73   reset the trans
6000: 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a  action set back.
6010: 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  ** to an empty s
6020: 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  et in preparatio
6030: 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e  n for a new roun
6040: 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69  d of acttab_acti
6050: 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  on() calls..**.*
6060: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6070: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74  set into the act
6080: 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
6090: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
60a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
60b0: 61 6b 65 49 74 53 61 66 65 20 70 61 72 61 6d 65  akeItSafe parame
60c0: 74 65 72 20 69 73 20 74 72 75 65 2c 20 74 68 65  ter is true, the
60d0: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 73 20  n the offset is 
60e0: 63 68 6f 73 65 6e 20 73 6f 20 74 68 61 74 0a 2a  chosen so that.*
60f0: 2a 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  * it is impossib
6100: 6c 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 74  le to overread t
6110: 68 65 20 79 79 5f 6c 6f 6f 6b 61 73 69 64 65 5b  he yy_lookaside[
6120: 5d 20 74 61 62 6c 65 20 72 65 67 61 72 64 6c 65  ] table regardle
6130: 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 6f 6f  ss of.** the loo
6140: 6b 61 73 69 64 65 20 74 6f 6b 65 6e 2e 20 20 54  kaside token.  T
6150: 68 69 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20  his is done for 
6160: 74 68 65 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d  the terminal sym
6170: 62 6f 6c 73 2c 20 61 73 20 74 68 65 79 0a 2a 2a  bols, as they.**
6180: 20 63 6f 6d 65 20 66 72 6f 6d 20 65 78 74 65 72   come from exter
6190: 6e 61 6c 20 69 6e 70 75 74 73 20 61 6e 64 20 63  nal inputs and c
61a0: 61 6e 20 63 6f 6e 74 61 69 6e 20 73 79 6e 74 61  an contain synta
61b0: 78 20 65 72 72 6f 72 73 2e 20 20 57 68 65 6e 20  x errors.  When 
61c0: 6d 61 6b 65 49 74 53 61 66 65 0a 2a 2a 20 69 73  makeItSafe.** is
61d0: 20 66 61 6c 73 65 2c 20 74 68 65 72 65 20 69 73   false, there is
61e0: 20 6d 6f 72 65 20 66 6c 65 78 69 62 69 6c 69 74   more flexibilit
61f0: 79 20 69 6e 20 73 65 6c 65 63 74 69 6e 67 20 6f  y in selecting o
6200: 66 66 73 65 74 73 2c 20 72 65 73 75 6c 74 69 6e  ffsets, resultin
6210: 67 20 69 6e 0a 2a 2a 20 61 20 73 6d 61 6c 6c 65  g in.** a smalle
6220: 72 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 6e 6f  r table.  For no
6230: 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  n-terminal symbo
6240: 6c 73 2c 20 77 68 69 63 68 20 61 72 65 20 6e 65  ls, which are ne
6250: 76 65 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ver syntax error
6260: 73 2c 0a 2a 2a 20 6d 61 6b 65 49 74 53 61 66 65  s,.** makeItSafe
6270: 20 63 61 6e 20 62 65 20 66 61 6c 73 65 2e 0a 2a   can be false..*
6280: 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73  /.int acttab_ins
6290: 65 72 74 28 61 63 74 74 61 62 20 2a 70 2c 20 69  ert(acttab *p, i
62a0: 6e 74 20 6d 61 6b 65 49 74 53 61 66 65 29 7b 0a  nt makeItSafe){.
62b0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e    int i, j, k, n
62c0: 2c 20 65 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  , end;.  assert(
62d0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30   p->nLookahead>0
62e0: 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   );..  /* Make s
62f0: 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75  ure we have enou
6300: 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  gh space to hold
6310: 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61 63   the expanded ac
6320: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20  tion table.  ** 
6330: 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  in the worst cas
6340: 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63 61  e.  The worst ca
6350: 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68 65  se occurs if the
6360: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
6370: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70  .  ** must be ap
6380: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75  pended to the cu
6390: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
63a0: 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d  le.  */.  n = p-
63b0: 3e 6e 73 79 6d 62 6f 6c 20 2b 20 31 3b 0a 20 20  >nsymbol + 1;.  
63c0: 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b  if( p->nAction +
63d0: 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e   n >= p->nAction
63e0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
63f0: 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e   oldAlloc = p->n
6400: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20  ActionAlloc;.   
6410: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
6420: 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20   = p->nAction + 
6430: 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  n + p->nActionAl
6440: 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d  loc + 20;.    p-
6450: 3e 61 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75  >aAction = (stru
6460: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
6470: 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20  ion *) realloc( 
6480: 70 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20  p->aAction,.    
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
64b0: 61 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e  aAction[0])*p->n
64c0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20  ActionAlloc);.  
64d0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
64e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
64f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
6500: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
6510: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
6520: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f     }.    for(i=o
6530: 6c 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41  ldAlloc; i<p->nA
6540: 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29  ctionAlloc; i++)
6550: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  {.      p->aActi
6560: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[i].lookahead 
6570: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61  = -1;.      p->a
6580: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
6590: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
65a0: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
65b0: 65 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20  existing action 
65c0: 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  table looking fo
65d0: 72 20 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74  r an offset that
65e0: 20 69 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c 69   is a.  ** dupli
65f0: 63 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 72  cate of the curr
6600: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
6610: 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f  set.  Fall out o
6620: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20  f the loop.  ** 
6630: 69 66 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20  if and when the 
6640: 64 75 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75  duplicate is fou
6650: 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20  nd..  **.  ** i 
6660: 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  is the index in 
6670: 70 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65  p->aAction[] whe
6680: 72 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  re p->mnLookahea
6690: 64 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20  d is inserted.. 
66a0: 20 2a 2f 0a 20 20 65 6e 64 20 3d 20 6d 61 6b 65   */.  end = make
66b0: 49 74 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f  ItSafe ? p->mnLo
66c0: 6f 6b 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 66  okahead : 0;.  f
66d0: 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d  or(i=p->nAction-
66e0: 31 3b 20 69 3e 3d 65 6e 64 3b 20 69 2d 2d 29 7b  1; i>=end; i--){
66f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74  .    if( p->aAct
6700: 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[i].lookahead
6710: 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ==p->mnLookahead
6720: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
6730: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20   lookaheads and 
6740: 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61  actions in the a
6750: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e  Lookahead[] tran
6760: 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
6770: 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61 69   must match agai
6780: 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64 61 74  nst the candidat
6790: 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74  e aAction[i] ent
67a0: 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ry. */.      if(
67b0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
67c0: 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69  ction!=p->mnActi
67d0: 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  on ) continue;. 
67e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
67f0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
6800: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
6810: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
6820: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
6830: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
6840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c  ;.        if( k<
6850: 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69  0 || k>=p->nActi
6860: 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  on ) break;.    
6870: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
6880: 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ahead[j].lookahe
6890: 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  ad!=p->aAction[k
68a0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72  ].lookahead ) br
68b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
68c0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
68d0: 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63  ].action!=p->aAc
68e0: 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29  tion[k].action )
68f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6900: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
6910: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
6920: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  inue;..      /* 
6930: 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b  No possible look
6940: 61 68 65 61 64 20 76 61 6c 75 65 20 74 68 61 74  ahead value that
6950: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61   is not in the a
6960: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20  Lookahead[].    
6970: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
6980: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d   is allowed to m
6990: 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20  atch aAction[i] 
69a0: 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a  */.      n = 0;.
69b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
69c0: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b  <p->nAction; j++
69d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
69e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
69f0: 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69  kahead<0 ) conti
6a00: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
6a10: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c   p->aAction[j].l
6a20: 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d  ookahead==j+p->m
6a30: 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e  nLookahead-i ) n
6a40: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6a50: 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f    if( n==p->nLoo
6a60: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
6a70: 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20    break;  /* An 
6a80: 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66  exact match is f
6a90: 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69  ound at offset i
6aa0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
6ab0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
6ac0: 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65  o existing offse
6ad0: 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  ts exactly match
6ae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6af0: 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61  nsaction, find a
6b00: 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20  n.  ** an empty 
6b10: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 61 41  offset in the aA
6b20: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e  ction[] table in
6b30: 20 77 68 69 63 68 20 77 65 20 63 61 6e 20 61 64   which we can ad
6b40: 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b  d the.  ** aLook
6b50: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
6b60: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
6b70: 69 3c 65 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20  i<end ){.    /* 
6b80: 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69  Look for holes i
6b90: 6e 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  n the aAction[] 
6ba0: 74 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74  table that fit t
6bb0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
6bc0: 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74  * aLookahead[] t
6bd0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61  ransaction.  Lea
6be0: 76 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20  ve i set to the 
6bf0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f  offset of the ho
6c00: 6c 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  le..    ** If no
6c10: 20 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64   holes are found
6c20: 2c 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70  , i is left at p
6c30: 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68  ->nAction, which
6c40: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a   means the.    *
6c50: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
6c60: 6c 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  ll be appended. 
6c70: 2a 2f 0a 20 20 20 20 69 20 3d 20 6d 61 6b 65 49  */.    i = makeI
6c80: 74 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f  tSafe ? p->mnLoo
6c90: 6b 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 20 20  kahead : 0;.    
6ca0: 66 6f 72 28 3b 20 69 3c 70 2d 3e 6e 41 63 74 69  for(; i<p->nActi
6cb0: 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c  onAlloc - p->mxL
6cc0: 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a  ookahead; i++){.
6cd0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
6ce0: 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[i].lookahea
6cf0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  d<0 ){.        f
6d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f  or(j=0; j<p->nLo
6d10: 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20  okahead; j++){. 
6d20: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e           k = p->
6d30: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
6d40: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
6d50: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
6d60: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
6d70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6d80: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6d90: 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d  n[k].lookahead>=
6da0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6dc0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
6dd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6de0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6df0: 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29  p->nAction; j++)
6e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6e10: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
6e20: 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e  okahead==j+p->mn
6e30: 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72  Lookahead-i ) br
6e40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6e50: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d         if( j==p-
6e60: 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  >nAction ){.    
6e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
6e80: 20 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73   Fits in empty s
6e90: 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  lots */.        
6ea0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6eb0: 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
6ec0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
6ed0: 61 74 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 23  at index i. */.#
6ee0: 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41  if 0.  printf("A
6ef0: 63 74 74 61 62 3a 22 29 3b 0a 20 20 66 6f 72 28  cttab:");.  for(
6f00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61  j=0; j<p->nLooka
6f10: 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  head; j++){.    
6f20: 70 72 69 6e 74 66 28 22 20 25 64 22 2c 20 70 2d  printf(" %d", p-
6f30: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
6f40: 6f 6f 6b 61 68 65 61 64 29 3b 0a 20 20 7d 0a 20  ookahead);.  }. 
6f50: 20 70 72 69 6e 74 66 28 22 20 69 6e 73 65 72 74   printf(" insert
6f60: 65 64 20 61 74 20 25 64 5c 6e 22 2c 20 69 29 3b  ed at %d\n", i);
6f70: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 6a 3d  .#endif.  for(j=
6f80: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
6f90: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20  ad; j++){.    k 
6fa0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
6fb0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
6fc0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
6fd0: 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  i;.    p->aActio
6fe0: 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61  n[k] = p->aLooka
6ff0: 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  head[j];.    if(
7000: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
7010: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b   p->nAction = k+
7020: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 61 6b  1;.  }.  if( mak
7030: 65 49 74 53 61 66 65 20 26 26 20 69 2b 70 2d 3e  eItSafe && i+p->
7040: 6e 74 65 72 6d 69 6e 61 6c 3e 3d 70 2d 3e 6e 41  nterminal>=p->nA
7050: 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69  ction ) p->nActi
7060: 6f 6e 20 3d 20 69 2b 70 2d 3e 6e 74 65 72 6d 69  on = i+p->ntermi
7070: 6e 61 6c 2b 31 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f  nal+1;.  p->nLoo
7080: 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f  kahead = 0;..  /
7090: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
70a0: 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65  set that is adde
70b0: 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65  d to the lookahe
70c0: 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ad in order to g
70d0: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  et the.  ** inde
70e0: 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  x into yy_action
70f0: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a   of the action *
7100: 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70  /.  return i - p
7110: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d  ->mnLookahead;.}
7120: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7130: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
7140: 63 74 69 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  ction table with
7150: 6f 75 74 20 74 68 65 20 74 72 61 69 6c 69 6e 67  out the trailing
7160: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 0a 2a 2a   syntax error.**
7170: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74   entries..*/.int
7180: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73   acttab_action_s
7190: 69 7a 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a  ize(acttab *p){.
71a0: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 41 63    int n = p->nAc
71b0: 74 69 6f 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tion;.  while( n
71c0: 3e 30 20 26 26 20 70 2d 3e 61 41 63 74 69 6f 6e  >0 && p->aAction
71d0: 5b 6e 2d 31 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  [n-1].lookahead<
71e0: 30 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  0 ){ n--; }.  re
71f0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  turn n;.}../****
7200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7210: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
7220: 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a   "build.c" *****
7230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7240: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
7250: 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73  Routines to cons
7260: 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e  truction the fin
7270: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
7280: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a  e for the LEMON.
7290: 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ** parser genera
72a0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64  tor..*/../* Find
72b0: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
72c0: 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75  mbol of every ru
72d0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
72e0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 6f 73 65 20 72  r..**.** Those r
72f0: 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65 20  ules which have 
7300: 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d  a precedence sym
7310: 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68 65  bol coded in the
7320: 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61   input.** gramma
7330: 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73 79  r using the "[sy
7340: 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74  mbol]" construct
7350: 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68 61   will already ha
7360: 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72  ve the.** rp->pr
7370: 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c  ecsym field fill
7380: 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65 73  ed.  Other rules
7390: 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20 70   take as their p
73a0: 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d  recedence.** sym
73b0: 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52 48  bol the first RH
73c0: 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 20  S symbol with a 
73d0: 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e  defined preceden
73e0: 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  ce.  If there.**
73f0: 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79 6d   are not RHS sym
7400: 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66 69  bols with a defi
7410: 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c 20  ned precedence, 
7420: 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a  the precedence.*
7430: 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69  * symbol field i
7440: 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f  s left blank..*/
7450: 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72  .void FindRulePr
7460: 65 63 65 64 65 6e 63 65 73 28 73 74 72 75 63 74  ecedences(struct
7470: 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20   lemon *xp).{.  
7480: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7490: 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75  .  for(rp=xp->ru
74a0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
74b0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
74c0: 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a  ->precsym==0 ){.
74d0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
74e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
74f0: 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d  <rp->nrhs && rp-
7500: 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b  >precsym==0; i++
7510: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
7520: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
7530: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
7540: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
7550: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
7560: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
7570: 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73  j=0; j<sp->nsubs
7580: 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
7590: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75        if( sp->su
75a0: 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30  bsym[j]->prec>=0
75b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
75c0: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
75d0: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20  sp->subsym[j];. 
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
75f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7600: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
7610: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7620: 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  sp->prec>=0 ){. 
7630: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
7640: 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69  csym = rp->rhs[i
7650: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
7660: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7670: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46   return;.}../* F
7680: 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69  ind all nontermi
7690: 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20  nals which will 
76a0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70  generate the emp
76b0: 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68  ty string..** Th
76c0: 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63  en go back and c
76d0: 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74  ompute the first
76e0: 20 73 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e   sets of every n
76f0: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54  onterminal..** T
7700: 68 65 20 66 69 72 73 74 20 73 65 74 20 69 73 20  he first set is 
7710: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74  the set of all t
7720: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
7730: 77 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a  which can begin.
7740: 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65  ** a string gene
7750: 72 61 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f  rated by that no
7760: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f  nterminal..*/.vo
7770: 69 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73  id FindFirstSets
7780: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
7790: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  emp).{.  int i, 
77a0: 6a 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  j;.  struct rule
77b0: 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67   *rp;.  int prog
77c0: 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ress;..  for(i=0
77d0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
77e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  l; i++){.    lem
77f0: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c  p->symbols[i]->l
7800: 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41  ambda = LEMON_FA
7810: 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  LSE;.  }.  for(i
7820: 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
7830: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
7840: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  l; i++){.    lem
7850: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66  p->symbols[i]->f
7860: 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77  irstset = SetNew
7870: 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ();.  }..  /* Fi
7880: 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20  rst compute all 
7890: 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b  lambdas */.  do{
78a0: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
78b0: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
78c0: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
78d0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
78e0: 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c    if( rp->lhs->l
78f0: 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65  ambda ) continue
7900: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7910: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
7920: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
7930: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
7940: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
7950: 20 20 20 61 73 73 65 72 74 28 20 73 70 2d 3e 74     assert( sp->t
7960: 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
7970: 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d   || sp->lambda==
7980: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 3b 0a 20  LEMON_FALSE );. 
7990: 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c         if( sp->l
79a0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
79b0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
79c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
79d0: 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20  =rp->nrhs ){.   
79e0: 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61       rp->lhs->la
79f0: 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55  mbda = LEMON_TRU
7a00: 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72  E;.        progr
7a10: 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ess = 1;.      }
7a20: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7a30: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20   progress );..  
7a40: 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61  /* Now compute a
7a50: 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  ll first sets */
7a60: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63  .  do{.    struc
7a70: 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73  t symbol *s1, *s
7a80: 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  2;.    progress 
7a90: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d  = 0;.    for(rp=
7aa0: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7ab0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
7ac0: 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73      s1 = rp->lhs
7ad0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7ae0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
7af0: 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20  ){.        s2 = 
7b00: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
7b10: 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65      if( s2->type
7b20: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
7b30: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
7b40: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
7b50: 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65  irstset,s2->inde
7b60: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  x);.          br
7b70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
7b80: 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d  se if( s2->type=
7b90: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
7ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
7bb0: 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73  j=0; j<s2->nsubs
7bc0: 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
7bd0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7be0: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
7bf0: 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d  stset,s2->subsym
7c00: 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  [j]->index);.   
7c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7c30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d    }else if( s1==
7c40: 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
7c50: 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d  if( s1->lambda==
7c60: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
7c70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
7c80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72  se{.          pr
7c90: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69  ogress += SetUni
7ca0: 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  on(s1->firstset,
7cb0: 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20  s2->firstset);. 
7cc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d           if( s2-
7cd0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
7ce0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
7cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7d00: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
7d10: 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65  progress );.  re
7d20: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  turn;.}../* Comp
7d30: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
7d40: 61 74 65 73 20 66 6f 72 20 74 68 65 20 67 72 61  ates for the gra
7d50: 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20  mmar.  Links.** 
7d60: 61 72 65 20 61 64 64 65 64 20 74 6f 20 62 65 74  are added to bet
7d70: 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73  ween some states
7d80: 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28   so that the LR(
7d90: 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a  1) follow sets.*
7da0: 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  * can be compute
7db0: 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56  d later..*/.PRIV
7dc0: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
7dd0: 20 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63   *getstate(struc
7de0: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20  t lemon *);  /* 
7df0: 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  forward referenc
7e00: 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74  e */.void FindSt
7e10: 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  ates(struct lemo
7e20: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
7e30: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
7e40: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
7e50: 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74  p;..  Configlist
7e60: 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46  _init();..  /* F
7e70: 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79  ind the start sy
7e80: 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65  mbol */.  if( le
7e90: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
7ea0: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
7eb0: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
7ec0: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b      if( sp==0 ){
7ed0: 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
7ee0: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
7ef0: 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64  ,."The specified
7f00: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
7f10: 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e  %s\" is not \.in
7f20: 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f   a nonterminal o
7f30: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
7f40: 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75  \"%s\" will be u
7f50: 73 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74  sed as the start
7f60: 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61   \.symbol instea
7f70: 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c  d.",lemp->start,
7f80: 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d  lemp->startRule-
7f90: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
7fa0: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
7fb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20  t++;.      sp = 
7fc0: 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d  lemp->startRule-
7fd0: 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  >lhs;.    }.  }e
7fe0: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
7ff0: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
8000: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
8010: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
8020: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
8030: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
8040: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
8050: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
8060: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
8070: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
8080: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
8090: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
80a0: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
80b0: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
80c0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
80d0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
80e0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
80f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
8100: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
8110: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
8120: 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46  i]==sp ){   /* F
8130: 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74  IX ME:  Deal wit
8140: 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73  h multiterminals
8150: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f   */.        Erro
8160: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
8170: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72  ame,0,."The star
8180: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
8190: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a  occurs on the \.
81a0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
81b0: 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20  of a rule. This 
81c0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
81d0: 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a   parser which \.
81e0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72  does not work pr
81f0: 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d  operly.",sp->nam
8200: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
8210: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
8220: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8230: 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20  .  /* The basis 
8240: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
8250: 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  t for the first 
8260: 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c  state.  ** is al
8270: 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  l rules which ha
8280: 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  ve the start sym
8290: 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a  bol as their.  *
82a0: 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * left-hand side
82b0: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d   */.  for(rp=sp-
82c0: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
82d0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
82e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
82f0: 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c  ewcfp;.    rp->l
8300: 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20  hsStart = 1;.   
8310: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
8320: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
8330: 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28  ,0);.    SetAdd(
8340: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a  newcfp->fws,0);.
8350: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
8360: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  e the first stat
8370: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74  e.  All other st
8380: 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  ates will be.  *
8390: 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d  * computed autom
83a0: 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20  atically during 
83b0: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
83c0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  of the first one
83d0: 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72  ..  ** The retur
83e0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
83f0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69  he first state i
8400: 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  s not used. */. 
8410: 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28   (void)getstate(
8420: 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  lemp);.  return;
8430: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
8440: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
8450: 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63  te which is desc
8460: 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ribed by the con
8470: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69  figuration.** li
8480: 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65  st which has bee
8490: 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c  n built from cal
84a0: 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74  ls to Configlist
84b0: 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  _add..*/.PRIVATE
84c0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
84d0: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
84e0: 2c 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  , struct state *
84f0: 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20  ); /* Forwd ref 
8500: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
8510: 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74  t state *getstat
8520: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
8530: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
8540: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62   config *cfp, *b
8550: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
8560: 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78  e *stp;..  /* Ex
8570: 74 72 61 63 74 20 74 68 65 20 73 6f 72 74 65 64  tract the sorted
8580: 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65   basis of the ne
8590: 77 20 73 74 61 74 65 2e 20 20 54 68 65 20 62 61  w state.  The ba
85a0: 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63  sis was construc
85b0: 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f  ted.  ** by prio
85c0: 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66  r calls to "Conf
85d0: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
85e0: 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c  )". */.  Configl
85f0: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b  ist_sortbasis();
8600: 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69  .  bp = Configli
8610: 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f  st_basis();..  /
8620: 2a 20 47 65 74 20 61 20 73 74 61 74 65 20 77 69  * Get a state wi
8630: 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69  th the same basi
8640: 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61  s */.  stp = Sta
8650: 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69  te_find(bp);.  i
8660: 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a  f( stp ){.    /*
8670: 20 41 20 73 74 61 74 65 20 77 69 74 68 20 74 68   A state with th
8680: 65 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72  e same basis alr
8690: 65 61 64 79 20 65 78 69 73 74 73 21 20 20 43 6f  eady exists!  Co
86a0: 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  py all the follo
86b0: 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f  w-set.    ** pro
86c0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66  pagation links f
86d0: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e  rom the state un
86e0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
86f0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
8700: 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61   preexisting sta
8710: 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  te, then return 
8720: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8730: 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61   preexisting sta
8740: 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  te */.    struct
8750: 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a   config *x, *y;.
8760: 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d      for(x=bp, y=
8770: 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b  stp->bp; x && y;
8780: 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62   x=x->bp, y=y->b
8790: 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p){.      Plink_
87a0: 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d  copy(&y->bplp,x-
87b0: 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c  >bplp);.      Pl
87c0: 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70  ink_delete(x->fp
87d0: 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70  lp);.      x->fp
87e0: 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30  lp = x->bplp = 0
87f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20  ;.    }.    cfp 
8800: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74  = Configlist_ret
8810: 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69  urn();.    Confi
8820: 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a  glist_eat(cfp);.
8830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
8840: 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61  This really is a
8850: 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e   new state.  Con
8860: 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64  struct all the d
8870: 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f  etails */.    Co
8880: 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65  nfiglist_closure
8890: 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f  (lemp);    /* Co
88a0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67  mpute the config
88b0: 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20  uration closure 
88c0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
88d0: 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20  t_sort();       
88e0: 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20      /* Sort the 
88f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
8900: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70  osure */.    cfp
8910: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65   = Configlist_re
8920: 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74  turn();   /* Get
8930: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8940: 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f  e config list */
8950: 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61 74 65  .    stp = State
8960: 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20 20  _new();         
8970: 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65    /* A new state
8980: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
8990: 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74    MemoryCheck(st
89a0: 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20  p);.    stp->bp 
89b0: 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20 20 20  = bp;           
89c0: 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72       /* Remember
89d0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
89e0: 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20  on basis */.    
89f0: 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20  stp->cfp = cfp; 
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a10: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e  Remember the con
8a20: 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75  figuration closu
8a30: 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73  re */.    stp->s
8a40: 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e  tatenum = lemp->
8a50: 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65  nstate++; /* Eve
8a60: 72 79 20 73 74 61 74 65 20 67 65 74 73 20 61 20  ry state gets a 
8a70: 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
8a80: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  */.    stp->ap =
8a90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8aa0: 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e      /* No action
8ab0: 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53  s, yet. */.    S
8ac0: 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c  tate_insert(stp,
8ad0: 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41  stp->bp);   /* A
8ae0: 64 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  dd to the state 
8af0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69  table */.    bui
8b00: 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74  ldshifts(lemp,st
8b10: 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63  p);       /* Rec
8b20: 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65  ursively compute
8b30: 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65   successor state
8b40: 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  s */.  }.  retur
8b50: 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n stp;.}../*.** 
8b60: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
8b70: 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74  wo symbols are t
8b80: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  he same..*/.int 
8b90: 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75  same_symbol(stru
8ba0: 63 74 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74  ct symbol *a, st
8bb0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a  ruct symbol *b).
8bc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
8bd0: 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31   a==b ) return 1
8be0: 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21  ;.  if( a->type!
8bf0: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
8c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
8c10: 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54   b->type!=MULTIT
8c20: 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e  ERMINAL ) return
8c30: 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75   0;.  if( a->nsu
8c40: 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d  bsym!=b->nsubsym
8c50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
8c60: 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75  or(i=0; i<a->nsu
8c70: 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bsym; i++){.    
8c80: 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d  if( a->subsym[i]
8c90: 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29  !=b->subsym[i] )
8ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8cb0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
8cc0: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73   Construct all s
8cd0: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
8ce0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  to the given sta
8cf0: 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f  te.  A "successo
8d00: 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61  r".** state is a
8d10: 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20 63  ny state which c
8d20: 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62 79  an be reached by
8d30: 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e   a shift action.
8d40: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
8d50: 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72   buildshifts(str
8d60: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
8d70: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
8d80: 74 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  tp).{.  struct c
8d90: 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20  onfig *cfp;  /* 
8da0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75  For looping thru
8db0: 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73   the config clos
8dc0: 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a  ure of "stp" */.
8dd0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8de0: 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68  *bcfp; /* For th
8df0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20  e inner loop on 
8e00: 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f  config closure o
8e10: 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72  f "stp" */.  str
8e20: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
8e30: 66 67 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72  fg;  /* */.  str
8e40: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
8e50: 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c    /* Symbol foll
8e60: 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e  owing the dot in
8e70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
8e80: 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  cfp" */.  struct
8e90: 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f   symbol *bsp;  /
8ea0: 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69  * Symbol followi
8eb0: 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f  ng the dot in co
8ec0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66  nfiguration "bcf
8ed0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
8ee0: 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a  tate *newstp; /*
8ef0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
8f00: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20  successor state 
8f10: 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f  */..  /* Each co
8f20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f  nfiguration beco
8f30: 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74  mes complete aft
8f40: 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73  er it contibutes
8f50: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a   to a successor.
8f60: 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69    ** state.  Ini
8f70: 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66  tially, all conf
8f80: 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69  igurations are i
8f90: 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66  ncomplete */.  f
8fa0: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
8fb0: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
8fc0: 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73  ext) cfp->status
8fd0: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a   = INCOMPLETE;..
8fe0: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
8ff0: 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  h all configurat
9000: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74  ions of the stat
9010: 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72  e "stp" */.  for
9020: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
9030: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
9040: 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d  t){.    if( cfp-
9050: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
9060: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
9070: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
9080: 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a   by inner loop *
9090: 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64  /.    if( cfp->d
90a0: 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  ot>=cfp->rp->nrh
90b0: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  s ) continue;  /
90c0: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
90d0: 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20  is config */.   
90e0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
90f0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t();            
9100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9110: 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69  et the new confi
9120: 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20  g set */.    sp 
9130: 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63  = cfp->rp->rhs[c
9140: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
9150: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20        /* Symbol 
9160: 61 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f  after the dot */
9170: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65  ..    /* For eve
9180: 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ry configuration
9190: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73   in the state "s
91a0: 74 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68  tp" which has th
91b0: 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20  e symbol "sp".  
91c0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69    ** following i
91d0: 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20  ts dot, add the 
91e0: 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69  same configurati
91f0: 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20  on to the basis 
9200: 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  set under.    **
9210: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75   construction bu
9220: 74 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73  t with the dot s
9230: 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f  hifted one symbo
9240: 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  l to the right. 
9250: 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d  */.    for(bcfp=
9260: 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d  cfp; bcfp; bcfp=
9270: 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  bcfp->next){.   
9280: 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61     if( bcfp->sta
9290: 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20  tus==COMPLETE ) 
92a0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20  continue;    /* 
92b0: 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a  Already used */.
92c0: 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e        if( bcfp->
92d0: 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e  dot>=bcfp->rp->n
92e0: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  rhs ) continue; 
92f0: 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74  /* Can't shift t
9300: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  his one */.     
9310: 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d   bsp = bcfp->rp-
9320: 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b  >rhs[bcfp->dot];
9330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
9340: 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64  t symbol after d
9350: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9360: 21 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70  !same_symbol(bsp
9370: 2c 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ,sp) ) continue;
9380: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
9390: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66   same as for "cf
93a0: 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70  p" */.      bcfp
93b0: 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c  ->status = COMPL
93c0: 45 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20  ETE;            
93d0: 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
93e0: 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65  is config as use
93f0: 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66  d */.      newcf
9400: 67 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  g = Configlist_a
9410: 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70  ddbasis(bcfp->rp
9420: 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20  ,bcfp->dot+1);. 
9430: 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26       Plink_add(&
9440: 6e 65 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66  newcfg->bplp,bcf
9450: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
9460: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
9470: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
9480: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
9490: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
94a0: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
94b0: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
94c0: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
94d0: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
94e0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
94f0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
9500: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
9510: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
9520: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
9530: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
9540: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
9550: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28   "sp" */.    if(
9560: 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
9570: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
9580: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
9590: 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73  or(i=0; i<sp->ns
95a0: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
95b0: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
95c0: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
95d0: 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68  p->subsym[i],(ch
95e0: 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  ar*)newstp);.   
95f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9600: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
9610: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
9620: 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74  sp,(char *)newst
9630: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
9640: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
9650: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
9660: 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46   links.*/.void F
9670: 69 6e 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20  indLinks(struct 
9680: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
9690: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
96a0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f   config *cfp, *o
96b0: 74 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73  ther;.  struct s
96c0: 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
96d0: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
96e0: 0a 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69  .  /* Housekeepi
96f0: 6e 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20  ng detail:.  ** 
9700: 41 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f  Add to every pro
9710: 70 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f  pagate link a po
9720: 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68  inter back to th
9730: 65 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20  e state to.  ** 
9740: 77 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69  which the link i
9750: 73 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20  s attached. */. 
9760: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
9770: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
9780: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
9790: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
97a0: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
97b0: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
97c0: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
97d0: 3e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  >stp = stp;.    
97e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  }.  }..  /* Conv
97f0: 65 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b  ert all backlink
9800: 73 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c  s into forward l
9810: 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20  inks.  Only the 
9820: 66 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e  forward.  ** lin
9830: 6b 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ks are used in t
9840: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f  he follow-set co
9850: 6d 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  mputation. */.  
9860: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
9870: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
9880: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
9890: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
98a0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
98b0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
98c0: 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  xt){.      for(p
98d0: 6c 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c  lp=cfp->bplp; pl
98e0: 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74  p; plp=plp->next
98f0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72  ){.        other
9900: 20 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20   = plp->cfp;.   
9910: 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26       Plink_add(&
9920: 6f 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29  other->fplp,cfp)
9930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9940: 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74    }.}../* Comput
9950: 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73  e all followsets
9960: 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77  ..**.** A follow
9970: 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f  set is the set o
9980: 66 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68  f all symbols wh
9990: 69 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d  ich can come imm
99a0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
99b0: 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  r a configuratio
99c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  n..*/.void FindF
99d0: 6f 6c 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74  ollowSets(struct
99e0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
99f0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
9a00: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
9a10: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
9a20: 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  lp;.  int progre
9a30: 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65  ss;.  int change
9a40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
9a50: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
9a60: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  +){.    for(cfp=
9a70: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
9a80: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
9a90: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
9aa0: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49   cfp->status = I
9ab0: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d  NCOMPLETE;.    }
9ac0: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
9ad0: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
9ae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
9af0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
9b00: 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  .      for(cfp=l
9b10: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
9b20: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
9b30: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9b40: 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75    if( cfp->statu
9b50: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
9b60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9b70: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c  for(plp=cfp->fpl
9b80: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
9b90: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
9ba0: 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e    change = SetUn
9bb0: 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77  ion(plp->cfp->fw
9bc0: 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  s,cfp->fws);.   
9bd0: 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67         if( chang
9be0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
9bf0: 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75   plp->cfp->statu
9c00: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67              prog
9c20: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
9c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9c40: 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61          cfp->sta
9c50: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a  tus = COMPLETE;.
9c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9c70: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
9c80: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
9c90: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
9ca0: 63 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ct(struct action
9cb0: 20 2a 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e   *,struct action
9cc0: 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   *);../* Compute
9cd0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
9ce0: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
9cf0: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
9d00: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
9d10: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
9d20: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp).{.  int i,j;
9d30: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9d40: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
9d50: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
9d60: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
9d70: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
9d80: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
9d90: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
9da0: 61 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 41 20 72  actions.  ** A r
9db0: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73 20  educe action is 
9dc0: 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20 65  added for each e
9dd0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  lement of the fo
9de0: 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20  llowset of.  ** 
9df0: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
9e00: 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64 6f  which has its do
9e10: 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d 65  t at the extreme
9e20: 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66   right..  */.  f
9e30: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9e40: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20  nstate; i++){   
9e50: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
9e60: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20 73   states */.    s
9e70: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
9e80: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
9e90: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
9ea0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
9eb0: 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
9ec0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
9ed0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63  s */.      if( c
9ee0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66  fp->rp->nrhs==cf
9ef0: 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20 20  p->dot ){       
9f00: 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65 78   /* Is dot at ex
9f10: 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a  treme right? */.
9f20: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9f30: 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   j<lemp->ntermin
9f40: 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  al; j++){.      
9f50: 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64 28      if( SetFind(
9f60: 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20  cfp->fws,j) ){. 
9f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9f80: 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69 6f  d a reduce actio
9f90: 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 22  n to the state "
9fa0: 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c 20  stp" which will 
9fb0: 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20 20  reduce by the.  
9fc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6c            ** rul
9fd0: 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20 74  e "cfp->rp" if t
9fe0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d  he lookahead sym
9ff0: 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79  bol is "lemp->sy
a000: 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20  mbols[j]" */.   
a010: 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f           Action_
a020: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45 44  add(&stp->ap,RED
a030: 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  UCE,lemp->symbol
a040: 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66 70  s[j],(char *)cfp
a050: 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ->rp);.         
a060: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a070: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a080: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63    /* Add the acc
a090: 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  epting token */.
a0a0: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
a0b0: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
a0c0: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
a0d0: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
a0e0: 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d  sp==0 ) sp = lem
a0f0: 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68  p->startRule->lh
a100: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
a110: 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74  sp = lemp->start
a120: 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  Rule->lhs;.  }. 
a130: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
a140: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
a150: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
a160: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
a170: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
a180: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
a190: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
a1a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
a1b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
a1c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
a1d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
a1e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
a1f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
a200: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
a210: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
a220: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
a230: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
a240: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
a250: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
a260: 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
a270: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
a280: 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d   /* assert( stp-
a290: 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74  >ap ); */.    st
a2a0: 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
a2b0: 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20  ort(stp->ap);.  
a2c0: 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
a2d0: 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74  ; ap && ap->next
a2e0: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
a2f0: 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70        for(nap=ap
a300: 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e  ->next; nap && n
a310: 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20  ap->sp==ap->sp; 
a320: 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a  nap=nap->next){.
a330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a340: 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22  two actions "ap"
a350: 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20   and "nap" have 
a360: 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65  the same lookahe
a370: 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  ad..         ** 
a380: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
a390: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75   one should be u
a3a0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  sed */.         
a3b0: 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20  lemp->nconflict 
a3c0: 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c  += resolve_confl
a3d0: 69 63 74 28 61 70 2c 6e 61 70 29 3b 0a 20 20 20  ict(ap,nap);.   
a3e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a3f0: 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    /* Report an e
a400: 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75  rror for each ru
a410: 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65  le that can neve
a420: 72 20 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f  r be reduced. */
a430: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
a440: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
a450: 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65  >next) rp->canRe
a460: 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c  duce = LEMON_FAL
a470: 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  SE;.  for(i=0; i
a480: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
a490: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
a4a0: 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20  action *ap;.    
a4b0: 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72  for(ap=lemp->sor
a4c0: 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20  ted[i]->ap; ap; 
a4d0: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
a4e0: 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
a4f0: 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78  ==REDUCE ) ap->x
a500: 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d  .rp->canReduce =
a510: 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20   LEMON_TRUE;.   
a520: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d   }.  }.  for(rp=
a530: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
a540: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
a550: 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64    if( rp->canRed
a560: 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uce ) continue;.
a570: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
a580: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
a590: 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72  ruleline,"This r
a5a0: 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72  ule can not be r
a5b0: 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20  educed.\n");.   
a5c0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
a5d0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73  +;.  }.}../* Res
a5e0: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20  olve a conflict 
a5f0: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
a600: 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20  given actions.  
a610: 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69  If the.** confli
a620: 63 74 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f  ct can't be reso
a630: 6c 76 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e  lved, return non
a640: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20  -zero..**.** NO 
a650: 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20  LONGER TRUE:.** 
a660: 20 20 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63    To resolve a c
a670: 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c  onflict, first l
a680: 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69  ook to see if ei
a690: 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20  ther action.**  
a6a0: 20 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20   is on an error 
a6b0: 72 75 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  rule.  In that c
a6c0: 61 73 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63  ase, take the ac
a6d0: 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20  tion which.**   
a6e0: 69 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65  is not associate
a6f0: 64 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  d with the error
a700: 20 72 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68   rule.  If neith
a710: 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20  er or both.**   
a720: 61 63 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f  actions are asso
a730: 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ciated with an e
a740: 72 72 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20  rror rule, then 
a750: 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20  try to.**   use 
a760: 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65  precedence to re
a770: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69  solve the confli
a780: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  ct..**.** If eit
a790: 68 65 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20  her action is a 
a7a0: 53 48 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d  SHIFT, then it m
a7b0: 75 73 74 20 62 65 20 61 70 78 2e 20 20 54 68 69  ust be apx.  Thi
a7c0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
a7d0: 6e 27 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d  n't work if apx-
a7e0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e  >type==REDUCE an
a7f0: 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  d apy->type==SHI
a800: 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  FT..*/.static in
a810: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
a820: 63 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  ct(.  struct act
a830: 69 6f 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75  ion *apx,.  stru
a840: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 0a 29  ct action *apy.)
a850: 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
a860: 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20  l *spx, *spy;.  
a870: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
a880: 20 20 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73    assert( apx->s
a890: 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f  p==apy->sp );  /
a8a0: 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 72  * Otherwise ther
a8b0: 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f  e would be no co
a8c0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20  nflict */.  if( 
a8d0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
a8e0: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53   && apy->type==S
a8f0: 48 49 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d  HIFT ){.    apy-
a900: 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49  >type = SSCONFLI
a910: 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b  CT;.    errcnt++
a920: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d  ;.  }.  if( apx-
a930: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20  >type==SHIFT && 
a940: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apy->type==REDUC
a950: 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61  E ){.    spx = a
a960: 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20  px->sp;.    spy 
a970: 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apy->x.rp->pre
a980: 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70  csym;.    if( sp
a990: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
a9a0: 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63  c<0 || spy->prec
a9b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  <0 ){.      /* N
a9c0: 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64  ot enough preced
a9d0: 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
a9e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  . */.      apy->
a9f0: 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43  type = SRCONFLIC
aa00: 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b  T;.      errcnt+
aa10: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
aa20: 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e   spx->prec>spy->
aa30: 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 68 69  prec ){    /* hi
aa40: 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65 20  gher precedence 
aa50: 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70  wins */.      ap
aa60: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
aa70: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
aa80: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73   if( spx->prec<s
aa90: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
aaa0: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48    apx->type = SH
aab0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
aac0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
aad0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
aae0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47   spx->assoc==RIG
aaf0: 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65  HT ){ /* Use ope
ab00: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61  rator */.      a
ab10: 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  py->type = RD_RE
ab20: 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20  SOLVED;         
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69      /* associati
ab50: 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  vity */.    }els
ab60: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d  e if( spx->prec=
ab70: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
ab80: 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29  x->assoc==LEFT )
ab90: 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74  {  /* to break t
aba0: 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d  ie */.      apx-
abb0: 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c  >type = SH_RESOL
abc0: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VED;.    }else{.
abd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70        assert( sp
abe0: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
abf0: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
ac00: 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  ==NONE );.      
ac10: 61 70 78 2d 3e 74 79 70 65 20 3d 20 45 52 52 4f  apx->type = ERRO
ac20: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  R;.    }.  }else
ac30: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
ac40: 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74  REDUCE && apy->t
ac50: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
ac60: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e     spx = apx->x.
ac70: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
ac80: 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70   spy = apy->x.rp
ac90: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69  ->precsym;.    i
aca0: 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79  f( spx==0 || spy
acb0: 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  ==0 || spx->prec
acc0: 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70  <0 ||.    spy->p
acd0: 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72  rec<0 || spx->pr
ace0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b  ec==spy->prec ){
acf0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
ad00: 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20   = RRCONFLICT;. 
ad10: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
ad20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
ad30: 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63  ->prec>spy->prec
ad40: 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ){.      apy->t
ad50: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
ad60: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
ad70: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
ad80: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
ad90: 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  x->type = RD_RES
ada0: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OLVED;.    }.  }
adb0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
adc0: 28 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  (.      apx->typ
add0: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
ade0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
adf0: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
ae00: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
ae10: 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==SSCONFLICT ||
ae20: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
ae30: 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SRCONFLICT ||.
ae40: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
ae50: 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =RRCONFLICT ||. 
ae60: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
ae70: 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  SH_RESOLVED ||. 
ae80: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
ae90: 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  RD_RESOLVED ||. 
aea0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
aeb0: 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SSCONFLICT ||.  
aec0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
aed0: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
aee0: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52     apy->type==RR
aef0: 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a  CONFLICT.    );.
af00: 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43      /* The REDUC
af10: 45 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e  E/SHIFT case can
af20: 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75  not happen becau
af30: 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62  se SHIFTs come b
af40: 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44  efore.    ** RED
af50: 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  UCEs on the list
af60: 2e 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  .  If we reach t
af70: 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73  his point it mus
af80: 74 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20  t be because.   
af90: 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63   ** the parser c
afa0: 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65  onflict had alre
afb0: 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ady been resolve
afc0: 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  d. */.  }.  retu
afd0: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  rn errcnt;.}./**
afe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aff0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
b000: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22  e "configlist.c"
b010: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
b020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
b030: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72  * Routines to pr
b040: 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69  ocessing a confi
b050: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
b060: 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61  d building a sta
b070: 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  te.** in the LEM
b080: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
b090: 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
b0a0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66  struct config *f
b0b0: 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  reelist = 0;    
b0c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
b0d0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  e configurations
b0e0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
b0f0: 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e  t config *curren
b100: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
b110: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63  Top of list of c
b120: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
b130: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
b140: 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65  onfig **currente
b150: 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73  nd = 0;   /* Las
b160: 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e  t on list of con
b170: 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  figs */.static s
b180: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61  truct config *ba
b190: 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sis = 0;        
b1a0: 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20   /* Top of list 
b1b0: 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73  of basis configs
b1c0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
b1d0: 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73  t config **basis
b1e0: 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  end = 0;     /* 
b1f0: 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  End of list of b
b200: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
b210: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
b220: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f  nter to a new co
b230: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
b240: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f  RIVATE struct co
b250: 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28  nfig *newconfig(
b260: 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20  void){.  struct 
b270: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a  config *newcfg;.
b280: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
b290: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
b2a0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b      int amt = 3;
b2b0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
b2c0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
b2d0: 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69  )calloc( amt, si
b2e0: 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66  zeof(struct conf
b2f0: 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66  ig) );.    if( f
b300: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
b310: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b320: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
b330: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
b340: 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  r a new configur
b350: 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ation.");.      
b360: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
b370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
b380: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
b390: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
b3a0: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
b3b0: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
b3c0: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
b3d0: 20 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69   newcfg = freeli
b3e0: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
b3f0: 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b   freelist->next;
b400: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67  .  return newcfg
b410: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66  ;.}../* The conf
b420: 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20  iguration "old" 
b430: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  is no longer use
b440: 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  d */.PRIVATE voi
b450: 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73  d deleteconfig(s
b460: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
b470: 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74  d).{.  old->next
b480: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
b490: 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d  reelist = old;.}
b4a0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
b4b0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
b4c0: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
b4d0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b4e0: 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  st_init(void){. 
b4f0: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
b500: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
b510: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
b520: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
b530: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
b540: 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20  gtable_init();. 
b550: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49   return;.}../* I
b560: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
b570: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b580: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
b590: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
b5a0: 65 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72  et(void){.  curr
b5b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
b5c0: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
b5d0: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
b5e0: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
b5f0: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
b600: 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65  e_clear(0);.  re
b610: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  turn;.}../* Add 
b620: 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  another configur
b630: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e  ation to the con
b640: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b650: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
b660: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
b670: 28 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  (.  struct rule 
b680: 2a 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72  *rp,    /* The r
b690: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74  ule */.  int dot
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6b0: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52  Index into the R
b6c0: 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77  HS of the rule w
b6d0: 68 65 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65  here the dot goe
b6e0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
b6f0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f   config *cfp, mo
b700: 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  del;..  assert( 
b710: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b720: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b730: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b740: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b750: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b760: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b770: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b780: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b790: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b7a0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b7b0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b7c0: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b7d0: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b7e0: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b7f0: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b800: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b810: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b820: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b830: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b840: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b850: 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67  next;.    Config
b860: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70  table_insert(cfp
b870: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b880: 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  cfp;.}../* Add a
b890: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
b8a0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66  tion to the conf
b8b0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
b8c0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
b8d0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  *Configlist_addb
b8e0: 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c 65  asis(struct rule
b8f0: 20 2a 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b   *rp, int dot).{
b900: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
b910: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
b920: 20 61 73 73 65 72 74 28 20 62 61 73 69 73 65 6e   assert( basisen
b930: 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
b940: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
b950: 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20  );.  model.rp = 
b960: 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20  rp;.  model.dot 
b970: 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43  = dot;.  cfp = C
b980: 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
b990: 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63  &model);.  if( c
b9a0: 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70  fp==0 ){.    cfp
b9b0: 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a   = newconfig();.
b9c0: 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70      cfp->rp = rp
b9d0: 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d  ;.    cfp->dot =
b9e0: 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66   dot;.    cfp->f
b9f0: 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  ws = SetNew();. 
ba00: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b     cfp->stp = 0;
ba10: 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d  .    cfp->fplp =
ba20: 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   cfp->bplp = 0;.
ba30: 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20      cfp->next = 
ba40: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d  0;.    cfp->bp =
ba50: 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74   0;.    *current
ba60: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63  end = cfp;.    c
ba70: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70  urrentend = &cfp
ba80: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73  ->next;.    *bas
ba90: 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  isend = cfp;.   
baa0: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70   basisend = &cfp
bab0: 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67  ->bp;.    Config
bac0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70  table_insert(cfp
bad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bae0: 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  cfp;.}../* Compu
baf0: 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f  te the closure o
bb00: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
bb10: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
bb20: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
bb30: 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ure(struct lemon
bb40: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75   *lemp).{.  stru
bb50: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
bb60: 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63  *newcfp;.  struc
bb70: 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77  t rule *rp, *new
bb80: 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
bb90: 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20  bol *sp, *xsp;. 
bba0: 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20   int i, dot;..  
bbb0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
bbc0: 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63  nd!=0 );.  for(c
bbd0: 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b  fp=current; cfp;
bbe0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
bbf0: 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72  .    rp = cfp->r
bc00: 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70  p;.    dot = cfp
bc10: 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64  ->dot;.    if( d
bc20: 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63  ot>=rp->nrhs ) c
bc30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20  ontinue;.    sp 
bc40: 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a  = rp->rhs[dot];.
bc50: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
bc60: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b  ==NONTERMINAL ){
bc70: 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72  .      if( sp->r
bc80: 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65  ule==0 && sp!=le
bc90: 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20  mp->errsym ){.  
bca0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
bcb0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
bcc0: 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69  ->line,"Nontermi
bcd0: 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e  nal \"%s\" has n
bce0: 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20  o rules.",.     
bcf0: 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a       sp->name);.
bd00: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
bd10: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
bd20: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72  }.      for(newr
bd30: 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72  p=sp->rule; newr
bd40: 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e  p; newrp=newrp->
bd50: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20  nextlhs){.      
bd60: 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69    newcfp = Confi
bd70: 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c  glist_add(newrp,
bd80: 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
bd90: 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e  i=dot+1; i<rp->n
bda0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
bdb0: 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72       xsp = rp->r
bdc0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
bdd0: 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d   if( xsp->type==
bde0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
bdf0: 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e          SetAdd(n
be00: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
be10: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
be20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
be30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
be40: 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
be50: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
be60: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
be70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
be80: 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79  0; k<xsp->nsubsy
be90: 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; k++){.       
bea0: 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65         SetAdd(ne
beb0: 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e  wcfp->fws, xsp->
bec0: 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78  subsym[k]->index
bed0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
bee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
bef0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
bf00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
bf10: 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70   SetUnion(newcfp
bf20: 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74  ->fws,xsp->first
bf30: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
bf40: 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64    if( xsp->lambd
bf50: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
bf60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bf70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
bf80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
bf90: 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64  >nrhs ) Plink_ad
bfa0: 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77  d(&cfp->fplp,new
bfb0: 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cfp);.      }.  
bfc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bfd0: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
bfe0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
bff0: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
c000: 69 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64  iglist_sort(void
c010: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28  ){.  current = (
c020: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d  struct config*)m
c030: 73 6f 72 74 28 28 63 68 61 72 2a 29 63 75 72 72  sort((char*)curr
c040: 65 6e 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75  ent,(char**)&(cu
c050: 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 0a 20 20  rrent->next),.  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75  Configcmp);.  cu
c090: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
c0a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
c0b0: 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  rt the basis con
c0c0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
c0d0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
c0e0: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69  st_sortbasis(voi
c0f0: 64 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73  d){.  basis = (s
c100: 74 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73  truct config*)ms
c110: 6f 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65  ort((char*)curre
c120: 6e 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72  nt,(char**)&(cur
c130: 72 65 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20  rent->bp),.     
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
c160: 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e  gcmp);.  basisen
c170: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
c180: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
c190: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
c1a0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
c1b0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
c1c0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
c1d0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
c1e0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
c1f0: 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 7b 0a 20  _return(void){. 
c200: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
c210: 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72  old;.  old = cur
c220: 72 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20  rent;.  current 
c230: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
c240: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
c250: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  old;.}../* Retur
c260: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c270: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63  he head of the c
c280: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
c290: 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74  t and.** reset t
c2a0: 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  he list */.struc
c2b0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
c2c0: 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29  list_basis(void)
c2d0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
c2e0: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
c2f0: 62 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d  basis;.  basis =
c300: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
c310: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
c320: 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ;.}../* Free all
c330: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
c340: 20 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61   given configura
c350: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
c360: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74  d Configlist_eat
c370: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
c380: 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp).{.  struct 
c390: 63 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b  config *nextcfp;
c3a0: 0a 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66  .  for(; cfp; cf
c3b0: 70 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20  p=nextcfp){.    
c3c0: 6e 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e  nextcfp = cfp->n
c3d0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
c3e0: 20 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b   cfp->fplp==0 );
c3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
c400: 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->bplp==0 );.   
c410: 20 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20   if( cfp->fws ) 
c420: 53 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73  SetFree(cfp->fws
c430: 29 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e  );.    deletecon
c440: 66 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  fig(cfp);.  }.  
c450: 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  return;.}./*****
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
c470: 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f  m the file "erro
c480: 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c" ***********
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4a0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  ******/./*.** Co
c4b0: 64 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  de for printing 
c4c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
c4d0: 2f 0a 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  /..void ErrorMsg
c4e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c  (const char *fil
c4f0: 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e  ename, int linen
c500: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  o, const char *f
c510: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
c520: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72  a_list ap;.  fpr
c530: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
c540: 3a 25 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65  :%d: ", filename
c550: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f  , lineno);.  va_
c560: 73 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74  start(ap, format
c570: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74  );.  vfprintf(st
c580: 64 65 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  derr,format,ap);
c590: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
c5a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c5b0: 20 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a   "\n");.}./*****
c5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
c5d0: 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e   the file "main.
c5e0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
c5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c600: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d  *******/./*.** M
c610: 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65  ain program file
c620: 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
c630: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
c640: 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61  .*/../* Report a
c650: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
c660: 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62  condition and ab
c670: 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ort.  This funct
c680: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d  ion.** is used m
c690: 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65  ostly by the "Me
c6a0: 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f  moryCheck" macro
c6b0: 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a   in struct.h.*/.
c6c0: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
c6d0: 72 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e  r(void){.  fprin
c6e0: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
c6f0: 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74  f memory.  Abort
c700: 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78  ing...\n");.  ex
c710: 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  it(1);.}..static
c720: 20 69 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30   int nDefine = 0
c730: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
c740: 20 6f 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f   of -D options o
c750: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
c760: 6e 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ne */.static cha
c770: 72 20 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30  r **azDefine = 0
c780: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
c790: 65 20 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a  e -D macros */..
c7a0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
c7b0: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  is called with t
c7c0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65  he argument to e
c7d0: 61 63 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c  ach -D command-l
c7e0: 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41  ine option..** A
c7f0: 64 64 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66  dd the macro def
c800: 69 6e 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65  ined to the azDe
c810: 66 69 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  fine array..*/.s
c820: 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c  tatic void handl
c830: 65 5f 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20  e_D_option(char 
c840: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61  *z){.  char **pa
c850: 7a 3b 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a  z;.  nDefine++;.
c860: 20 20 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68    azDefine = (ch
c870: 61 72 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61  ar **) realloc(a
c880: 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28  zDefine, sizeof(
c890: 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65  azDefine[0])*nDe
c8a0: 66 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44  fine);.  if( azD
c8b0: 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  efine==0 ){.    
c8c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c8d0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
c8e0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
c8f0: 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44    }.  paz = &azD
c900: 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
c910: 3b 0a 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72  ;.  *paz = (char
c920: 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f   *) malloc( lemo
c930: 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a  nStrlen(z)+1 );.
c940: 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b    if( *paz==0 ){
c950: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c960: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
c970: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
c980: 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e  (1);.  }.  lemon
c990: 5f 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29  _strcpy(*paz, z)
c9a0: 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20  ;.  for(z=*paz; 
c9b0: 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a  *z && *z!='='; z
c9c0: 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a  ++){}.  *z = 0;.
c9d0: 7d 0a 0a 2f 2a 20 52 65 6d 62 65 72 20 74 68 65  }../* Rember the
c9e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 75 74   name of the out
c9f0: 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 0a 2a  put directory .*
ca00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
ca10: 75 74 70 75 74 44 69 72 20 3d 20 4e 55 4c 4c 3b  utputDir = NULL;
ca20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e  .static void han
ca30: 64 6c 65 5f 64 5f 6f 70 74 69 6f 6e 28 63 68 61  dle_d_option(cha
ca40: 72 20 2a 7a 29 7b 0a 20 20 6f 75 74 70 75 74 44  r *z){.  outputD
ca50: 69 72 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  ir = (char *) ma
ca60: 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
ca70: 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20  n(z)+1 );.  if( 
ca80: 6f 75 74 70 75 74 44 69 72 3d 3d 30 20 29 7b 0a  outputDir==0 ){.
ca90: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
caa0: 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"out of memor
cab0: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
cac0: 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f  1);.  }.  lemon_
cad0: 73 74 72 63 70 79 28 6f 75 74 70 75 74 44 69 72  strcpy(outputDir
cae0: 2c 20 7a 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  , z);.}..static 
caf0: 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c  char *user_templ
cb00: 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  atename = NULL;.
cb10: 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64  static void hand
cb20: 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72  le_T_option(char
cb30: 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d   *z){.  user_tem
cb40: 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61  platename = (cha
cb50: 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
cb60: 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b  onStrlen(z)+1 );
cb70: 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70  .  if( user_temp
cb80: 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  latename==0 ){. 
cb90: 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
cba0: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
cbb0: 74 72 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c  trcpy(user_templ
cbc0: 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a  atename, z);.}..
cbd0: 2f 2a 20 4d 65 72 67 65 20 74 6f 67 65 74 68 65  /* Merge togethe
cbe0: 72 20 74 6f 20 6c 69 73 74 73 20 6f 66 20 72 75  r to lists of ru
cbf0: 6c 65 73 20 6f 72 64 65 72 65 64 20 62 79 20 72  les ordered by r
cc00: 75 6c 65 2e 69 52 75 6c 65 20 2a 2f 0a 73 74 61  ule.iRule */.sta
cc10: 74 69 63 20 73 74 72 75 63 74 20 72 75 6c 65 20  tic struct rule 
cc20: 2a 52 75 6c 65 5f 6d 65 72 67 65 28 73 74 72 75  *Rule_merge(stru
cc30: 63 74 20 72 75 6c 65 20 2a 70 41 2c 20 73 74 72  ct rule *pA, str
cc40: 75 63 74 20 72 75 6c 65 20 2a 70 42 29 7b 0a 20  uct rule *pB){. 
cc50: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 46   struct rule *pF
cc60: 69 72 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  irst = 0;.  stru
cc70: 63 74 20 72 75 6c 65 20 2a 2a 70 70 50 72 65 76  ct rule **ppPrev
cc80: 20 3d 20 26 70 46 69 72 73 74 3b 0a 20 20 77 68   = &pFirst;.  wh
cc90: 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b  ile( pA && pB ){
cca0: 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 69 52 75  .    if( pA->iRu
ccb0: 6c 65 3c 70 42 2d 3e 69 52 75 6c 65 20 29 7b 0a  le<pB->iRule ){.
ccc0: 20 20 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20        *ppPrev = 
ccd0: 70 41 3b 0a 20 20 20 20 20 20 70 70 50 72 65 76  pA;.      ppPrev
cce0: 20 3d 20 26 70 41 2d 3e 6e 65 78 74 3b 0a 20 20   = &pA->next;.  
ccf0: 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 6e 65 78      pA = pA->nex
cd00: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
cd10: 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 42      *ppPrev = pB
cd20: 3b 0a 20 20 20 20 20 20 70 70 50 72 65 76 20 3d  ;.      ppPrev =
cd30: 20 26 70 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   &pB->next;.    
cd40: 20 20 70 42 20 3d 20 70 42 2d 3e 6e 65 78 74 3b    pB = pB->next;
cd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
cd60: 20 70 41 20 29 7b 0a 20 20 20 20 2a 70 70 50 72   pA ){.    *ppPr
cd70: 65 76 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ev = pA;.  }else
cd80: 7b 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  {.    *ppPrev = 
cd90: 70 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pB;.  }.  return
cda0: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   pFirst;.}../*.*
cdb0: 2a 20 53 6f 72 74 20 61 20 6c 69 73 74 20 6f 66  * Sort a list of
cdc0: 20 72 75 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   rules in order 
cdd0: 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 69 52  of increasing iR
cde0: 75 6c 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  ule value.*/.sta
cdf0: 74 69 63 20 73 74 72 75 63 74 20 72 75 6c 65 20  tic struct rule 
ce00: 2a 52 75 6c 65 5f 73 6f 72 74 28 73 74 72 75 63  *Rule_sort(struc
ce10: 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69  t rule *rp){.  i
ce20: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 72  nt i;.  struct r
ce30: 75 6c 65 20 2a 70 4e 65 78 74 3b 0a 20 20 73 74  ule *pNext;.  st
ce40: 72 75 63 74 20 72 75 6c 65 20 2a 78 5b 33 32 5d  ruct rule *x[32]
ce50: 3b 0a 20 20 6d 65 6d 73 65 74 28 78 2c 20 30 2c  ;.  memset(x, 0,
ce60: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 77   sizeof(x));.  w
ce70: 68 69 6c 65 28 20 72 70 20 29 7b 0a 20 20 20 20  hile( rp ){.    
ce80: 70 4e 65 78 74 20 3d 20 72 70 2d 3e 6e 65 78 74  pNext = rp->next
ce90: 3b 0a 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d  ;.    rp->next =
cea0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
ceb0: 20 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a   i<sizeof(x)/siz
cec0: 65 6f 66 28 78 5b 30 5d 29 20 26 26 20 78 5b 69  eof(x[0]) && x[i
ced0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ]; i++){.      r
cee0: 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65 28 78  p = Rule_merge(x
cef0: 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 20 20 20 20  [i], rp);.      
cf00: 78 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  x[i] = 0;.    }.
cf10: 20 20 20 20 78 5b 69 5d 20 3d 20 72 70 3b 0a 20      x[i] = rp;. 
cf20: 20 20 20 72 70 20 3d 20 70 4e 65 78 74 3b 0a 20     rp = pNext;. 
cf30: 20 7d 0a 20 20 72 70 20 3d 20 30 3b 0a 20 20 66   }.  rp = 0;.  f
cf40: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
cf50: 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29  (x)/sizeof(x[0])
cf60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 70 20 3d  ; i++){.    rp =
cf70: 20 52 75 6c 65 5f 6d 65 72 67 65 28 78 5b 69 5d   Rule_merge(x[i]
cf80: 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rp);.  }.  ret
cf90: 75 72 6e 20 72 70 3b 0a 7d 0a 0a 2f 2a 20 66 6f  urn rp;.}../* fo
cfa0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
cfb0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
cfc0: 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69  char *minimum_si
cfd0: 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c  ze_type(int lwr,
cfe0: 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70   int upr, int *p
cff0: 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20 50 72 69 6e  nByte);../* Prin
d000: 74 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  t a single line 
d010: 6f 66 20 74 68 65 20 22 50 61 72 73 65 72 20 53  of the "Parser S
d020: 74 61 74 73 22 20 6f 75 74 70 75 74 0a 2a 2f 0a  tats" output.*/.
d030: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
d040: 73 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61  s_line(const cha
d050: 72 20 2a 7a 4c 61 62 65 6c 2c 20 69 6e 74 20 69  r *zLabel, int i
d060: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 6e 4c  Value){.  int nL
d070: 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  abel = lemonStrl
d080: 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 70 72  en(zLabel);.  pr
d090: 69 6e 74 66 28 22 20 20 25 73 25 2e 2a 73 20 25  intf("  %s%.*s %
d0a0: 35 64 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 0a 20  5d\n", zLabel,. 
d0b0: 20 20 20 20 20 20 20 20 33 35 2d 6e 4c 61 62 65          35-nLabe
d0c0: 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  l, "............
d0d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
d0e0: 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  ....",.         
d0f0: 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 20 54  iValue);.}../* T
d100: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
d110: 20 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d    Parse the comm
d120: 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20  and line and do 
d130: 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69  it... */.int mai
d140: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
d150: 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20 73 74 61   **argv).{.  sta
d160: 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20  tic int version 
d170: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
d180: 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20  t rpflag = 0;.  
d190: 73 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73  static int basis
d1a0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
d1b0: 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20  ic int compress 
d1c0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
d1d0: 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73  t quiet = 0;.  s
d1e0: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73  tatic int statis
d1f0: 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  tics = 0;.  stat
d200: 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20  ic int mhflag = 
d210: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
d220: 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20  nolinenosflag = 
d230: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
d240: 6e 6f 52 65 73 6f 72 74 20 3d 20 30 3b 0a 20 20  noResort = 0;.  
d250: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
d260: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
d270: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
d280: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
d290: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
d2a0: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
d2b0: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
d2c0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d2d0: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
d2e0: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
d2f0: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
d300: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
d310: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 64     {OPT_FSTR, "d
d320: 22 2c 20 28 63 68 61 72 2a 29 26 68 61 6e 64 6c  ", (char*)&handl
d330: 65 5f 64 5f 6f 70 74 69 6f 6e 2c 20 22 4f 75 74  e_d_option, "Out
d340: 70 75 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20  put directory.  
d350: 44 65 66 61 75 6c 74 20 27 2e 27 22 7d 2c 0a 20  Default '.'"},. 
d360: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44     {OPT_FSTR, "D
d370: 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65  ", (char*)handle
d380: 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69  _D_option, "Defi
d390: 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63  ne an %ifdef mac
d3a0: 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ro."},.    {OPT_
d3b0: 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20 22 49  FSTR, "f", 0, "I
d3c0: 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68  gnored.  (Placeh
d3d0: 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63 6f 6d  older for -f com
d3e0: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22  piler options.)"
d3f0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
d400: 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72  , "g", (char*)&r
d410: 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72  pflag, "Print gr
d420: 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63  ammar without ac
d430: 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f  tions."},.    {O
d440: 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20 30 2c  PT_FSTR, "I", 0,
d450: 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61   "Ignored.  (Pla
d460: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 49  ceholder for '-I
d470: 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  ' compiler optio
d480: 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ns.)"},.    {OPT
d490: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
d4a0: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
d4b0: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
d4c0: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
d4d0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
d4e0: 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a  LAG, "l", (char*
d4f0: 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c  )&nolinenosflag,
d500: 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23   "Do not print #
d510: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  line statements.
d520: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
d530: 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e 6f  R, "O", 0, "Igno
d540: 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64  red.  (Placehold
d550: 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d 70  er for '-O' comp
d560: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d  iler options.)"}
d570: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
d580: 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73 68   "p", (char*)&sh
d590: 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66  owPrecedenceConf
d5a0: 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  lict,.          
d5b0: 20 20 20 20 20 20 20 20 20 20 22 53 68 6f 77 20            "Show 
d5c0: 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c 76  conflicts resolv
d5d0: 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
d5e0: 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b 4f   rules"},.    {O
d5f0: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
d600: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
d610: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
d620: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
d630: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
d640: 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72 2a  LAG, "r", (char*
d650: 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f 20  )&noResort, "Do 
d660: 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e 75  not sort or renu
d670: 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a 20  mber states"},. 
d680: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73     {OPT_FLAG, "s
d690: 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 69  ", (char*)&stati
d6a0: 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20 20  stics,.         
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e 74            "Print
d6d0: 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f   parser stats to
d6e0: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
d6f0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
d700: 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29  AG, "x", (char*)
d710: 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74  &version, "Print
d720: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
d730: 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ber."},.    {OPT
d740: 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61  _FSTR, "T", (cha
d750: 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69  r*)handle_T_opti
d760: 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20 74  on, "Specify a t
d770: 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c  emplate file."},
d780: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
d790: 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64  "W", 0, "Ignored
d7a0: 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20  .  (Placeholder 
d7b0: 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c 65  for '-W' compile
d7c0: 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20  r options.)"},. 
d7d0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30     {OPT_FLAG,0,0
d7e0: 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  ,0}.  };.  int i
d7f0: 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65  ;.  int exitcode
d800: 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ;.  struct lemon
d810: 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 72   lem;.  struct r
d820: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f 70 74 49  ule *rp;..  OptI
d830: 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73  nit(argv,options
d840: 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20  ,stderr);.  if( 
d850: 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  version ){.     
d860: 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65  printf("Lemon ve
d870: 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20  rsion 1.0\n");. 
d880: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
d890: 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28  .  if( OptNArgs(
d8a0: 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69  )!=1 ){.    fpri
d8b0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63  ntf(stderr,"Exac
d8c0: 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65  tly one filename
d8d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71   argument is req
d8e0: 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20  uired.\n");.    
d8f0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
d900: 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73  emset(&lem, 0, s
d910: 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c  izeof(lem));.  l
d920: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b  em.errorcnt = 0;
d930: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
d940: 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f  e the machine */
d950: 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  .  Strsafe_init(
d960: 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  );.  Symbol_init
d970: 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74  ();.  State_init
d980: 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20  ();.  lem.argv0 
d990: 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d  = argv[0];.  lem
d9a0: 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41  .filename = OptA
d9b0: 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73  rg(0);.  lem.bas
d9c0: 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c  isflag = basisfl
d9d0: 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65  ag;.  lem.noline
d9e0: 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65  nosflag = noline
d9f0: 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f  nosflag;.  Symbo
da00: 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 0a 20 20 2f  l_new("$");..  /
da10: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
da20: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
da30: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
da40: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
da50: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
da60: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
da70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
da80: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
da90: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
daa0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
dab0: 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20  .  lem.errsym = 
dac0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 22 65 72 72  Symbol_find("err
dad0: 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  or");..  /* Coun
dae0: 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20  t and index the 
daf0: 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67  symbols of the g
db00: 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 53 79 6d 62  rammar */.  Symb
db10: 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
db20: 7d 22 29 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62  }");.  lem.nsymb
db30: 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  ol = Symbol_coun
db40: 74 28 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f  t();.  lem.symbo
db50: 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61  ls = Symbol_arra
db60: 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  yof();.  for(i=0
db70: 3b 20 69 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b  ; i<lem.nsymbol;
db80: 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c   i++) lem.symbol
db90: 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b  s[i]->index = i;
dba0: 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d  .  qsort(lem.sym
dbb0: 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  bols,lem.nsymbol
dbc0: 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
dbd0: 79 6d 62 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63  ymbol*), Symbolc
dbe0: 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mpp);.  for(i=0;
dbf0: 20 69 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20   i<lem.nsymbol; 
dc00: 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  i++) lem.symbols
dc10: 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a  [i]->index = i;.
dc20: 20 20 77 68 69 6c 65 28 20 6c 65 6d 2e 73 79 6d    while( lem.sym
dc30: 62 6f 6c 73 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d  bols[i-1]->type=
dc40: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
dc50: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 61 73 73 65 72  { i--; }.  asser
dc60: 74 28 20 73 74 72 63 6d 70 28 6c 65 6d 2e 73 79  t( strcmp(lem.sy
dc70: 6d 62 6f 6c 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65  mbols[i-1]->name
dc80: 2c 22 7b 64 65 66 61 75 6c 74 7d 22 29 3d 3d 30  ,"{default}")==0
dc90: 20 29 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f   );.  lem.nsymbo
dca0: 6c 20 3d 20 69 20 2d 20 31 3b 0a 20 20 66 6f 72  l = i - 1;.  for
dcb0: 28 69 3d 31 3b 20 49 53 55 50 50 45 52 28 6c 65  (i=1; ISUPPER(le
dcc0: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  m.symbols[i]->na
dcd0: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  me[0]); i++);.  
dce0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20  lem.nterminal = 
dcf0: 69 3b 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20  i;..  /* Assign 
dd00: 73 65 71 75 65 6e 74 69 61 6c 20 72 75 6c 65 20  sequential rule 
dd10: 6e 75 6d 62 65 72 73 2e 20 20 53 74 61 72 74 20  numbers.  Start 
dd20: 77 69 74 68 20 30 2e 20 20 50 75 74 20 72 75 6c  with 0.  Put rul
dd30: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 0a  es that have no.
dd40: 20 20 2a 2a 20 72 65 64 75 63 65 20 61 63 74 69    ** reduce acti
dd50: 6f 6e 20 43 2d 63 6f 64 65 20 61 73 73 6f 63 69  on C-code associ
dd60: 61 74 65 64 20 77 69 74 68 20 74 68 65 6d 20 6c  ated with them l
dd70: 61 73 74 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ast, so that the
dd80: 20 73 77 69 74 63 68 28 29 0a 20 20 2a 2a 20 73   switch().  ** s
dd90: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 65  tatement that se
dda0: 6c 65 63 74 73 20 72 65 64 75 63 74 69 6f 6e 20  lects reduction 
ddb0: 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76  actions will hav
ddc0: 65 20 61 20 73 6d 61 6c 6c 65 72 20 6a 75 6d 70  e a smaller jump
ddd0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66   table..  */.  f
dde0: 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72  or(i=0, rp=lem.r
ddf0: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
de00: 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 2d 3e 69  next){.    rp->i
de10: 52 75 6c 65 20 3d 20 72 70 2d 3e 63 6f 64 65 20  Rule = rp->code 
de20: 3f 20 69 2b 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a  ? i++ : -1;.  }.
de30: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 2e 72 75 6c    for(rp=lem.rul
de40: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
de50: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
de60: 3e 69 52 75 6c 65 3c 30 20 29 20 72 70 2d 3e 69  >iRule<0 ) rp->i
de70: 52 75 6c 65 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a  Rule = i++;.  }.
de80: 20 20 6c 65 6d 2e 73 74 61 72 74 52 75 6c 65 20    lem.startRule 
de90: 3d 20 6c 65 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65  = lem.rule;.  le
dea0: 6d 2e 72 75 6c 65 20 3d 20 52 75 6c 65 5f 73 6f  m.rule = Rule_so
deb0: 72 74 28 6c 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20  rt(lem.rule);.. 
dec0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72   /* Generate a r
ded0: 65 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72  eprint of the gr
dee0: 61 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73  ammar, if reques
def0: 74 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ted on the comma
df00: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28  nd line */.  if(
df10: 20 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52   rpflag ){.    R
df20: 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20  eprint(&lem);.  
df30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
df40: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a  itialize the siz
df50: 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77  e for all follow
df60: 20 61 6e 64 20 66 69 72 73 74 20 73 65 74 73 20   and first sets 
df70: 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c  */.    SetSize(l
df80: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b  em.nterminal+1);
df90: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
dfa0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72  e precedence for
dfb0: 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f   every productio
dfc0: 6e 20 72 75 6c 65 20 28 74 68 61 74 20 68 61 73  n rule (that has
dfd0: 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e   one) */.    Fin
dfe0: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
dff0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
e000: 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62  Compute the lamb
e010: 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  da-nonterminals 
e020: 61 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73 65  and the first-se
e030: 74 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20  ts for every.   
e040: 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20   ** nonterminal 
e050: 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74  */.    FindFirst
e060: 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  Sets(&lem);..   
e070: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20   /* Compute all 
e080: 4c 52 28 30 29 20 73 74 61 74 65 73 2e 20 20 41  LR(0) states.  A
e090: 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f  lso record follo
e0a0: 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
e0b0: 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73  n.    ** links s
e0c0: 6f 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f  o that the follo
e0d0: 77 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d  w-set can be com
e0e0: 70 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20  puted later */. 
e0f0: 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20     lem.nstate = 
e100: 30 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65  0;.    FindState
e110: 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d  s(&lem);.    lem
e120: 2e 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f  .sorted = State_
e130: 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20  arrayof();..    
e140: 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20  /* Tie up loose 
e150: 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70  ends on the prop
e160: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
e170: 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26  .    FindLinks(&
e180: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
e190: 6d 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  mpute the follow
e1a0: 20 73 65 74 20 6f 66 20 65 76 65 72 79 20 72 65   set of every re
e1b0: 64 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72  ducible configur
e1c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e  ation */.    Fin
e1d0: 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d  dFollowSets(&lem
e1e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
e1f0: 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
e200: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64  bles */.    Find
e210: 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a  Actions(&lem);..
e220: 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20      /* Compress 
e230: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
e240: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d  s */.    if( com
e250: 70 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72  press==0 ) Compr
e260: 65 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b  essTables(&lem);
e270: 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72  ..    /* Reorder
e280: 20 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68   and renumber th
e290: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
e2a0: 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77   states with few
e2b0: 65 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a  er choices.    *
e2c0: 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  * occur at the e
e2d0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  nd.  This is an 
e2e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
e2f0: 74 20 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65  t helps make the
e300: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
e310: 64 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  d parser tables 
e320: 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20  smaller. */.    
e330: 69 66 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20  if( noResort==0 
e340: 29 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26  ) ResortStates(&
e350: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
e360: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20  nerate a report 
e370: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65  of the parser ge
e380: 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22  nerated.  (the "
e390: 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20  y.output" file) 
e3a0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65  */.    if( !quie
e3b0: 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74  t ) ReportOutput
e3c0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
e3d0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75  Generate the sou
e3e0: 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
e3f0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52   parser */.    R
e400: 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c  eportTable(&lem,
e410: 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f   mhflag);..    /
e420: 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64  * Produce a head
e430: 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20  er file for use 
e440: 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20  by the scanner. 
e450: 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20   (This step is. 
e460: 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66     ** omitted if
e470: 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e   the "-m" option
e480: 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65   is used because
e490: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c   makeheaders wil
e4a0: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
e4b0: 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75  e the file for u
e4c0: 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  s.) */.    if( !
e4d0: 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48  mhflag ) ReportH
e4e0: 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d  eader(&lem);.  }
e4f0: 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63  .  if( statistic
e500: 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  s ){.    printf(
e510: 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69  "Parser statisti
e520: 63 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 74 61  cs:\n");.    sta
e530: 74 73 5f 6c 69 6e 65 28 22 74 65 72 6d 69 6e 61  ts_line("termina
e540: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
e550: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
e560: 73 74 61 74 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d  stats_line("non-
e570: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
e580: 22 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  ", lem.nsymbol -
e590: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b   lem.nterminal);
e5a0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e5b0: 22 74 6f 74 61 6c 20 73 79 6d 62 6f 6c 73 22 2c  "total symbols",
e5c0: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20   lem.nsymbol);. 
e5d0: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 72     stats_line("r
e5e0: 75 6c 65 73 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65  ules", lem.nrule
e5f0: 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e  );.    stats_lin
e600: 65 28 22 73 74 61 74 65 73 22 2c 20 6c 65 6d 2e  e("states", lem.
e610: 6e 78 73 74 61 74 65 29 3b 0a 20 20 20 20 73 74  nxstate);.    st
e620: 61 74 73 5f 6c 69 6e 65 28 22 63 6f 6e 66 6c 69  ats_line("confli
e630: 63 74 73 22 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  cts", lem.nconfl
e640: 69 63 74 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  ict);.    stats_
e650: 6c 69 6e 65 28 22 61 63 74 69 6f 6e 20 74 61 62  line("action tab
e660: 6c 65 20 65 6e 74 72 69 65 73 22 2c 20 6c 65 6d  le entries", lem
e670: 2e 6e 61 63 74 69 6f 6e 74 61 62 29 3b 0a 20 20  .nactiontab);.  
e680: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 6c 6f    stats_line("lo
e690: 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20 65 6e  okahead table en
e6a0: 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 6c 6f 6f  tries", lem.nloo
e6b0: 6b 61 68 65 61 64 74 61 62 29 3b 0a 20 20 20 20  kaheadtab);.    
e6c0: 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61  stats_line("tota
e6d0: 6c 20 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79  l table size (by
e6e0: 74 65 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65  tes)", lem.table
e6f0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  size);.  }.  if(
e700: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e   lem.nconflict >
e710: 20 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74   0 ){.    fprint
e720: 66 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72  f(stderr,"%d par
e730: 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c  sing conflicts.\
e740: 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  n",lem.nconflict
e750: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74  );.  }..  /* ret
e760: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
e770: 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  , 1 on failure. 
e780: 2a 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20  */.  exitcode = 
e790: 28 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e  ((lem.errorcnt >
e7a0: 20 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e   0) || (lem.ncon
e7b0: 66 6c 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20  flict > 0)) ? 1 
e7c0: 3a 20 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74  : 0;.  exit(exit
e7d0: 63 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  code);.  return 
e7e0: 28 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a  (exitcode);.}./*
e7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e800: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
e810: 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a  e "msort.c" ****
e820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
e840: 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72  ** A generic mer
e850: 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e  ge-sort program.
e860: 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a  .**.** USAGE:.**
e870: 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20   Let "ptr" be a 
e880: 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20  pointer to some 
e890: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
e8a0: 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  is at the head o
e8b0: 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d  f.** a null-term
e8c0: 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68  inated list.  Th
e8d0: 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c  en to sort the l
e8e0: 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  ist call:.**.** 
e8f0: 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28      ptr = msort(
e900: 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29  ptr,&(ptr->next)
e910: 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20  ,cmpfnc);.**.** 
e920: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63  In the above, "c
e930: 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e  mpfnc" is a poin
e940: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
e950: 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73  n which compares
e960: 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65  .** two instance
e970: 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  s of the structu
e980: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  re and returns a
e990: 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e  n integer, as in
e9a0: 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65  .** strcmp.  The
e9b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e9c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
e9d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
e9e0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c  the.** second el
e9f0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e  ement of the lin
ea00: 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20  ked list.  This 
ea10: 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20  address is used 
ea20: 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  to compute.** th
ea30: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
ea40: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74  "next" field wit
ea50: 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hin the structur
ea60: 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74  e.  The offset t
ea70: 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20  o.** the "next" 
ea80: 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f  field must be co
ea90: 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73  nstant for all s
eaa0: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
eab0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
eac0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
ead0: 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  s a new pointer 
eae0: 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61  which is the hea
eaf0: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a  d of the list.**
eb00: 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a   after sorting..
eb10: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
eb20: 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a  .** Merge-sort..
eb30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
eb40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
eb50: 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65  e next structure
eb60: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
eb70: 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ist..*/.#define 
eb80: 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a  NEXT(A) (*(char*
eb90: 2a 29 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66  *)(((char*)A)+of
eba0: 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e  fset))../*.** In
ebb0: 70 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20  puts:.**   a:   
ebc0: 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75      A sorted, nu
ebd0: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
ebe0: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79  nked list.  (May
ebf0: 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20   be null)..**   
ec00: 62 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65  b:       A sorte
ec10: 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  d, null-terminat
ec20: 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  ed linked list. 
ec30: 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a   (May be null)..
ec40: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20  **   cmp:     A 
ec50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
ec60: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
ec70: 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a  on..**   offset:
ec80: 20 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20    Offset in the 
ec90: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
eca0: 20 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a   "next" field..*
ecb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75  *.** Return Valu
ecc0: 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65  e:.**   A pointe
ecd0: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
ece0: 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63   a sorted list c
ecf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c  ontaining the el
ed00: 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62  ements.**   of b
ed10: 6f 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a  oth a and b..**.
ed20: 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a  ** Side effects:
ed30: 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22  .**   The "next"
ed40: 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c   pointers for el
ed50: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69  ements in the li
ed60: 73 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a  sts a and b are.
ed70: 2a 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  **   changed..*/
ed80: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65  .static char *me
ed90: 72 67 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a  rge(.  char *a,.
eda0: 20 20 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74    char *b,.  int
edb0: 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68   (*cmp)(const ch
edc0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
edd0: 2c 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29  ,.  int offset.)
ede0: 7b 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a  {.  char *ptr, *
edf0: 68 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d  head;..  if( a==
ee00: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
ee10: 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  b;.  }else if( b
ee20: 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20  ==0 ){.    head 
ee30: 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
ee40: 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62    if( (*cmp)(a,b
ee50: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  )<=0 ){.      pt
ee60: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d  r = a;.      a =
ee70: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65   NEXT(a);.    }e
ee80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  lse{.      ptr =
ee90: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45   b;.      b = NE
eea0: 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  XT(b);.    }.   
eeb0: 20 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20   head = ptr;.   
eec0: 20 77 68 69 6c 65 28 20 61 20 26 26 20 62 20 29   while( a && b )
eed0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d  {.      if( (*cm
eee0: 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20  p)(a,b)<=0 ){.  
eef0: 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20        NEXT(ptr) 
ef00: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72  = a;.        ptr
ef10: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20   = a;.        a 
ef20: 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20  = NEXT(a);.     
ef30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ef40: 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20  NEXT(ptr) = b;. 
ef50: 20 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a         ptr = b;.
ef60: 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54          b = NEXT
ef70: 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (b);.      }.   
ef80: 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e   }.    if( a ) N
ef90: 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20  EXT(ptr) = a;.  
efa0: 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70    else    NEXT(p
efb0: 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72  tr) = b;.  }.  r
efc0: 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f  eturn head;.}../
efd0: 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20  *.** Inputs:.** 
efe0: 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69    list:      Poi
eff0: 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79  nter to a singly
f000: 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20  -linked list of 
f010: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20  structures..**  
f020: 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e   next:      Poin
f030: 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74  ter to pointer t
f040: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  o the second ele
f050: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74  ment of the list
f060: 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20  ..**   cmp:     
f070: 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66    A comparison f
f080: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52  unction..**.** R
f090: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
f0a0: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
f0b0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
f0c0: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
f0d0: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
f0e0: 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20  .**   orginally 
f0f0: 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  in list..**.** S
f100: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20  ide effects:.** 
f110: 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69    The "next" poi
f120: 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e  nters for elemen
f130: 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63  ts in list are c
f140: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  hanged..*/.#defi
f150: 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73  ne LISTSIZE 30.s
f160: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72  tatic char *msor
f170: 74 28 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c  t(.  char *list,
f180: 0a 20 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a  .  char **next,.
f190: 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e    int (*cmp)(con
f1a0: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
f1b0: 68 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67  har*).){.  unsig
f1c0: 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ned long offset;
f1d0: 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63  .  char *ep;.  c
f1e0: 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a  har *set[LISTSIZ
f1f0: 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f  E];.  int i;.  o
f200: 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65  ffset = (unsigne
f210: 64 20 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e  d long)((char*)n
f220: 65 78 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73  ext - (char*)lis
f230: 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  t);.  for(i=0; i
f240: 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20  <LISTSIZE; i++) 
f250: 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68  set[i] = 0;.  wh
f260: 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20  ile( list ){.   
f270: 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20   ep = list;.    
f280: 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74  list = NEXT(list
f290: 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20  );.    NEXT(ep) 
f2a0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
f2b0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26  ; i<LISTSIZE-1 &
f2c0: 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b  & set[i]!=0; i++
f2d0: 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65  ){.      ep = me
f2e0: 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d  rge(ep,set[i],cm
f2f0: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  p,offset);.     
f300: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20   set[i] = 0;.   
f310: 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20   }.    set[i] = 
f320: 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30  ep;.  }.  ep = 0
f330: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
f340: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66  ISTSIZE; i++) if
f350: 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20  ( set[i] ) ep = 
f360: 6d 65 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c  merge(set[i],ep,
f370: 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72  cmp,offset);.  r
f380: 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a  eturn ep;.}./***
f390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3a0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
f3b0: 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a  ile "option.c" *
f3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69  *********/.stati
f3e0: 63 20 63 68 61 72 20 2a 2a 67 5f 61 72 67 76 3b  c char **g_argv;
f3f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
f400: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74  _options *op;.st
f410: 61 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74  atic FILE *errst
f420: 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49  ream;..#define I
f430: 53 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d  SOPT(X) ((X)[0]=
f440: 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b  ='-'||(X)[0]=='+
f450: 27 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d  '||strchr((X),'=
f460: 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72  ')!=0)../*.** Pr
f470: 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  int the command 
f480: 6c 69 6e 65 20 77 69 74 68 20 61 20 63 61 72 72  line with a carr
f490: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ot pointing to t
f4a0: 68 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65  he k-th characte
f4b0: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68  r.** of the n-th
f4c0: 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
f4d0: 63 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 69  c void errline(i
f4e0: 6e 74 20 6e 2c 20 69 6e 74 20 6b 2c 20 46 49 4c  nt n, int k, FIL
f4f0: 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20  E *err).{.  int 
f500: 73 70 63 6e 74 2c 20 69 3b 0a 20 20 69 66 28 20  spcnt, i;.  if( 
f510: 67 5f 61 72 67 76 5b 30 5d 20 29 20 66 70 72 69  g_argv[0] ) fpri
f520: 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 67 5f 61  ntf(err,"%s",g_a
f530: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74  rgv[0]);.  spcnt
f540: 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 67   = lemonStrlen(g
f550: 5f 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20  _argv[0]) + 1;. 
f560: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
f570: 20 67 5f 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29   g_argv[i]; i++)
f580: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
f590: 72 2c 22 20 25 73 22 2c 67 5f 61 72 67 76 5b 69  r," %s",g_argv[i
f5a0: 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d  ]);.    spcnt +=
f5b0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 67 5f 61   lemonStrlen(g_a
f5c0: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
f5d0: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
f5e0: 6f 72 28 3b 20 67 5f 61 72 67 76 5b 69 5d 3b 20  or(; g_argv[i]; 
f5f0: 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72  i++) fprintf(err
f600: 2c 22 20 25 73 22 2c 67 5f 61 72 67 76 5b 69 5d  ," %s",g_argv[i]
f610: 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32  );.  if( spcnt<2
f620: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
f630: 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68  (err,"\n%*s^-- h
f640: 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29  ere\n",spcnt,"")
f650: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
f660: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
f670: 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63  shere --^\n",spc
f680: 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a  nt-7,"");.  }.}.
f690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f6a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e  e index of the N
f6b0: 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61  -th non-switch a
f6c0: 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  rgument.  Return
f6d0: 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f   -1.** if N is o
f6e0: 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a  ut of range..*/.
f6f0: 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e  static int argin
f700: 64 65 78 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69  dex(int n).{.  i
f710: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64 61 73 68  nt i;.  int dash
f720: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  dash = 0;.  if( 
f730: 67 5f 61 72 67 76 21 3d 30 20 26 26 20 2a 67 5f  g_argv!=0 && *g_
f740: 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66  argv!=0 ){.    f
f750: 6f 72 28 69 3d 31 3b 20 67 5f 61 72 67 76 5b 69  or(i=1; g_argv[i
f760: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
f770: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
f780: 49 53 4f 50 54 28 67 5f 61 72 67 76 5b 69 5d 29  ISOPT(g_argv[i])
f790: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f7a0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  n==0 ) return i;
f7b0: 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
f7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f7d0: 73 74 72 63 6d 70 28 67 5f 61 72 67 76 5b 69 5d  strcmp(g_argv[i]
f7e0: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
f7f0: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
f800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
f810: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20  .}..static char 
f820: 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e  emsg[] = "Comman
f830: 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72  d line syntax er
f840: 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50  ror: ";../*.** P
f850: 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f  rocess a flag co
f860: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d  mmand line argum
f870: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
f880: 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69  nt handleflags(i
f890: 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29  nt i, FILE *err)
f8a0: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
f8b0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
f8c0: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
f8d0: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
f8e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
f8f0: 6e 63 6d 70 28 26 67 5f 61 72 67 76 5b 69 5d 5b  ncmp(&g_argv[i][
f900: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
f910: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
f920: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
f930: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 67  eak;.  }.  v = g
f940: 5f 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27  _argv[i][0]=='-'
f950: 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20   ? 1 : 0;.  if( 
f960: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29  op[j].label==0 )
f970: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
f980: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
f990: 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20  rr,"%sundefined 
f9a0: 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29  option.\n",emsg)
f9b0: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
f9c0: 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,1,err);.    }.
f9d0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
f9e0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
f9f0: 61 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  arg==0 ){.    /*
fa00: 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
fa10: 69 6f 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ion */.  }else i
fa20: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
fa30: 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a  PT_FLAG ){.    *
fa40: 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67  ((int*)op[j].arg
fa50: 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69  ) = v;.  }else i
fa60: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
fa70: 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20  PT_FFLAG ){.    
fa80: 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29  (*(void(*)(int))
fa90: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b  (op[j].arg))(v);
faa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
fab0: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54  j].type==OPT_FST
fac0: 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  R ){.    (*(void
fad0: 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b  (*)(char *))(op[
fae0: 6a 5d 2e 61 72 67 29 29 28 26 67 5f 61 72 67 76  j].arg))(&g_argv
faf0: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
fb00: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
fb10: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
fb20: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
fb30: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
fb40: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
fb50: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
fb60: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
fb70: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
fb80: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
fb90: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
fba0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
fbb0: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
fbc0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
fbd0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
fbe0: 77 69 74 63 68 28 69 6e 74 20 69 2c 20 46 49 4c  witch(int i, FIL
fbf0: 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20  E *err).{.  int 
fc00: 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65  lv = 0;.  double
fc10: 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61   dv = 0.0;.  cha
fc20: 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b  r *sv = 0, *end;
fc30: 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69  .  char *cp;.  i
fc40: 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt j;.  int errc
fc50: 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73  nt = 0;.  cp = s
fc60: 74 72 63 68 72 28 67 5f 61 72 67 76 5b 69 5d 2c  trchr(g_argv[i],
fc70: 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28 20  '=');.  assert( 
fc80: 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d  cp!=0 );.  *cp =
fc90: 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   0;.  for(j=0; o
fca0: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
fcb0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
fcc0: 28 67 5f 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d  (g_argv[i],op[j]
fcd0: 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65  .label)==0 ) bre
fce0: 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20  ak;.  }.  *cp = 
fcf0: 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  '=';.  if( op[j]
fd00: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
fd10: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
fd20: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
fd30: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
fd40: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
fd50: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
fd60: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
fd70: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
fd80: 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  {.    cp++;.    
fd90: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
fda0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
fdb0: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
fdc0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
fdd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72  .        if( err
fde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
fdf0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74  rintf(err,"%sopt
fe00: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
fe10: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
fe20: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72  g);.          er
fe30: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
fe40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fe50: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
fe60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fe70: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
fe80: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
fe90: 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d  BL:.        dv =
fea0: 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29   strtod(cp,&end)
feb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
fec0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
fed0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
fee0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
fef0: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
ff00: 20 20 20 22 25 73 69 6c 6c 65 67 61 6c 20 63 68     "%sillegal ch
ff10: 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74  aracter in float
ff20: 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65  ing-point argume
ff30: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
ff40: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
ff50: 65 28 69 2c 28 69 6e 74 29 28 28 63 68 61 72 2a  e(i,(int)((char*
ff60: 29 65 6e 64 2d 28 63 68 61 72 2a 29 67 5f 61 72  )end-(char*)g_ar
ff70: 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20 20 20  gv[i]),err);.   
ff80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff90: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
ffa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ffb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ffc0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
ffd0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
ffe0: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
fff0: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
10000 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
10010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10020 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
10030 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
10040 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
10050 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
10060 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
10070 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
10080 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28  errline(i,(int)(
10090 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72  (char*)end-(char
100a0 2a 29 67 5f 61 72 67 76 5b 69 5d 29 2c 65 72 72  *)g_argv[i]),err
100b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
100c0 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
100d0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
100e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
100f0 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
10100 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
10110 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
10120 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
10130 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
10140 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
10150 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
10160 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
10170 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
10180 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10190 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
101a0 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
101b0 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
101c0 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
101d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
101e0 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
101f0 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f     (*(void(*)(do
10200 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble))(op[j].arg
10210 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20  ))(dv);.        
10220 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10230 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
10240 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d     *(int*)(op[j]
10250 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20  .arg) = lv;.    
10260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10270 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
10280 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
10290 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61  *)(int))(op[j].a
102a0 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20  rg))((int)lv);. 
102b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
102c0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
102d0 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  :.        *(char
102e0 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  **)(op[j].arg) =
102f0 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   sv;.        bre
10300 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10310 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
10320 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72   (*(void(*)(char
10330 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29   *))(op[j].arg))
10340 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (sv);.        br
10350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
10360 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
10370 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63  }..int OptInit(c
10380 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20  har **a, struct 
10390 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49  s_options *o, FI
103a0 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74  LE *err).{.  int
103b0 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 67   errcnt = 0;.  g
103c0 5f 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20  _argv = a;.  op 
103d0 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d  = o;.  errstream
103e0 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 67 5f   = err;.  if( g_
103f0 61 72 67 76 20 26 26 20 2a 67 5f 61 72 67 76 20  argv && *g_argv 
10400 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74  && op ){.    int
10410 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
10420 20 67 5f 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29   g_argv[i]; i++)
10430 7b 0a 20 20 20 20 20 20 69 66 28 20 67 5f 61 72  {.      if( g_ar
10440 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
10450 20 67 5f 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27   g_argv[i][0]=='
10460 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
10470 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
10480 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
10490 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
104a0 68 72 28 67 5f 61 72 67 76 5b 69 5d 2c 27 3d 27  hr(g_argv[i],'='
104b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
104c0 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
104d0 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
104e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
104f0 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
10500 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
10510 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
10520 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
10530 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
10540 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
10550 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
10560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
10570 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
10580 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6e  (void){.  int cn
10590 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73  t = 0;.  int das
105a0 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74  hdash = 0;.  int
105b0 20 69 3b 0a 20 20 69 66 28 20 67 5f 61 72 67 76   i;.  if( g_argv
105c0 21 3d 30 20 26 26 20 67 5f 61 72 67 76 5b 30 5d  !=0 && g_argv[0]
105d0 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
105e0 3d 31 3b 20 67 5f 61 72 67 76 5b 69 5d 3b 20 69  =1; g_argv[i]; i
105f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
10600 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
10610 54 28 67 5f 61 72 67 76 5b 69 5d 29 20 29 20 63  T(g_argv[i]) ) c
10620 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
10630 73 74 72 63 6d 70 28 67 5f 61 72 67 76 5b 69 5d  strcmp(g_argv[i]
10640 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
10650 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
10660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
10670 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
10680 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74  g(int n).{.  int
10690 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64   i;.  i = argind
106a0 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex(n);.  return 
106b0 69 3e 3d 30 20 3f 20 67 5f 61 72 67 76 5b 69 5d  i>=0 ? g_argv[i]
106c0 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70   : 0;.}..void Op
106d0 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  tErr(int n).{.  
106e0 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
106f0 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20  index(n);.  if( 
10700 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69  i>=0 ) errline(i
10710 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d  ,0,errstream);.}
10720 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28  ..void OptPrint(
10730 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
10740 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a    int max, len;.
10750 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72    max = 0;.  for
10760 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
10770 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e  l; i++){.    len
10780 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f   = lemonStrlen(o
10790 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b  p[i].label) + 1;
107a0 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
107b0 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  i].type ){.     
107c0 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
107d0 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
107e0 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72  FLAG:.        br
107f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10800 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
10810 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
10820 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20        len += 9; 
10830 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
10840 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a  of "<integer>" *
10850 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
10860 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10870 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
10880 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
10890 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20    len += 6;     
108a0 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
108b0 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20  <real>" */.     
108c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
108d0 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
108e0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
108f0 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  R:.        len +
10900 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 8;       /* le
10910 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67  ngth of "<string
10920 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
10930 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10940 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78  f( len>max ) max
10950 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f   = len;.  }.  fo
10960 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
10970 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  el; i++){.    sw
10980 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65  itch( op[i].type
10990 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
109a0 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
109b0 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
109c0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
109d0 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a  rrstream,"  -%-*
109e0 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b  s  %s\n",max,op[
109f0 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d  i].label,op[i].m
10a00 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
10a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10a20 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
10a30 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
10a40 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
10a50 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
10a60 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25  s<integer>%*s  %
10a70 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
10a80 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
10a90 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65  )(max-lemonStrle
10aa0 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39  n(op[i].label)-9
10ab0 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
10ac0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
10ad0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10ae0 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
10af0 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
10b00 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
10b10 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72 65  stream,"  -%s<re
10b20 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  al>%*s  %s\n",op
10b30 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
10b40 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c       (int)(max-l
10b50 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d  emonStrlen(op[i]
10b60 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70  .label)-6),"",op
10b70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
10b80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b90 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
10ba0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10bb0 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70  FSTR:.        fp
10bc0 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
10bd0 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25 2a  "  -%s<string>%*
10be0 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c  s  %s\n",op[i].l
10bf0 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
10c00 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53  (int)(max-lemonS
10c10 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
10c20 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-8),"",op[i].m
10c30 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
10c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10c50 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
10c70 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
10c80 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.c" ***********
10c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ca0 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66  */./*.** Input f
10cb0 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20 74  ile parser for t
10cc0 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
10cd0 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
10ce0 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
10cf0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75  he parser */.enu
10d00 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e  m e_state {.  IN
10d10 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54  ITIALIZE,.  WAIT
10d20 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
10d30 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f  RULE,.  WAITING_
10d40 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44  FOR_DECL_KEYWORD
10d50 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
10d60 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54  DECL_ARG,.  WAIT
10d70 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10d80 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49  CE_SYMBOL,.  WAI
10d90 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a  TING_FOR_ARROW,.
10da0 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f    IN_RHS,.  LHS_
10db0 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41  ALIAS_1,.  LHS_A
10dc0 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c  LIAS_2,.  LHS_AL
10dd0 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49  IAS_3,.  RHS_ALI
10de0 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41  AS_1,.  RHS_ALIA
10df0 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e 43  S_2,.  PRECEDENC
10e00 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43  E_MARK_1,.  PREC
10e10 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20  EDENCE_MARK_2,. 
10e20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
10e30 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53 59  LE_ERROR,.  RESY
10e40 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
10e50 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ROR,.  WAITING_F
10e60 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
10e70 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
10e80 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
10e90 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
10ea0 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a  OR_FALLBACK_ID,.
10eb0 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49    WAITING_FOR_WI
10ec0 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57 41 49  LDCARD_ID,.  WAI
10ed0 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49  TING_FOR_CLASS_I
10ee0 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
10ef0 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 2c 0a 20 20  _CLASS_TOKEN,.  
10f00 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
10f10 4e 5f 4e 41 4d 45 0a 7d 3b 0a 73 74 72 75 63 74  N_NAME.};.struct
10f20 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72   pstate {.  char
10f30 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
10f40 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10f50 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
10f60 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f   int tokenlineno
10f70 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75  ;      /* Linenu
10f80 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75  mber at which cu
10f90 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72  rrent token star
10fa0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ts */.  int erro
10fb0 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rcnt;         /*
10fc0 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
10fd0 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  s so far */.  ch
10fe0 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20  ar *tokenstart; 
10ff0 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63      /* Text of c
11000 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  urrent token */.
11010 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
11020 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  gp;     /* Globa
11030 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a  l state vector *
11040 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65  /.  enum e_state
11050 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 2f   state;        /
11060 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
11070 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73  he parser */.  s
11080 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
11090 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65  llback;   /* The
110a0 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
110b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
110c0 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b 20 20 20 20  ol *tkclass;    
110d0 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61 73 73 20 73  /* Token class s
110e0 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63  ymbol */.  struc
110f0 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
11100 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
11110 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65  nd side of curre
11120 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e  nt rule */.  con
11130 73 74 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61  st char *lhsalia
11140 73 3b 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s;      /* Alias
11150 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a   for the LHS */.
11160 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11180 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  Number of right-
11190 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c  hand side symbol
111a0 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75  s seen */.  stru
111b0 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d  ct symbol *rhs[M
111c0 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20  AXRHS];  /* RHS 
111d0 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e  symbols */.  con
111e0 73 74 20 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d  st char *alias[M
111f0 41 58 52 48 53 5d 3b 20 2f 2a 20 41 6c 69 61 73  AXRHS]; /* Alias
11200 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  es for each RHS 
11210 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29  symbol (or NULL)
11220 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
11230 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20  e *prevrule;    
11240 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c   /* Previous rul
11250 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 6f  e parsed */.  co
11260 6e 73 74 20 63 68 61 72 20 2a 64 65 63 6c 6b 65  nst char *declke
11270 79 77 6f 72 64 3b 20 20 20 2f 2a 20 4b 65 79 77  yword;   /* Keyw
11280 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61  ord of a declara
11290 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
112a0 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20  *declargslot;   
112b0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
112c0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
112d0 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
112e0 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 6e   put */.  int in
112f0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20 20  sertLineMacro;  
11300 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69 6e       /* Add #lin
11310 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72 61  e before declara
11320 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  tion insert */. 
11330 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f   int *decllineno
11340 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20 57  slot;       /* W
11350 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 64 65  here to write de
11360 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20 6e  claration line n
11370 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  umber */.  enum 
11380 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f  e_assoc declasso
11390 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  c;    /* Assign 
113a0 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e  this association
113b0 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
113c0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  ts */.  int prec
113d0 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
113e0 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
113f0 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  s precedence to 
11400 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
11410 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
11420 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f  *firstrule;    /
11430 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
11440 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  st rule in the g
11450 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75  rammar */.  stru
11460 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c  ct rule *lastrul
11470 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
11480 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  r to the most re
11490 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75  cently parsed ru
114a0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72  le */.};../* Par
114b0 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  se a single toke
114c0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
114d0 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 73   parseonetoken(s
114e0 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73  truct pstate *ps
114f0 70 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p).{.  const cha
11500 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73  r *x;.  x = Strs
11510 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74  afe(psp->tokenst
11520 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76  art);     /* Sav
11530 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d  e the token perm
11540 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30  anently */.#if 0
11550 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64  .  printf("%s:%d
11560 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61  : Token=[%s] sta
11570 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69  te=%d\n",psp->fi
11580 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11590 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70  nlineno,.    x,p
115a0 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64  sp->state);.#end
115b0 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73 70  if.  switch( psp
115c0 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
115d0 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a  ase INITIALIZE:.
115e0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
115f0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
11600 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20  sp->preccounter 
11610 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
11620 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d  firstrule = psp-
11630 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20  >lastrule = 0;. 
11640 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72       psp->gp->nr
11650 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f  ule = 0;.      /
11660 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e  * Fall thru to n
11670 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
11680 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11690 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20  _DECL_OR_RULE:. 
116a0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
116b0 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  %' ){.        ps
116c0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
116d0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
116e0 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ORD;.      }else
116f0 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b 30   if( ISLOWER(x[0
11700 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
11710 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f  p->lhs = Symbol_
11720 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
11730 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20  psp->nrhs = 0;. 
11740 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
11750 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
11760 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11770 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
11780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11790 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20  ( x[0]=='{' ){. 
117a0 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
117b0 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
117c0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
117d0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
117e0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
117f0 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70  ,."There is no p
11800 72 69 6f 72 20 72 75 6c 65 20 75 70 6f 6e 20 77  rior rule upon w
11810 68 69 63 68 20 74 6f 20 61 74 74 61 63 68 20 74  hich to attach t
11820 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65  he code \.fragme
11830 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  nt which begins 
11840 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b  on this line.");
11850 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11860 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
11880 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
11890 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
118a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
118b0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
118c0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65  kenlineno,."Code
118d0 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e   fragment beginn
118e0 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
118f0 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
11900 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
11910 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
11920 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
11930 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11940 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11950 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
11960 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73  vrule->line = ps
11970 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
11980 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11990 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20  revrule->code = 
119a0 26 78 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  &x[1];.         
119b0 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
119c0 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  noCode = 0;.    
119d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
119e0 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20  e if( x[0]=='[' 
119f0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11a00 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e  state = PRECEDEN
11a10 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20  CE_MARK_1;.     
11a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11a30 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11a40 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11a50 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11a60 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22     "Token \"%s\"
11a70 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65   should be eithe
11a80 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f  r \"%%\" or a no
11a90 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22  nterminal name."
11aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a  ,.          x);.
11ab0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11ac0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
11ad0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11ae0 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
11af0 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20  E_MARK_1:.      
11b00 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30  if( !ISUPPER(x[0
11b10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
11b20 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11b30 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11b40 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11b50 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65   "The precedence
11b60 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20   symbol must be 
11b70 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20  a terminal.");. 
11b80 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11b90 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11ba0 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
11bb0 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  vrule==0 ){.    
11bc0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11bd0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11be0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11bf0 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73         "There is
11c00 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74   no prior rule t
11c10 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65  o assign precede
11c20 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78  nce \"[%s]\".",x
11c30 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11c40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11c50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
11c60 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
11c70 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ym!=0 ){.       
11c80 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11c90 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11ca0 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65  enlineno,."Prece
11cb0 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68  dence mark on th
11cc0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
11cd0 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
11ce0 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
11cf0 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
11d00 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11d10 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
11d20 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72  .        psp->pr
11d30 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20  evrule->precsym 
11d40 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
11d60 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
11d70 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20  EDENCE_MARK_2;. 
11d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11d90 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f  case PRECEDENCE_
11da0 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66  MARK_2:.      if
11db0 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20  ( x[0]!=']' ){. 
11dc0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11dd0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11de0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11df0 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
11e00 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63  ng \"]\" on prec
11e10 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a  edence mark.");.
11e20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11e30 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
11e40 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
11e50 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11e60 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
11e70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11e80 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11e90 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28  ARROW:.      if(
11ea0 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[0]==':' && x[
11eb0 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d  1]==':' && x[2]=
11ec0 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
11ed0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
11ee0 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
11ef0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29   if( x[0]=='(' )
11f00 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11f10 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
11f20 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
11f30 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11f40 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11f50 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11f60 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70  ,.          "Exp
11f70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c  ected to see a \
11f80 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ":\" following t
11f90 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he LHS symbol \"
11fa0 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
11fb0 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65    psp->lhs->name
11fc0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11fd0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11fe0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11ff0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
12000 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
12010 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12020 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
12030 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 49  S_1:.      if( I
12040 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
12050 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
12060 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20  alias = x;.     
12070 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12080 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  LHS_ALIAS_2;.   
12090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
120a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
120b0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
120c0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
120d0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
120e0 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
120f0 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22  s for the LHS \"
12100 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
12110 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e     x,psp->lhs->n
12120 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
12130 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12140 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12150 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12160 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
12170 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12180 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
12190 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
121a0 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
121b0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
121c0 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b  e = LHS_ALIAS_3;
121d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
121e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
121f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12200 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12210 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
12220 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
12230 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
12240 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
12250 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
12260 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12270 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
12280 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12290 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
122a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
122b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
122c0 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20  HS_ALIAS_3:.    
122d0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20    if( x[0]==':' 
122e0 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  && x[1]==':' && 
122f0 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20  x[2]=='=' ){.   
12300 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12310 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
12320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
12330 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12340 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12350 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12360 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c    "Missing \"->\
12370 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25  " following: \"%
12380 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20  s(%s)\".",.     
12390 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
123a0 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  name,psp->lhsali
123b0 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
123c0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
123d0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
123e0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
123f0 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
12400 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12410 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53  .    case IN_RHS
12420 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
12430 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
12440 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
12450 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28  ;.        rp = (
12460 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61  struct rule *)ca
12470 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
12480 75 63 74 20 72 75 6c 65 29 20 2b 0a 20 20 20 20  uct rule) +.    
12490 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
124a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
124b0 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
124c0 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
124d0 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rhs, 1);.       
124e0 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20   if( rp==0 ){.  
124f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12500 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12510 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12520 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
12530 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f  n't allocate eno
12540 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ugh memory for t
12550 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  his rule.");.   
12560 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12570 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12580 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
12590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
125a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
125b0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
125c0 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
125d0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
125e0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
125f0 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
12600 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
12610 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
12620 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ias = (const cha
12630 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
12640 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
12650 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12660 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
12670 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
12680 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
12690 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
126a0 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
126b0 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
126c0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
126d0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
126e0 5b 69 5d 21 3d 30 20 29 7b 20 72 70 2d 3e 72 68  [i]!=0 ){ rp->rh
126f0 73 5b 69 5d 2d 3e 62 43 6f 6e 74 65 6e 74 20 3d  s[i]->bContent =
12700 20 31 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20   1; }.          
12710 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  }.          rp->
12720 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a  lhs = psp->lhs;.
12730 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
12740 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68  salias = psp->lh
12750 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  salias;.        
12760 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70    rp->nrhs = psp
12770 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20  ->nrhs;.        
12780 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
12790 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 6f            rp->no
127a0 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Code = 1;.      
127b0 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
127c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
127d0 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e  p->index = psp->
127e0 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20  gp->nrule++;.   
127f0 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c         rp->nextl
12800 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75  hs = rp->lhs->ru
12810 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  le;.          rp
12820 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70  ->lhs->rule = rp
12830 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
12840 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  next = 0;.      
12850 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72      if( psp->fir
12860 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  strule==0 ){.   
12870 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69           psp->fi
12880 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
12890 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  astrule = rp;.  
128a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
128b0 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
128c0 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d  lastrule->next =
128d0 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rp;.           
128e0 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
128f0 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rp;.          }
12900 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12910 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 20  prevrule = rp;. 
12920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12930 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12940 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12950 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
12960 6c 73 65 20 69 66 28 20 49 53 41 4c 50 48 41 28  lse if( ISALPHA(
12970 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12980 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d   if( psp->nrhs>=
12990 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20  MAXRHS ){.      
129a0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
129b0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
129c0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
129d0 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61           "Too ma
129e0 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48  ny symbols on RH
129f0 53 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e  S of rule beginn
12a00 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c  ing at \"%s\".",
12a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b  .            x);
12a20 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12a30 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12a40 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12a50 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
12a60 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
12a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a80 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73       psp->rhs[ps
12a90 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f  p->nrhs] = Symbo
12aa0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
12ab0 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70      psp->alias[p
12ac0 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20  sp->nrhs] = 0;. 
12ad0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72           psp->nr
12ae0 68 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hs++;.        }.
12af0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12b00 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
12b10 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70 2d  0]=='/') && psp-
12b20 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nrhs>0 ){.     
12b30 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
12b40 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68 73   *msp = psp->rhs
12b50 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20  [psp->nrhs-1];. 
12b60 20 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d 3e         if( msp->
12b70 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49  type!=MULTITERMI
12b80 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
12b90 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12ba0 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20  origsp = msp;.  
12bb0 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20 28 73          msp = (s
12bc0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 20  truct symbol *) 
12bd0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
12be0 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
12bf0 20 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c    memset(msp, 0,
12c00 20 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a   sizeof(*msp));.
12c10 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74            msp->t
12c20 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49  ype = MULTITERMI
12c30 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  NAL;.          m
12c40 73 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b  sp->nsubsym = 1;
12c50 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  .          msp->
12c60 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74  subsym = (struct
12c70 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 63 61 6c 6c   symbol **) call
12c80 6f 63 28 31 2c 73 69 7a 65 6f 66 28 73 74 72 75  oc(1,sizeof(stru
12c90 63 74 20 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20  ct symbol*));.  
12ca0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
12cb0 73 79 6d 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b  sym[0] = origsp;
12cc0 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  .          msp->
12cd0 6e 61 6d 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e  name = origsp->n
12ce0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
12cf0 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
12d00 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20  s-1] = msp;.    
12d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 73      }.        ms
12d20 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20  p->nsubsym++;.  
12d30 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
12d40 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  m = (struct symb
12d50 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d  ol **) realloc(m
12d60 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20  sp->subsym,.    
12d70 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72        sizeof(str
12d80 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70  uct symbol*)*msp
12d90 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20  ->nsubsym);.    
12da0 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
12db0 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20  msp->nsubsym-1] 
12dc0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b  = Symbol_new(&x[
12dd0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
12de0 20 49 53 4c 4f 57 45 52 28 78 5b 31 5d 29 20 7c   ISLOWER(x[1]) |
12df0 7c 20 49 53 4c 4f 57 45 52 28 6d 73 70 2d 3e 73  | ISLOWER(msp->s
12e00 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30  ubsym[0]->name[0
12e10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
12e20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12e30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12e40 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12e50 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72       "Cannot for
12e60 6d 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e  m a compound con
12e70 74 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65  taining a non-te
12e80 72 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20  rminal");.      
12e90 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12ea0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
12eb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
12ec0 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d  [0]=='(' && psp-
12ed0 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nrhs>0 ){.     
12ee0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12ef0 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  RHS_ALIAS_1;.   
12f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12f10 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12f20 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12f30 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12f40 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68       "Illegal ch
12f50 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f  aracter on RHS o
12f60 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22  f rule: \"%s\"."
12f70 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
12f80 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12f90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12fa0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
12fb0 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
12fc0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12fd0 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
12fe0 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
12ff0 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29   ISALPHA(x[0]) )
13000 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61  {.        psp->a
13010 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  lias[psp->nrhs-1
13020 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
13030 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f  sp->state = RHS_
13040 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d  ALIAS_2;.      }
13050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
13060 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
13070 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
13080 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
13090 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20   "\"%s\" is not 
130a0 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f  a valid alias fo
130b0 72 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  r the RHS symbol
130c0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
130d0 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73        x,psp->rhs
130e0 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e  [psp->nrhs-1]->n
130f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
13100 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13110 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13120 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
13130 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
13140 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13150 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41  ;.    case RHS_A
13160 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
13170 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
13180 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13190 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
131a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
131b0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
131c0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
131d0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
131e0 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29      "Missing \")
131f0 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53  \" following LHS
13200 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73   alias name \"%s
13210 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  \".",psp->lhsali
13220 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
13230 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13240 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13250 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
13260 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
13270 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13280 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
13290 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
132a0 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20 49 53  RD:.      if( IS
132b0 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20  ALPHA(x[0]) ){. 
132c0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
132d0 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20  keyword = x;.   
132e0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
132f0 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  gslot = 0;.     
13300 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
13310 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20  noslot = 0;.    
13320 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
13330 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20  ineMacro = 1;.  
13340 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13350 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
13360 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20  ECL_ARG;.       
13370 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
13380 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ame")==0 ){.    
13390 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
133a0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
133b0 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  gp->name);.     
133c0 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
133d0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
133e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
133f0 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75   strcmp(x,"inclu
13400 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  de")==0 ){.     
13410 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13420 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
13430 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20  p->include);.   
13440 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13450 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d  trcmp(x,"code")=
13460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13470 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13480 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78   = &(psp->gp->ex
13490 74 72 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  tracode);.      
134a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
134b0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74  mp(x,"token_dest
134c0 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
134d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
134e0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
134f0 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  ->gp->tokendest;
13500 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13510 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
13520 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22  ault_destructor"
13530 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13540 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13550 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76  ot = &psp->gp->v
13560 61 72 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  ardest;.        
13570 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13580 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78  (x,"token_prefix
13590 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
135a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
135b0 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
135c0 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
135d0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
135e0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
135f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13600 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e  f( strcmp(x,"syn
13610 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29  tax_error")==0 )
13620 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13630 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
13640 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29  (psp->gp->error)
13650 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13660 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
13670 72 73 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20  rse_accept")==0 
13680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13690 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
136a0 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70  &(psp->gp->accep
136b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
136c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
136d0 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d  parse_failure")=
136e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
136f0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13700 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61   = &(psp->gp->fa
13710 69 6c 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20  ilure);.        
13720 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13730 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
13740 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
13750 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13760 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
13770 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
13780 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13790 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
137a0 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
137b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
137c0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
137d0 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
137e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
137f0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
13800 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
13810 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65   if( strcmp(x,"e
13820 78 74 72 61 5f 63 6f 6e 74 65 78 74 22 29 3d 3d  xtra_context")==
13830 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13840 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13850 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 63 74 78  = &(psp->gp->ctx
13860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13870 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13880 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13890 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
138a0 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d  x,"token_type")=
138b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
138c0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
138d0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f   = &(psp->gp->to
138e0 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20  kentype);.      
138f0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
13900 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
13910 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13920 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c  strcmp(x,"defaul
13930 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  t_type")==0 ){. 
13940 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
13950 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
13960 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b  p->gp->vartype);
13970 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13980 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13990 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
139a0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
139b0 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30  "stack_size")==0
139c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
139d0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
139e0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63   &(psp->gp->stac
139f0 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  ksize);.        
13a00 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
13a10 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
13a20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13a30 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79  rcmp(x,"start_sy
13a40 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mbol")==0 ){.   
13a50 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13a60 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
13a70 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  >gp->start);.   
13a80 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
13a90 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
13aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13ab0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66  f( strcmp(x,"lef
13ac0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
13ad0 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
13ae0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
13af0 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
13b00 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20   = LEFT;.       
13b10 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13b20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
13b30 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
13b40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13b50 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74   strcmp(x,"right
13b60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
13b70 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
13b80 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
13b90 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
13ba0 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20  = RIGHT;.       
13bb0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13bc0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
13bd0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
13be0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13bf0 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73   strcmp(x,"nonas
13c00 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  soc")==0 ){.    
13c10 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
13c20 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
13c30 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
13c40 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20  oc = NONE;.     
13c50 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13c60 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
13c70 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
13c80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13c90 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73  f( strcmp(x,"des
13ca0 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
13cb0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
13cc0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13cd0 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
13ce0 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
13cf0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13d00 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"type")==0 ){. 
13d10 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13d20 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13d30 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
13d40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13d50 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66   if( strcmp(x,"f
13d60 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a  allback")==0 ){.
13d70 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
13d80 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
13d90 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13da0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13db0 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20  FALLBACK_ID;.   
13dc0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13dd0 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 22 29  trcmp(x,"token")
13de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13df0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13e00 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f  ITING_FOR_TOKEN_
13e10 4e 41 4d 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  NAME;.        }e
13e20 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13e30 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30 20  ,"wildcard")==0 
13e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13e50 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13e60 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
13e70 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
13e80 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
13e90 6f 6b 65 6e 5f 63 6c 61 73 73 22 29 3d 3d 30 20  oken_class")==0 
13ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13eb0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13ec0 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 3b 0a  G_FOR_CLASS_ID;.
13ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13ee0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
13ef0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13f00 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55  ,.            "U
13f20 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69  nknown declarati
13f30 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25  on keyword: \"%%
13f40 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
13f50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13f60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
13f70 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
13f80 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
13f90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
13fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13fb0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13fc0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
13fd0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
13fe0 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c          "Illegal
13ff0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
14000 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78  word: \"%s\".",x
14010 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
14020 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14030 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14040 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
14050 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14060 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14070 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
14080 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
14090 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
140a0 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
140b0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
140c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
140d0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
140e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
140f0 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
14100 6e 67 20 61 66 74 65 72 20 25 25 64 65 73 74 72  ng after %%destr
14110 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
14120 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
14130 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14140 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
14150 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
14160 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
14170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
14180 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
14190 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
141a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
141b0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
141c0 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
141d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
141e0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
141f0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
14200 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
14210 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
14220 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14230 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
14240 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
14250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14260 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
14270 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
14280 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49 53  L:.      if( !IS
14290 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20  ALPHA(x[0]) ){. 
142a0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
142b0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
142c0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
142d0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
142e0 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
142f0 66 74 65 72 20 25 25 74 79 70 65 20 6b 65 79 77  fter %%type keyw
14300 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
14310 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14320 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14330 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14340 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14360 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
14370 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69   *sp = Symbol_fi
14380 6e 64 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  nd(x);.        i
14390 66 28 28 73 70 29 20 26 26 20 28 73 70 2d 3e 64  f((sp) && (sp->d
143a0 61 74 61 74 79 70 65 29 29 7b 0a 20 20 20 20 20  atatype)){.     
143b0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
143c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
143d0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
143e0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
143f0 6c 20 25 25 74 79 70 65 20 5c 22 25 73 5c 22 20  l %%type \"%s\" 
14400 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64 22  already defined"
14410 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
14420 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14430 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14440 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
14450 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
14460 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14470 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
14480 70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p){.            
14490 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
144a0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  x);.          }.
144b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
144c0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70  eclargslot = &sp
144d0 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
144e0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
144f0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
14500 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
14510 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
14520 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
14530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14550 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
14560 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
14570 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OL:.      if( x[
14580 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
14590 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
145a0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
145b0 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
145c0 7d 65 6c 73 65 20 69 66 28 20 49 53 55 50 50 45  }else if( ISUPPE
145d0 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  R(x[0]) ){.     
145e0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
145f0 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70   *sp;.        sp
14600 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
14610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  ;.        if( sp
14620 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
14630 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
14640 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
14650 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
14660 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d              "Sym
14670 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61  bol \"%s\" has a
14680 6c 72 65 61 64 79 20 62 65 20 67 69 76 65 6e 20  lready be given 
14690 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78  a precedence.",x
146a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
146b0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
146c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
146d0 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20         sp->prec 
146e0 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74  = psp->preccount
146f0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70  er;.          sp
14700 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64  ->assoc = psp->d
14710 65 63 6c 61 73 73 6f 63 3b 0a 20 20 20 20 20 20  eclassoc;.      
14720 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
14730 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
14740 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14750 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14760 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61 6e  ,.          "Can
14770 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65 63  't assign a prec
14780 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22  edence to \"%s\"
14790 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
147a0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
147b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
147c0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
147d0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
147e0 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  RG:.      if( x[
147f0 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='{' || x[0]=
14800 3d 27 5c 22 27 20 7c 7c 20 49 53 41 4c 4e 55 4d  ='\"' || ISALNUM
14810 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
14820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
14830 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20  ld, *zNew;.     
14840 20 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 2a     char *zBuf, *
14850 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  z;.        int n
14860 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 20 3d 20  Old, n, nLine = 
14870 30 2c 20 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a  0, nNew, nBack;.
14880 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 4c          int addL
14890 69 6e 65 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20  ineMacro;.      
148a0 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d    char zLine[50]
148b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d  ;.        zNew =
148c0 20 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   x;.        if( 
148d0 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20  zNew[0]=='"' || 
148e0 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a  zNew[0]=='{' ) z
148f0 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  New++;.        n
14900 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  New = lemonStrle
14910 6e 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  n(zNew);.       
14920 20 69 66 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61   if( *psp->decla
14930 72 67 73 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20  rgslot ){.      
14940 20 20 20 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d      zOld = *psp-
14950 3e 64 65 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20  >declargslot;.  
14960 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14970 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22         zOld = ""
14980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14990 20 20 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e      nOld = lemon
149a0 53 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20  Strlen(zOld);.  
149b0 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b        n = nOld +
149c0 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20 20 20   nNew + 20;.    
149d0 20 20 20 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f      addLineMacro
149e0 20 3d 20 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c   = !psp->gp->nol
149f0 69 6e 65 6e 6f 73 66 6c 61 67 20 26 26 20 70 73  inenosflag && ps
14a00 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
14a10 72 6f 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ro &&.          
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
14a30 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
14a40 6f 74 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65  ot==0 || psp->de
14a50 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21  cllinenoslot[0]!
14a60 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
14a70 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
14a80 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a  .          for(z
14a90 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  =psp->filename, 
14aa0 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b  nBack=0; *z; z++
14ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14ac0 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42  f( *z=='\\' ) nB
14ad0 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ack++;.         
14ae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6d   }.          lem
14af0 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65  on_sprintf(zLine
14b00 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
14b10 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
14b20 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
14b30 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
14b40 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
14b50 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
14b60 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
14b70 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
14b80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14b90 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
14ba0 72 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a  rgslot = (char *
14bb0 29 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e  ) realloc(*psp->
14bc0 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b  declargslot, n);
14bd0 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20  .        zBuf = 
14be0 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
14bf0 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20  t + nOld;.      
14c00 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63    if( addLineMac
14c10 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
14c20 69 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66  if( nOld && zBuf
14c30 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
14c40 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
14c50 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  ++) = '\n';.    
14c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14c70 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
14c80 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
14c90 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20          zBuf += 
14ca0 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  nLine;.         
14cb0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27   *(zBuf++) = '"'
14cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
14cd0 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b  z=psp->filename;
14ce0 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
14cf0 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27         if( *z=='
14d00 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
14d10 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14d20 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20   '\\';.         
14d30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14d40 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b   *(zBuf++) = *z;
14d50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14d60 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
14d70 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20   = '"';.        
14d80 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c    *(zBuf++) = '\
14d90 6e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n';.        }.  
14da0 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64        if( psp->d
14db0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26  ecllinenoslot &&
14dc0 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
14dd0 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  slot[0]==0 ){.  
14de0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
14df0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d  llinenoslot[0] =
14e00 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
14e10 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
14e20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
14e30 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  , zNew, nNew);. 
14e40 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
14e50 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42  New;.        *zB
14e60 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  uf = 0;.        
14e70 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
14e80 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
14e90 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
14ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
14eb0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
14ec0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
14ed0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
14ee0 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74  Illegal argument
14ef0 20 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73   to %%%s: %s",ps
14f00 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78  p->declkeyword,x
14f10 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
14f20 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14f30 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14f40 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
14f50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14f60 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14f70 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
14f80 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a  FOR_FALLBACK_ID:
14f90 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
14fa0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
14fb0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
14fc0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
14fd0 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
14fe0 73 65 20 69 66 28 20 21 49 53 55 50 50 45 52 28  se if( !ISUPPER(
14ff0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
15000 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
15010 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
15020 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
15030 20 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b       "%%fallback
15040 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
15050 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
15060 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
15070 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
15080 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15090 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
150a0 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
150b0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
150c0 20 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62    if( psp->fallb
150d0 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
150e0 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
150f0 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  k = sp;.        
15100 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61  }else if( sp->fa
15110 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
15120 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
15130 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
15140 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
15150 20 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20            "More 
15160 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63  than one fallbac
15170 6b 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f  k assigned to to
15180 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  ken %s", x);.   
15190 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
151a0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
151b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
151c0 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
151d0 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20  psp->fallback;. 
151e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70           psp->gp
151f0 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d  ->has_fallback =
15200 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
15210 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15220 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
15230 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e 41  ING_FOR_TOKEN_NA
15240 4d 45 3a 0a 20 20 20 20 20 20 2f 2a 20 54 6f 6b  ME:.      /* Tok
15250 65 6e 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ens do not have 
15260 74 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20 62  to be declared b
15270 65 66 6f 72 65 20 75 73 65 2e 20 20 42 75 74 20  efore use.  But 
15280 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20  they can be.    
15290 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f    ** in order to
152a0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 69 72 20 61   control their a
152b0 73 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  ssigned integer 
152c0 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6e 75 6d  number.  The num
152d0 62 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ber for.      **
152e0 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 73 20 61   each token is a
152f0 73 73 69 67 6e 65 64 20 77 68 65 6e 20 69 74 20  ssigned when it 
15300 69 73 20 66 69 72 73 74 20 73 65 65 6e 2e 20 20  is first seen.  
15310 53 6f 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 0a  So by including.
15320 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15330 2a 20 20 20 20 20 25 74 6f 6b 65 6e 20 4f 4e 45  *     %token ONE
15340 20 54 57 4f 20 54 48 52 45 45 0a 20 20 20 20 20   TWO THREE.     
15350 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 65 61 72   **.      ** ear
15360 6c 79 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  ly in the gramma
15370 72 20 66 69 6c 65 2c 20 74 68 61 74 20 61 73 73  r file, that ass
15380 69 67 6e 73 20 73 6d 61 6c 6c 20 63 6f 6e 73 65  igns small conse
15390 63 75 74 69 76 65 20 76 61 6c 75 65 73 0a 20 20  cutive values.  
153a0 20 20 20 20 2a 2a 20 74 6f 20 65 61 63 68 20 6f      ** to each o
153b0 66 20 74 68 65 20 74 6f 6b 65 6e 73 20 4f 4e 45  f the tokens ONE
153c0 20 54 57 4f 20 61 6e 64 20 54 48 52 45 45 2e 0a   TWO and THREE..
153d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
153e0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
153f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
15400 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
15410 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
15420 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
15430 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b  ISUPPER(x[0]) ){
15440 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15450 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
15460 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
15470 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
15480 74 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 5c  token argument \
15490 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20  "%s\" should be 
154a0 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20  a token", x);.  
154b0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
154c0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
154d0 73 65 7b 0a 20 20 20 20 20 20 20 20 28 76 6f 69  se{.        (voi
154e0 64 29 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  d)Symbol_new(x);
154f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15500 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
15510 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
15520 41 52 44 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ARD_ID:.      if
15530 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
15540 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15550 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
15560 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
15570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 49      }else if( !I
15580 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SUPPER(x[0]) ){.
15590 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
155a0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
155b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
155c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 77  ,.          "%%w
155d0 69 6c 64 63 61 72 64 20 61 72 67 75 6d 65 6e 74  ildcard argument
155e0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
155f0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
15600 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
15610 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
15620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
15630 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
15640 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
15650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
15660 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 3d 3d  ->gp->wildcard==
15670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
15680 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64  sp->gp->wildcard
15690 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d   = sp;.        }
156a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
156b0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
156c0 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
156d0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
156e0 20 20 20 20 20 20 22 45 78 74 72 61 20 77 69 6c        "Extra wil
156f0 64 63 61 72 64 20 74 6f 20 74 6f 6b 65 6e 3a 20  dcard to token: 
15700 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  %s", x);.       
15710 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
15720 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
15730 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15740 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
15750 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44  ING_FOR_CLASS_ID
15760 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 4c  :.      if( !ISL
15770 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20  OWER(x[0]) ){.  
15780 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
15790 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73  sp->filename, ps
157a0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
157b0 20 20 20 20 20 20 20 20 20 20 22 25 25 74 6f 6b            "%%tok
157c0 65 6e 5f 63 6c 61 73 73 20 6d 75 73 74 20 62 65  en_class must be
157d0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
157e0 69 64 65 6e 74 69 66 69 65 72 3a 20 25 73 22 2c  identifier: %s",
157f0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70   x);.        psp
15800 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
15810 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
15820 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
15830 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
15840 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d 62 6f   }else if( Symbo
15850 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20 20 20  l_find(x) ){.   
15860 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
15870 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
15880 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
15890 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
158a0 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
158b0 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20  used", x);.     
158c0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
158d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
158e0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
158f0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
15900 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15910 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c         psp->tkcl
15920 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  ass = Symbol_new
15930 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  (x);.        psp
15940 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70 65 20  ->tkclass->type 
15950 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b  = MULTITERMINAL;
15960 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
15970 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
15980 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b 0a 20  R_CLASS_TOKEN;. 
15990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
159a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
159b0 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54  TING_FOR_CLASS_T
159c0 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  OKEN:.      if( 
159d0 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
159e0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
159f0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
15a00 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
15a10 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 55 50    }else if( ISUP
15a20 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28 28 78  PER(x[0]) || ((x
15a30 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d  [0]=='|' || x[0]
15a40 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50 50 45  =='/') && ISUPPE
15a50 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20  R(x[1])) ){.    
15a60 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
15a70 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 74 6b  l *msp = psp->tk
15a80 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20 20 6d  class;.        m
15a90 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20  sp->nsubsym++;. 
15aa0 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73         msp->subs
15ab0 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ym = (struct sym
15ac0 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28  bol **) realloc(
15ad0 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20 20 20  msp->subsym,.   
15ae0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74         sizeof(st
15af0 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73  ruct symbol*)*ms
15b00 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20  p->nsubsym);.   
15b10 20 20 20 20 20 69 66 28 20 21 49 53 55 50 50 45       if( !ISUPPE
15b20 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b 0a 20  R(x[0]) ) x++;. 
15b30 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73         msp->subs
15b40 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d  ym[msp->nsubsym-
15b50 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  1] = Symbol_new(
15b60 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  x);.      }else{
15b70 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15b80 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
15b90 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
15ba0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
15bb0 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72 67 75  token_class argu
15bc0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
15bd0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
15be0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15bf0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15c00 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
15c10 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
15c20 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
15c30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15c40 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f      case RESYNC_
15c50 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
15c60 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b  :./*      if( x[
15c70 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
15c80 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15c90 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
15ca0 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .**      break; 
15cb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  */.    case RESY
15cc0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
15cd0 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ROR:.      if( x
15ce0 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e  [0]=='.' ) psp->
15cf0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
15d00 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
15d10 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  ;.      if( x[0]
15d20 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61  =='%' ) psp->sta
15d30 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
15d40 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
15d50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
15d60 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72  }../* Run the pr
15d70 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20  eprocessor over 
15d80 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74  the input file t
15d90 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c  ext.  The global
15da0 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a   variables.** az
15db0 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67  Define[0] throug
15dc0 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69  h azDefine[nDefi
15dd0 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74  ne-1] contains t
15de0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
15df0 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f  defined.** macro
15e00 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
15e10 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64   looks for "%ifd
15e20 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66  ef" and "%ifndef
15e30 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61  " and "%endif" a
15e40 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74  nd.** comments t
15e50 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69  hem out.  Text i
15e60 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73  n between is als
15e70 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20  o commented out 
15e80 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
15e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
15ea0 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  reprocess_input(
15eb0 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
15ec0 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e  i, j, k, n;.  in
15ed0 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  t exclude = 0;. 
15ee0 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
15ef0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31    int lineno = 1
15f00 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69  ;.  int start_li
15f10 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
15f20 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
15f30 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
15f40 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
15f50 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25      if( z[i]!='%
15f60 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69  ' || (i>0 && z[i
15f70 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e  -1]!='\n') ) con
15f80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
15f90 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65  trncmp(&z[i],"%e
15fa0 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 49  ndif",6)==0 && I
15fb0 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29 20 29  SSPACE(z[i+6]) )
15fc0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
15fd0 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
15fe0 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20  xclude--;.      
15ff0 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30    if( exclude==0
16000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
16010 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20  r(j=start; j<i; 
16020 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27  j++) if( z[j]!='
16030 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27  \n' ) z[j] = ' '
16040 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16050 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
16060 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21  i; z[j] && z[j]!
16070 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d  ='\n'; j++) z[j]
16080 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73   = ' ';.    }els
16090 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26  e if( (strncmp(&
160a0 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29  z[i],"%ifdef",6)
160b0 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a  ==0 && ISSPACE(z
160c0 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20  [i+6])).        
160d0 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a    || (strncmp(&z
160e0 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29  [i],"%ifndef",7)
160f0 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a  ==0 && ISSPACE(z
16100 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20  [i+7])) ){.     
16110 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
16120 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b          exclude+
16130 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
16140 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
16150 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a 5d 29  7; ISSPACE(z[j])
16160 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; j++){}.       
16170 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d   for(n=0; z[j+n]
16180 20 26 26 20 21 49 53 53 50 41 43 45 28 7a 5b 6a   && !ISSPACE(z[j
16190 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20  +n]); n++){}.   
161a0 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31       exclude = 1
161b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
161c0 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b  0; k<nDefine; k+
161d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
161e0 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69  ( strncmp(azDefi
161f0 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d  ne[k],&z[j],n)==
16200 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0 && lemonStrlen
16210 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e  (azDefine[k])==n
16220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16230 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20  exclude = 0;.   
16240 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16260 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16270 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20  ( z[i+3]=='n' ) 
16280 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75  exclude = !exclu
16290 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
162a0 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
162b0 20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a       start = i;.
162c0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f            start_
162d0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
162e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
162f0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
16300 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
16310 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
16320 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  = ' ';.    }.  }
16330 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29  .  if( exclude )
16340 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
16350 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74  derr,"unterminat
16360 65 64 20 25 25 69 66 64 65 66 20 73 74 61 72 74  ed %%ifdef start
16370 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e  ing on line %d\n
16380 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29  ", start_lineno)
16390 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
163a0 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74   }.}../* In spit
163b0 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74  e of its name, t
163c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
163d0 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72  really a scanner
163e0 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e  .  It read.** in
163f0 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75   the entire inpu
16400 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f  t file (all at o
16410 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69  nce) then tokeni
16420 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a  zes it.  Each.**
16430 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64   token is passed
16440 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
16450 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22   "parseonetoken"
16460 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c   which builds al
16470 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  l.** the appropr
16480 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  iate data struct
16490 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62  ures in the glob
164a0 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
164b0 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61  "gp"..*/.void Pa
164c0 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  rse(struct lemon
164d0 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74   *gp).{.  struct
164e0 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49   pstate ps;.  FI
164f0 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a  LE *fp;.  char *
16500 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73 69 67  filebuf;.  unsig
16510 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69 7a 65  ned int filesize
16520 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a  ;.  int lineno;.
16530 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20    int c;.  char 
16540 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20  *cp, *nextcp;.  
16550 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20  int startline = 
16560 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 73  0;..  memset(&ps
16570 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66 28 70  , '\0', sizeof(p
16580 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d 20 67  s));.  ps.gp = g
16590 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65  p;.  ps.filename
165a0 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b   = gp->filename;
165b0 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d  .  ps.errorcnt =
165c0 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65 20 3d   0;.  ps.state =
165d0 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20   INITIALIZE;..  
165e0 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65 61 64  /* Begin by read
165f0 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20 66 69  ing the input fi
16600 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70  le */.  fp = fop
16610 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22  en(ps.filename,"
16620 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  rb");.  if( fp==
16630 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
16640 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
16650 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 69 73  "Can't open this
16660 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
16670 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  g.");.    gp->er
16680 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
16690 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65  turn;.  }.  fsee
166a0 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c  k(fp,0,2);.  fil
166b0 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70  esize = ftell(fp
166c0 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70 29 3b  );.  rewind(fp);
166d0 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28 63 68  .  filebuf = (ch
166e0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c  ar *)malloc( fil
166f0 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28  esize+1 );.  if(
16700 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30 30 30   filesize>100000
16710 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66 3d 3d  000 || filebuf==
16720 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
16730 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
16740 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f 6f 20  "Input file too 
16750 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20 66 72  large.");.    fr
16760 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20  ee(filebuf);.   
16770 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
16780 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b  .    fclose(fp);
16790 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
167a0 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c  .  if( fread(fil
167b0 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c  ebuf,1,filesize,
167c0 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b  fp)!=filesize ){
167d0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
167e0 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
167f0 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25  't read in all %
16800 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  d bytes of this 
16810 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69  file.",.      fi
16820 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65  lesize);.    fre
16830 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20  e(filebuf);.    
16840 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
16850 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
16860 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16870 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
16880 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65  filebuf[filesize
16890 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ] = 0;..  /* Mak
168a0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73  e an initial pas
168b0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  s through the fi
168c0 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66  le to handle %if
168d0 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20  def and %ifndef 
168e0 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f  */.  preprocess_
168f0 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a  input(filebuf);.
16900 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74  .  /* Now scan t
16910 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69  he text of the i
16920 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c  nput file */.  l
16930 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72  ineno = 1;.  for
16940 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d  (cp=filebuf; (c=
16950 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20   *cp)!=0; ){.   
16960 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16970 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20  ineno++;        
16980 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72        /* Keep tr
16990 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
169a0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66  number */.    if
169b0 28 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20  ( ISSPACE(c) ){ 
169c0 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20  cp++; continue; 
169d0 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77  }  /* Skip all w
169e0 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  hite space */.  
169f0 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
16a00 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20  cp[1]=='/' ){   
16a10 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
16a20 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
16a30 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32  s */.      cp+=2
16a40 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
16a50 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
16a60 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
16a70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16a80 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27    }.    if( c=='
16a90 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
16aa0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
16ab0 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d  Skip C style com
16ac0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
16ad0 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
16ae0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
16af0 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b  & (c!='/' || cp[
16b00 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  -1]!='*') ){.   
16b10 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
16b20 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
16b30 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
16b40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
16b50 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
16b60 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
16b70 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d   ps.tokenstart =
16b80 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   cp;            
16b90 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
16ba0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
16bb0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73   token */.    ps
16bc0 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c  .tokenlineno = l
16bd0 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  ineno;          
16be0 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f   /* Linenumber o
16bf0 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65  n which token be
16c00 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  gins */.    if( 
16c10 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20  c=='\"' ){      
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c30 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  * String literal
16c40 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
16c50 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
16c60 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
16c70 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\"' ){.        
16c80 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
16c90 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
16ca0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
16cb0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
16cc0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
16cd0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61  (ps.filename,sta
16ce0 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20  rtline,."String 
16cf0 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
16d00 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
16d10 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
16d20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
16d30 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
16d40 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
16d50 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16d60 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
16d70 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
16d80 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
16d90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
16da0 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '{' ){          
16db0 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20       /* A block 
16dc0 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20  of C code */.   
16dd0 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20     int level;.  
16de0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
16df0 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d  for(level=1; (c=
16e00 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76   *cp)!=0 && (lev
16e10 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b  el>1 || c!='}');
16e20 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
16e30 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
16e40 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
16e50 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20  else if( c=='{' 
16e60 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  ) level++;.     
16e70 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
16e80 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20  }' ) level--;.  
16e90 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
16ea0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
16eb0 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '*' ){  /* Skip 
16ec0 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
16ed0 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b        int prevc;
16ee0 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
16ef0 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
16f00 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
16f10 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
16f20 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
16f30 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27  ='/' || prevc!='
16f40 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  *') ){.         
16f50 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
16f60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
16f70 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
16f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  ;.            cp
16f90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
16fa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
16fb0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
16fc0 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='/' ){  /* Sk
16fd0 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
16fe0 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20  ments too */.   
16ff0 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b         cp = &cp[
17000 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  2];.          wh
17010 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
17020 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
17030 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
17040 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ( c ) lineno++;.
17050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
17060 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  ( c=='\'' || c==
17070 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74  '\"' ){    /* St
17080 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72  ring a character
17090 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
170a0 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74         int start
170b0 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20  char, prevc;.   
170c0 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72         startchar
170d0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
170e0 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20  prevc = 0;.     
170f0 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28       for(cp++; (
17100 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
17110 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70  !=startchar || p
17120 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b  revc=='\\'); cp+
17130 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
17140 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
17150 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
17160 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27      if( prevc=='
17170 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b  \\' ) prevc = 0;
17180 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
17190 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  e              p
171a0 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
171b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
171c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
171d0 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
171e0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
171f0 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c  lename,ps.tokenl
17200 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73  ineno,."C code s
17210 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
17220 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
17230 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
17240 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
17250 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
17260 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
17270 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
17280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17290 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
172a0 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
172b0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c    }else if( ISAL
172c0 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20  NUM(c) ){       
172d0 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72     /* Identifier
172e0 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  s */.      while
172f0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
17300 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20   (ISALNUM(c) || 
17310 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a  c=='_') ) cp++;.
17320 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
17330 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
17340 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d   c==':' && cp[1]
17350 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d  ==':' && cp[2]==
17360 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70  '=' ){ /* The op
17370 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a  erator "::=" */.
17380 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20        cp += 3;. 
17390 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
173a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
173b0 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c  (c=='/' || c=='|
173c0 27 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70  ') && ISALPHA(cp
173d0 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70  [1]) ){.      cp
173e0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69   += 2;.      whi
173f0 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30  le( (c = *cp)!=0
17400 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20   && (ISALNUM(c) 
17410 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
17420 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
17430 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = cp;.    }else{
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
17460 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72   other (one char
17470 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73  acter) operators
17480 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
17490 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
174a0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d  p;.    }.    c =
174b0 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20   *cp;.    *cp = 
174c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
174d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c            /* Nul
174e0 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
174f0 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72  token */.    par
17500 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b  seonetoken(&ps);
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17520 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20  Parse the token 
17530 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68  */.    *cp = (ch
17540 61 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20  ar)c;           
17550 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72         /* Restor
17560 65 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a  e the buffer */.
17570 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b      cp = nextcp;
17580 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65  .  }.  free(file
17590 62 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20  buf);           
175a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65           /* Rele
175b0 61 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61  ase the buffer a
175c0 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a  fter parsing */.
175d0 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e    gp->rule = ps.
175e0 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d  firstrule;.  gp-
175f0 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65  >errorcnt = ps.e
17600 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a  rrorcnt;.}./****
17610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17620 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
17630 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20   file "plink.c" 
17640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17650 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
17660 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67  tines processing
17670 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
17680 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
17690 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69  ation links.** i
176a0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
176b0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
176c0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70  .static struct p
176d0 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65  link *plink_free
176e0 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c  list = 0;../* Al
176f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69  locate a new pli
17700 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69  nk */.struct pli
17710 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f  nk *Plink_new(vo
17720 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  id){.  struct pl
17730 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20  ink *newlink;.. 
17740 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
17750 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
17760 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
17770 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e   = 100;.    plin
17780 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74  k_freelist = (st
17790 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c  ruct plink *)cal
177a0 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
177b0 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29  (struct plink) )
177c0 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f  ;.    if( plink_
177d0 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
177e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
177f0 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62  err,.      "Unab
17800 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
17810 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
17820 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
17830 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29  gation link.\n")
17840 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
17850 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17860 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
17870 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ) plink_freelist
17880 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e  [i].next = &plin
17890 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b  k_freelist[i+1];
178a0 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
178b0 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
178c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69  = 0;.  }.  newli
178d0 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  nk = plink_freel
178e0 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65  ist;.  plink_fre
178f0 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  elist = plink_fr
17900 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
17910 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a  return newlink;.
17920 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e  }../* Add a plin
17930 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73  k to a plink lis
17940 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
17950 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  add(struct plink
17960 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20   **plpp, struct 
17970 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
17980 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
17990 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
179a0 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  k = Plink_new();
179b0 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74  .  newlink->next
179c0 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
179d0 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e  p = newlink;.  n
179e0 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66  ewlink->cfp = cf
179f0 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  p;.}../* Transfe
17a00 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  r every plink on
17a10 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22   the list "from"
17a20 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f   to the list "to
17a30 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  " */.void Plink_
17a40 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e  copy(struct plin
17a50 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70  k **to, struct p
17a60 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20  link *from).{.  
17a70 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
17a80 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
17a90 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
17aa0 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
17ab0 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
17ac0 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
17ad0 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
17ae0 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
17af0 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
17b00 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
17b10 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
17b20 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
17b30 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74  ink *plp).{.  st
17b40 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
17b50 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c  pl;..  while( pl
17b60 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  p ){.    nextpl 
17b70 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = plp->next;.   
17b80 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69   plp->next = pli
17b90 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20  nk_freelist;.   
17ba0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
17bb0 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d  = plp;.    plp =
17bc0 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f   nextpl;.  }.}./
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
17bf0 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22   file "report.c"
17c00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
17c20 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f  ** Procedures fo
17c30 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70  r generating rep
17c40 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20  orts and tables 
17c50 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
17c60 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
17c70 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  /../* Generate a
17c80 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74   filename with t
17c90 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
17ca0 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
17cb0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65  the.** name come
17cc0 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  s from malloc() 
17cd0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
17ce0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
17cf0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
17d00 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66  .PRIVATE char *f
17d10 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72  ile_makename(str
17d20 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
17d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
17d40 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix).{.  char *n
17d50 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
17d60 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
17d70 65 20 3d 20 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  e = lemp->filena
17d80 6d 65 3b 0a 20 20 69 6e 74 20 73 7a 3b 0a 0a 20  me;.  int sz;.. 
17d90 20 69 66 28 20 6f 75 74 70 75 74 44 69 72 20 29   if( outputDir )
17da0 7b 0a 20 20 20 20 63 70 20 3d 20 73 74 72 72 63  {.    cp = strrc
17db0 68 72 28 66 69 6c 65 6e 61 6d 65 2c 20 27 2f 27  hr(filename, '/'
17dc0 29 3b 0a 20 20 20 20 69 66 28 20 63 70 20 29 20  );.    if( cp ) 
17dd0 66 69 6c 65 6e 61 6d 65 20 3d 20 63 70 20 2b 20  filename = cp + 
17de0 31 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 6c 65  1;.  }.  sz = le
17df0 6d 6f 6e 53 74 72 6c 65 6e 28 66 69 6c 65 6e 61  monStrlen(filena
17e00 6d 65 29 3b 0a 20 20 73 7a 20 2b 3d 20 6c 65 6d  me);.  sz += lem
17e10 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29  onStrlen(suffix)
17e20 3b 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69  ;.  if( outputDi
17e30 72 20 29 20 73 7a 20 2b 3d 20 6c 65 6d 6f 6e 53  r ) sz += lemonS
17e40 74 72 6c 65 6e 28 6f 75 74 70 75 74 44 69 72 29  trlen(outputDir)
17e50 20 2b 20 31 3b 0a 20 20 73 7a 20 2b 3d 20 35 3b   + 1;.  sz += 5;
17e60 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  .  name = (char*
17e70 29 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b 0a 20  )malloc( sz );. 
17e80 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a   if( name==0 ){.
17e90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17ea0 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  rr,"Can't alloca
17eb0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66  te space for a f
17ec0 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20  ilename.\n");.  
17ed0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
17ee0 20 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20   name[0] = 0;.  
17ef0 69 66 28 20 6f 75 74 70 75 74 44 69 72 20 29 7b  if( outputDir ){
17f00 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  .    lemon_strcp
17f10 79 28 6e 61 6d 65 2c 20 6f 75 74 70 75 74 44 69  y(name, outputDi
17f20 72 29 3b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74  r);.    lemon_st
17f30 72 63 61 74 28 6e 61 6d 65 2c 20 22 2f 22 29 3b  rcat(name, "/");
17f40 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
17f50 63 61 74 28 6e 61 6d 65 2c 66 69 6c 65 6e 61 6d  cat(name,filenam
17f60 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
17f70 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
17f80 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
17f90 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74  ;.  lemon_strcat
17fa0 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20  (name,suffix);. 
17fb0 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a   return name;.}.
17fc0 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  ./* Open a file 
17fd0 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65  with a name base
17fe0 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  d on the name of
17ff0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c   the input file,
18000 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64  .** but with a d
18010 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66  ifferent (specif
18020 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64  ied) suffix, and
18030 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
18040 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65  r.** to the stre
18050 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  am */.PRIVATE FI
18060 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20  LE *file_open(. 
18070 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
18080 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  emp,.  const cha
18090 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e  r *suffix,.  con
180a0 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b  st char *mode.){
180b0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
180c0 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
180d0 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
180e0 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
180f0 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
18100 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
18110 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
18120 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
18130 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
18140 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
18150 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
18160 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
18170 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
18180 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
18190 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
181a0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
181b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
181c0 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
181d0 20 50 72 69 6e 74 20 74 68 65 20 74 65 78 74 20   Print the text 
181e0 6f 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76 6f 69  of a rule.*/.voi
181f0 64 20 72 75 6c 65 5f 70 72 69 6e 74 28 46 49 4c  d rule_print(FIL
18200 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72  E *out, struct r
18210 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20  ule *rp){.  int 
18220 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28  i, j;.  fprintf(
18230 6f 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e 6c 68  out, "%s",rp->lh
18240 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a 20 20  s->name);.  /*  
18250 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
18260 61 73 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  as ) fprintf(out
18270 2c 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ,"(%s)",rp->lhsa
18280 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70 72 69  lias); */.  fpri
18290 6e 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22 29 3b  ntf(out," ::=");
182a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .  for(i=0; i<rp
182b0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
182c0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
182d0 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
182e0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
182f0 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
18300 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
18310 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
18320 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
18330 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
18340 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; j<sp->nsubsym
18350 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
18360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
18370 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
18380 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
18390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
183a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
183b0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
183c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 28      }.    /* if(
183d0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
183e0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
183f0 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
18400 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d 0a 7d  as[i]); */.  }.}
18410 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
18420 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
18430 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
18440 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
18450 6e 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  ns.** on rules *
18460 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
18470 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
18480 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p).{.  struct ru
18490 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
184a0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69   symbol *sp;.  i
184b0 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c  nt i, j, maxlen,
184c0 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20   len, ncolumns, 
184d0 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22  skip;.  printf("
184e0 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e  // Reprint of in
184f0 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  put file \"%s\".
18500 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22  \n// Symbols:\n"
18510 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
18520 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b  ;.  maxlen = 10;
18530 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
18540 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
18550 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  ){.    sp = lemp
18560 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18570 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
18580 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
18590 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
185a0 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
185b0 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73  ;.  }.  ncolumns
185c0 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29   = 76/(maxlen+5)
185d0 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73  ;.  if( ncolumns
185e0 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20  <1 ) ncolumns = 
185f0 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d  1;.  skip = (lem
18600 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f  p->nsymbol + nco
18610 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75  lumns - 1)/ncolu
18620 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mns;.  for(i=0; 
18630 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<skip; i++){.  
18640 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a    printf("//");.
18650 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c      for(j=i; j<l
18660 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
18670 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70  =skip){.      sp
18680 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
18690 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
186a0 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20  t( sp->index==j 
186b0 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
186c0 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c  " %3d %-*.*s",j,
186d0 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70  maxlen,maxlen,sp
186e0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
186f0 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
18700 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
18710 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
18720 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
18730 72 75 6c 65 5f 70 72 69 6e 74 28 73 74 64 6f 75  rule_print(stdou
18740 74 2c 20 72 70 29 3b 0a 20 20 20 20 70 72 69 6e  t, rp);.    prin
18750 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
18760 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
18770 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
18780 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
18790 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
187a0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
187b0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
187c0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
187d0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
187e0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
187f0 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  le rule..*/.void
18800 20 52 75 6c 65 50 72 69 6e 74 28 46 49 4c 45 20   RulePrint(FILE 
18810 2a 66 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *fp, struct rule
18820 20 2a 72 70 2c 20 69 6e 74 20 69 43 75 72 73 6f   *rp, int iCurso
18830 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  r){.  struct sym
18840 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
18850 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 66  , j;.  fprintf(f
18860 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c  p,"%s ::=",rp->l
18870 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
18880 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68  (i=0; i<=rp->nrh
18890 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
188a0 20 69 3d 3d 69 43 75 72 73 6f 72 20 29 20 66 70   i==iCursor ) fp
188b0 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a  rintf(fp," *");.
188c0 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
188d0 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rhs ) break;.   
188e0 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
188f0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
18900 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
18910 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
18920 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d  tf(fp," %s", sp-
18930 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
18940 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  );.      for(j=1
18950 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
18960 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
18970 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
18980 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
18990 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
189a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
189b0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
189c0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
189d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  }.  }.}../* Prin
189e0 74 20 74 68 65 20 72 75 6c 65 20 66 6f 72 20 61  t the rule for a
189f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
18a00 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72  */.void ConfigPr
18a10 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74  int(FILE *fp, st
18a20 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
18a30 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74 28 66  ){.  RulePrint(f
18a40 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66 70 2d  p, cfp->rp, cfp-
18a50 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64 65  >dot);.}../* #de
18a60 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66  fine TEST */.#if
18a70 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65   0./* Print a se
18a80 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  t */.PRIVATE voi
18a90 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73  d SetPrint(out,s
18aa0 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f  et,lemp).FILE *o
18ab0 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73  ut;.char *set;.s
18ac0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
18ad0 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
18ae0 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20  char *spacer;.  
18af0 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66  spacer = "";.  f
18b00 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73  printf(out,"%12s
18b10 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d  [","");.  for(i=
18b20 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; i<lemp->nterm
18b30 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
18b40 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c  if( SetFind(set,
18b50 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i) ){.      fpri
18b60 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73  ntf(out,"%s%s",s
18b70 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62  pacer,lemp->symb
18b80 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
18b90 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20       spacer = " 
18ba0 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  ";.    }.  }.  f
18bb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22  printf(out,"]\n"
18bc0 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
18bd0 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a   plink chain */.
18be0 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69  PRIVATE void Pli
18bf0 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c  nkPrint(out,plp,
18c00 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  tag).FILE *out;.
18c10 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
18c20 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a  p;.char *tag;.{.
18c30 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a    while( plp ){.
18c40 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18c50 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25  "%12s%s (state %
18c60 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70  2d) ","",tag,plp
18c70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74  ->cfp->stp->stat
18c80 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69  enum);.    Confi
18c90 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e  gPrint(out,plp->
18ca0 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  cfp);.    fprint
18cb0 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  f(out,"\n");.   
18cc0 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74   plp = plp->next
18cd0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
18ce0 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69  /* Print an acti
18cf0 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  on to the given 
18d00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
18d10 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
18d20 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73  f.** nothing was
18d30 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65   actually printe
18d40 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41  d..*/.int PrintA
18d50 63 74 69 6f 6e 28 0a 20 20 73 74 72 75 63 74 20  ction(.  struct 
18d60 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20 20  action *ap,     
18d70 20 20 20 20 20 2f 2a 20 54 68 65 20 61 63 74 69       /* The acti
18d80 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20  on to print */. 
18d90 20 46 49 4c 45 20 2a 66 70 2c 20 20 20 20 20 20   FILE *fp,      
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18db0 50 72 69 6e 74 20 74 68 65 20 61 63 74 69 6f 6e  Print the action
18dc0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
18dd0 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20  ndent           
18de0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e 74         /* Indent
18df0 20 62 79 20 74 68 69 73 20 61 6d 6f 75 6e 74 20   by this amount 
18e00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 75  */.){.  int resu
18e10 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68  lt = 1;.  switch
18e20 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20  ( ap->type ){.  
18e30 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 7b 0a    case SHIFT: {.
18e40 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
18e50 74 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78 2e  te *stp = ap->x.
18e60 73 74 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  stp;.      fprin
18e70 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
18e80 20 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e          %-7d",in
18e90 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
18ea0 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  e,stp->statenum)
18eb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18ec0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45     }.    case RE
18ed0 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 74  DUCE: {.      st
18ee0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d 20  ruct rule *rp = 
18ef0 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  ap->x.rp;.      
18f00 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
18f10 72 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37  reduce       %-7
18f20 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
18f30 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65  ->name,rp->iRule
18f40 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72 69  );.      RulePri
18f50 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a  nt(fp, rp, -1);.
18f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18f70 20 7d 0a 20 20 20 20 63 61 73 65 20 53 48 49 46   }.    case SHIF
18f80 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20  TREDUCE: {.     
18f90 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
18fa0 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
18fb0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18fc0 2a 73 20 73 68 69 66 74 2d 72 65 64 75 63 65 20  *s shift-reduce 
18fd0 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  %-7d",indent,ap-
18fe0 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52  >sp->name,rp->iR
18ff0 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65  ule);.      Rule
19000 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31  Print(fp, rp, -1
19010 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19020 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 41      }.    case A
19030 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
19040 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
19050 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
19060 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
19070 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19080 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
19090 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
190a0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
190b0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
190c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
190d0 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
190e0 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
190f0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
19100 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20  fp,"%*s reduce  
19110 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72       %-7d ** Par
19120 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
19130 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  ",.        inden
19140 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
19150 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b  p->x.rp->iRule);
19160 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19170 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43    case SSCONFLIC
19180 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
19190 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20  (fp,"%*s shift  
191a0 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61        %-7d ** Pa
191b0 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a  rsing conflict *
191c0 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65  *",.        inde
191d0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
191e0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
191f0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
19200 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
19210 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69  ESOLVED:.      i
19220 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  f( showPrecedenc
19230 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20  eConflict ){.   
19240 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
19250 22 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20  "%*s shift      
19260 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65    %-7d -- droppe
19270 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
19280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19290 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
192a0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d  >name,ap->x.stp-
192b0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
192c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
192d0 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
192e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
192f0 3b 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45  ;.    case RD_RE
19300 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66  SOLVED:.      if
19310 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  ( showPrecedence
19320 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  Conflict ){.    
19330 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
19340 25 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64 20  %*s reduce %-7d 
19350 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72  -- dropped by pr
19360 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20  ecedence",.     
19370 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e             inden
19380 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
19390 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b  p->x.rp->iRule);
193a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
193b0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
193c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
193d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
193e0 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20  NOT_USED:.      
193f0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
19400 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
19410 66 28 20 72 65 73 75 6c 74 20 26 26 20 61 70 2d  f( result && ap-
19420 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66 70  >spOpt ){.    fp
19430 72 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20 62  rintf(fp,"  /* b
19440 65 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a 2f  ecause %s==%s */
19450 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  ", ap->sp->name,
19460 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d 65   ap->spOpt->name
19470 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19480 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65  result;.}../* Ge
19490 6e 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75  nerate the "*.ou
194a0 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
194b0 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
194c0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
194d0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  emp).{.  int i, 
194e0 6e 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  n;.  struct stat
194f0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
19500 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
19510 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
19520 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
19530 20 2a 72 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *rp;.  FILE *fp
19540 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
19550 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
19560 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "wb");.  if( fp=
19570 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
19580 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
19590 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  nxstate; i++){. 
195a0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
195b0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70  orted[i];.    fp
195c0 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20  rintf(fp,"State 
195d0 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74  %d:\n",stp->stat
195e0 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c  enum);.    if( l
195f0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
19600 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
19610 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
19620 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
19630 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
19640 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
19650 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
19660 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
19670 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
19680 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  .        lemon_s
19690 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64 29  printf(buf,"(%d)
196a0 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75 6c 65  ",cfp->rp->iRule
196b0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
196c0 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20 22  tf(fp,"    %5s "
196d0 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ,buf);.      }el
196e0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
196f0 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20 20  ntf(fp,"        
19700 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
19710 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28      ConfigPrint(
19720 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 66  fp,cfp);.      f
19730 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
19740 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53 65 74  .#if 0.      Set
19750 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77  Print(fp,cfp->fw
19760 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50  s,lemp);.      P
19770 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
19780 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a  ->fplp,"To  ");.
19790 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
197a0 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46  (fp,cfp->bplp,"F
197b0 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rom");.#endif.  
197c0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
197d0 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66  sisflag ) cfp=cf
197e0 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73  p->bp;.      els
197f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
19800 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74     cfp=cfp->next
19810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
19820 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
19830 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
19840 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
19850 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72  t){.      if( Pr
19860 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c  intAction(ap,fp,
19870 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70  30) ) fprintf(fp
19880 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ,"\n");.    }.  
19890 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
198a0 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ");.  }.  fprint
198b0 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d  f(fp, "---------
198c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
198d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
198e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
198f0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
19900 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20  Symbols:\n");.  
19910 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54 68 65  fprintf(fp, "The
19920 20 66 69 72 73 74 2d 73 65 74 20 6f 66 20 6e 6f   first-set of no
19930 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 69 73 20 73  n-terminals is s
19940 68 6f 77 6e 20 61 66 74 65 72 20 74 68 65 20 6e  hown after the n
19950 61 6d 65 2e 5c 6e 5c 6e 22 29 3b 0a 20 20 66 6f  ame.\n\n");.  fo
19960 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
19970 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
19980 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72    int j;.    str
19990 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
199a0 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
199b0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
199c0 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25  fprintf(fp, "  %
199d0 33 64 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e  3d: %s", i, sp->
199e0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  name);.    if( s
199f0 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d  p->type==NONTERM
19a00 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70  INAL ){.      fp
19a10 72 69 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a  rintf(fp, ":");.
19a20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61        if( sp->la
19a30 6d 62 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20  mbda ){.        
19a40 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c  fprintf(fp, " <l
19a50 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20  ambda>");.      
19a60 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
19a70 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   j<lemp->ntermin
19a80 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  al; j++){.      
19a90 20 20 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73    if( sp->firsts
19aa0 65 74 20 26 26 20 53 65 74 46 69 6e 64 28 73 70  et && SetFind(sp
19ab0 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29  ->firstset, j) )
19ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
19ad0 6e 74 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c  ntf(fp, " %s", l
19ae0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d  emp->symbols[j]-
19af0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
19b00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
19b10 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63      if( sp->prec
19b20 3e 3d 30 20 29 20 66 70 72 69 6e 74 66 28 66 70  >=0 ) fprintf(fp
19b30 2c 22 20 28 70 72 65 63 65 64 65 6e 63 65 3d 25  ," (precedence=%
19b40 64 29 22 2c 20 73 70 2d 3e 70 72 65 63 29 3b 0a  d)", sp->prec);.
19b50 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20      fprintf(fp, 
19b60 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72  "\n");.  }.  fpr
19b70 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
19b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
19bb0 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
19bc0 2c 20 22 53 79 6e 74 61 78 2d 6f 6e 6c 79 20 53  , "Syntax-only S
19bd0 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66  ymbols:\n");.  f
19be0 70 72 69 6e 74 66 28 66 70 2c 20 22 54 68 65 20  printf(fp, "The 
19bf0 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 6d 62 6f 6c  following symbol
19c00 73 20 6e 65 76 65 72 20 63 61 72 72 79 20 73 65  s never carry se
19c10 6d 61 6e 74 69 63 20 63 6f 6e 74 65 6e 74 2e 5c  mantic content.\
19c20 6e 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  n\n");.  for(i=n
19c30 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
19c40 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
19c50 6e 74 20 77 3b 0a 20 20 20 20 73 74 72 75 63 74  nt w;.    struct
19c60 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
19c70 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
19c80 20 20 20 20 69 66 28 20 73 70 2d 3e 62 43 6f 6e      if( sp->bCon
19c90 74 65 6e 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tent ) continue;
19ca0 0a 20 20 20 20 77 20 3d 20 28 69 6e 74 29 73 74  .    w = (int)st
19cb0 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a  rlen(sp->name);.
19cc0 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
19cd0 2b 77 3e 37 35 20 29 7b 0a 20 20 20 20 20 20 66  +w>75 ){.      f
19ce0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
19cf0 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
19d00 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20    }.    if( n>0 
19d10 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
19d20 28 66 70 2c 20 22 20 22 29 3b 0a 20 20 20 20 20  (fp, " ");.     
19d30 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
19d40 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22  fprintf(fp, "%s"
19d50 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
19d60 20 6e 20 2b 3d 20 77 3b 0a 20 20 7d 0a 20 20 69   n += w;.  }.  i
19d70 66 28 20 6e 3e 30 20 29 20 66 70 72 69 6e 74 66  f( n>0 ) fprintf
19d80 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 66 70  (fp, "\n");.  fp
19d90 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d  rintf(fp, "-----
19da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
19dd0 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66  n");.  fprintf(f
19de0 70 2c 20 22 52 75 6c 65 73 3a 5c 6e 22 29 3b 0a  p, "Rules:\n");.
19df0 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
19e00 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
19e10 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
19e20 74 66 28 66 70 2c 20 22 25 34 64 3a 20 22 2c 20  tf(fp, "%4d: ", 
19e30 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
19e40 72 75 6c 65 5f 70 72 69 6e 74 28 66 70 2c 20 72  rule_print(fp, r
19e50 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
19e60 66 70 2c 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  fp,".");.    if(
19e70 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 7b 0a   rp->precsym ){.
19e80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
19e90 2c 22 20 5b 25 73 20 70 72 65 63 65 64 65 6e 63  ," [%s precedenc
19ea0 65 3d 25 64 5d 22 2c 0a 20 20 20 20 20 20 20 20  e=%d]",.        
19eb0 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
19ec0 6d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 70 72 65  m->name, rp->pre
19ed0 63 73 79 6d 2d 3e 70 72 65 63 29 3b 0a 20 20 20  csym->prec);.   
19ee0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
19ef0 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  p,"\n");.  }.  f
19f00 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65 74  close(fp);.  ret
19f10 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63  urn;.}../* Searc
19f20 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 22  h for the file "
19f30 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20 69  name" which is i
19f40 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
19f50 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 65  tory as.** the e
19f60 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49  xacutable */.PRI
19f70 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68 73  VATE char *paths
19f80 65 61 72 63 68 28 63 68 61 72 20 2a 61 72 67 76  earch(char *argv
19f90 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69  0, char *name, i
19fa0 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20  nt modemask).{. 
19fb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
19fc0 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70  hlist;.  char *p
19fd0 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63 68 61  athbufptr;.  cha
19fe0 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20 63 68  r *pathbuf;.  ch
19ff0 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20  ar *path,*cp;.  
1a000 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66 20  char c;..#ifdef 
1a010 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d  __WIN32__.  cp =
1a020 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27   strrchr(argv0,'
1a030 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70  \\');.#else.  cp
1a040 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30   = strrchr(argv0
1a050 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ,'/');.#endif.  
1a060 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20  if( cp ){.    c 
1a070 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d  = *cp;.    *cp =
1a080 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28   0;.    path = (
1a090 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c  char *)malloc( l
1a0a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 30  emonStrlen(argv0
1a0b0 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  ) + lemonStrlen(
1a0c0 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20 20  name) + 2 );.   
1a0d0 20 69 66 28 20 70 61 74 68 20 29 20 6c 65 6d 6f   if( path ) lemo
1a0e0 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22  n_sprintf(path,"
1a0f0 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d  %s/%s",argv0,nam
1a100 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b  e);.    *cp = c;
1a110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61  .  }else{.    pa
1a120 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28  thlist = getenv(
1a130 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28  "PATH");.    if(
1a140 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70   pathlist==0 ) p
1a150 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69  athlist = ".:/bi
1a160 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20  n:/usr/bin";.   
1a170 20 70 61 74 68 62 75 66 20 3d 20 28 63 68 61 72   pathbuf = (char
1a180 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f   *) malloc( lemo
1a190 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74  nStrlen(pathlist
1a1a0 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61 74  ) + 1 );.    pat
1a1b0 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
1a1c0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
1a1d0 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53  pathlist)+lemonS
1a1e0 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b  trlen(name)+2 );
1a1f0 0a 20 20 20 20 69 66 28 20 28 70 61 74 68 62 75  .    if( (pathbu
1a200 66 20 21 3d 20 30 29 20 26 26 20 28 70 61 74 68  f != 0) && (path
1a210 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  !=0) ){.      pa
1a220 74 68 62 75 66 70 74 72 20 3d 20 70 61 74 68 62  thbufptr = pathb
1a230 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  uf;.      lemon_
1a240 73 74 72 63 70 79 28 70 61 74 68 62 75 66 2c 20  strcpy(pathbuf, 
1a250 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20 20  pathlist);.     
1a260 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75 66   while( *pathbuf
1a270 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d   ){.        cp =
1a280 20 73 74 72 63 68 72 28 70 61 74 68 62 75 66 2c   strchr(pathbuf,
1a290 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ':');.        if
1a2a0 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26  ( cp==0 ) cp = &
1a2b0 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72  pathbuf[lemonStr
1a2c0 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a 20  len(pathbuf)];. 
1a2d0 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a         c = *cp;.
1a2e0 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b          *cp = 0;
1a2f0 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  .        lemon_s
1a300 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
1a310 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d 65  %s",pathbuf,name
1a320 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d  );.        *cp =
1a330 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   c;.        if( 
1a340 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b 30  c==0 ) pathbuf[0
1a350 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  ] = 0;.        e
1a360 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26 63  lse pathbuf = &c
1a370 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  p[1];.        if
1a380 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d 6f  ( access(path,mo
1a390 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72 65  demask)==0 ) bre
1a3a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1a3b0 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70 74    free(pathbufpt
1a3c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1a3d0 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a  return path;.}..
1a3e0 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74 69  /* Given an acti
1a3f0 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  on, compute the 
1a400 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
1a410 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a  r that action.**
1a420 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65 20   which is to be 
1a430 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69 6f  put in the actio
1a440 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 67  n table of the g
1a450 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65  enerated machine
1a460 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  ..** Return nega
1a470 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69 6f  tive if no actio
1a480 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e 65  n should be gene
1a490 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  rated..*/.PRIVAT
1a4a0 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63  E int compute_ac
1a4b0 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f  tion(struct lemo
1a4c0 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20  n *lemp, struct 
1a4d0 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20  action *ap).{.  
1a4e0 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74 63  int act;.  switc
1a4f0 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20  h( ap->type ){. 
1a500 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 20     case SHIFT:  
1a510 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d  act = ap->x.stp-
1a520 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20  >statenum;      
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a550 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20 7b  e SHIFTREDUCE: {
1a560 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20  .      /* Since 
1a570 61 20 53 48 49 46 54 20 69 73 20 69 6e 68 65 72  a SHIFT is inher
1a580 69 65 6e 74 20 61 66 74 65 72 20 61 20 70 72 69  ient after a pri
1a590 6f 72 20 52 45 44 55 43 45 2c 20 63 6f 6e 76 65  or REDUCE, conve
1a5a0 72 74 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  rt any.      ** 
1a5b0 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74 69  SHIFTREDUCE acti
1a5c0 6f 6e 20 77 69 74 68 20 61 20 6e 6f 6e 74 65 72  on with a nonter
1a5d0 6d 69 6e 61 6c 20 6f 6e 20 74 68 65 20 4c 48 53  minal on the LHS
1a5e0 20 69 6e 74 6f 20 61 20 73 69 6d 70 6c 65 0a 20   into a simple. 
1a5f0 20 20 20 20 20 2a 2a 20 52 45 44 55 43 45 20 61       ** REDUCE a
1a600 63 74 69 6f 6e 3a 20 2a 2f 0a 20 20 20 20 20 20  ction: */.      
1a610 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1a620 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  x>=lemp->ntermin
1a630 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 61 63  al ){.        ac
1a640 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  t = lemp->minRed
1a650 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e  uce + ap->x.rp->
1a660 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c  iRule;.      }el
1a670 73 65 7b 0a 20 20 20 20 20 20 20 20 61 63 74 20  se{.        act 
1a680 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74  = lemp->minShift
1a690 52 65 64 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72  Reduce + ap->x.r
1a6a0 70 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20 20 20  p->iRule;.      
1a6b0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1a6c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45     }.    case RE
1a6d0 44 55 43 45 3a 20 61 63 74 20 3d 20 6c 65 6d 70  DUCE: act = lemp
1a6e0 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20 61 70  ->minReduce + ap
1a6f0 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b 20 20  ->x.rp->iRule;  
1a700 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a710 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20     case ERROR:  
1a720 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41  act = lemp->errA
1a730 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a760 65 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20  e ACCEPT: act = 
1a770 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 3b  lemp->accAction;
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a7a0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
1a7b0 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
1a7c0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1a7d0 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
1a7e0 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
1a7f0 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
1a800 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
1a810 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
1a820 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
1a830 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
1a840 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1a850 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
1a860 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
1a870 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
1a880 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
1a890 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
1a8a0 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
1a8b0 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
1a8c0 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
1a8d0 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
1a8e0 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
1a8f0 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
1a900 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
1a910 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
1a920 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
1a930 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
1a940 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
1a950 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
1a960 69 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61  id tplt_xfer(cha
1a970 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69  r *name, FILE *i
1a980 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e  n, FILE *out, in
1a990 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69  t *lineno).{.  i
1a9a0 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
1a9b0 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
1a9c0 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  ZE];.  while( fg
1a9d0 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
1a9e0 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30  E,in) && (line[0
1a9f0 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31  ]!='%' || line[1
1aa00 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28  ]!='%') ){.    (
1aa10 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
1aa20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  iStart = 0;.    
1aa30 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20  if( name ){.    
1aa40 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b    for(i=0; line[
1aa50 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
1aa60 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27    if( line[i]=='
1aa70 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c  P' && strncmp(&l
1aa80 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35  ine[i],"Parse",5
1aa90 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
1aaa0 26 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c  & (i==0 || !ISAL
1aab0 50 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a  PHA(line[i-1])).
1aac0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1aad0 20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72       if( i>iStar
1aae0 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  t ) fprintf(out,
1aaf0 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c  "%.*s",i-iStart,
1ab00 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
1ab10 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
1ab20 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29  f(out,"%s",name)
1ab30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
1ab40 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53   4;.          iS
1ab50 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  tart = i+1;.    
1ab60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ab70 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1ab80 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69  out,"%s",&line[i
1ab90 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start]);.  }.}..
1aba0 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63  /* The next func
1abb0 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74  tion finds the t
1abc0 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64  emplate file and
1abd0 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72   opens it, retur
1abe0 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ning.** a pointe
1abf0 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  r to the opened 
1ac00 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
1ac10 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e   FILE *tplt_open
1ac20 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1ac30 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20  emp).{.  static 
1ac40 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d  char templatenam
1ac50 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22  e[] = "lempar.c"
1ac60 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30  ;.  char buf[100
1ac70 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  0];.  FILE *in;.
1ac80 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65    char *tpltname
1ac90 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
1aca0 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69   /* first, see i
1acb0 66 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  f user specified
1acc0 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65   a template file
1acd0 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  name on the comm
1ace0 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69  and line. */.  i
1acf0 66 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  f (user_template
1ad00 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20  name != 0) {.   
1ad10 20 69 66 28 20 61 63 63 65 73 73 28 75 73 65 72   if( access(user
1ad20 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30  _templatename,00
1ad30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  4)==-1 ){.      
1ad40 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1ad50 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70  Can't find the p
1ad60 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d  arser driver tem
1ad70 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
1ad80 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75  ".\n",.        u
1ad90 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
1ada0 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
1adb0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1adc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1add0 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
1ade0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
1adf0 65 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  e,"rb");.    if(
1ae00 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
1ae10 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1ae20 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
1ae30 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
1ae40 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s\".\n",.       
1ae50 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70         user_temp
1ae60 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  latename);.     
1ae70 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1ae80 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
1ae90 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
1aea0 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63  urn in;.  }..  c
1aeb0 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70  p = strrchr(lemp
1aec0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b  ->filename,'.');
1aed0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
1aee0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
1aef0 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
1af00 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
1af10 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
1af20 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
1af30 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
1af40 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
1af50 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
1af60 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
1af70 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
1af80 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
1af90 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
1afa0 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
1afb0 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
1afc0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
1afd0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
1afe0 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
1aff0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
1b000 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
1b010 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
1b020 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
1b030 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b040 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
1b050 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
1b060 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
1b070 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
1b080 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
1b090 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
1b0a0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
1b0b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
1b0c0 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
1b0d0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
1b0e0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1b0f0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
1b100 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
1b110 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
1b120 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
1b130 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
1b140 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
1b150 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1b160 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
1b170 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
1b180 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
1b190 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
1b1a0 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
1b1b0 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a  t_linedir(FILE *
1b1c0 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  out, int lineno,
1b1d0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29   char *filename)
1b1e0 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .{.  fprintf(out
1b1f0 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c  ,"#line %d \"",l
1b200 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28  ineno);.  while(
1b210 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20   *filename ){.  
1b220 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20    if( *filename 
1b230 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27  == '\\' ) putc('
1b240 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75  \\',out);.    pu
1b250 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74  tc(*filename,out
1b260 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b  );.    filename+
1b270 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
1b280 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a  (out,"\"\n");.}.
1b290 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69  ./* Print a stri
1b2a0 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61  ng to the file a
1b2b0 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65  nd keep the line
1b2c0 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74  number up to dat
1b2d0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  e */.PRIVATE voi
1b2e0 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c  d tplt_print(FIL
1b2f0 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c  E *out, struct l
1b300 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72  emon *lemp, char
1b310 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65   *str, int *line
1b320 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d  no).{.  if( str=
1b330 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
1b340 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20  hile( *str ){.  
1b350 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
1b360 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  ;.    if( *str==
1b370 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
1b380 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20  ++;.    str++;. 
1b390 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d   }.  if( str[-1]
1b3a0 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75  !='\n' ){.    pu
1b3b0 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20  tc('\n',out);.  
1b3c0 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
1b3d0 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e   }.  if (!lemp->
1b3e0 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
1b3f0 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
1b400 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
1b410 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
1b420 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  >outname);.  }. 
1b430 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
1b440 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b450 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f  routine emits co
1b460 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72  de for the destr
1b470 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a  uctor for the.**
1b480 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f   symbol sp.*/.vo
1b490 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74  id emit_destruct
1b4a0 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  or_code(.  FILE 
1b4b0 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73  *out,.  struct s
1b4c0 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72  ymbol *sp,.  str
1b4d0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1b4e0 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29  .  int *lineno.)
1b4f0 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
1b500 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
1b510 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
1b520 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
1b530 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
1b540 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1b550 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
1b560 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1b570 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
1b580 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
1b590 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
1b5a0 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
1b5b0 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
1b5c0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28  ineno)++;.   if(
1b5d0 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1b5e0 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1b5f0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1b600 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1b610 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c  ,sp->destLineno,
1b620 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1b630 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28  .   }. }else if(
1b640 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
1b650 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
1b660 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
1b670 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
1b680 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b690 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
1b6a0 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61  ++;. }else{.   a
1b6b0 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
1b6c0 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f  Cannot happen */
1b6d0 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20  . }. for(; *cp; 
1b6e0 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63  cp++){.   if( *c
1b6f0 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d  p=='$' && cp[1]=
1b700 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72  ='$' ){.     fpr
1b710 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69  intf(out,"(yypmi
1b720 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e  nor->yy%d)",sp->
1b730 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b  dtnum);.     cp+
1b740 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  +;.     continue
1b750 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63  ;.   }.   if( *c
1b760 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  p=='\n' ) (*line
1b770 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28  no)++;.   fputc(
1b780 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70  *cp,out);. }. fp
1b790 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1b7a0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69   (*lineno)++;. i
1b7b0 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
1b7c0 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 28 2a  nosflag) {.   (*
1b7d0 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f  lineno)++; tplt_
1b7e0 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
1b7f0 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
1b800 65 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  e);. }. fprintf(
1b810 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
1b820 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e  neno)++;. return
1b830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b840 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
1b850 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
1b860 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
1b870 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
1b880 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74  as_destructor(st
1b890 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
1b8a0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1b8b0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74  emp).{.  int ret
1b8c0 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.  if( sp->type
1b8d0 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
1b8e0 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f    ret = lemp->to
1b8f0 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65  kendest!=0;.  }e
1b900 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  lse{.    ret = l
1b910 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20  emp->vardest!=0 
1b920 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
1b930 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r!=0;.  }.  retu
1b940 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
1b950 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
1b960 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1b970 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20  located string. 
1b980 20 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74   If zText is 0 t
1b990 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  hen.** reset the
1b9a0 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d   string to be em
1b9b0 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  pty again.  Alwa
1b9c0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
1b9d0 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f  mplete text.** o
1b9e0 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68  f the string (wh
1b9f0 69 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74  ich is overwritt
1ba00 65 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  en with each cal
1ba10 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65  l)..**.** n byte
1ba20 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73  s of zText are s
1ba30 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20  tored.  If n==0 
1ba40 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78  then all of zTex
1ba50 74 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  t up to the firs
1ba60 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e  t.** \000 termin
1ba70 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20  ator is stored. 
1ba80 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61   zText can conta
1ba90 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73  in up to two ins
1baa0 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e  tances of.** %d.
1bab0 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
1bac0 70 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72  p1 and p2 are wr
1bad0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66  itten into the f
1bae0 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a  irst and second.
1baf0 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** %d..**.** If 
1bb00 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  n==-1, then the 
1bb10 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
1bb20 65 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  er is overwritte
1bb30 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
1bb40 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63  ar *append_str(c
1bb50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
1bb60 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
1bb70 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
1bb80 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d  ic char empty[1]
1bb90 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74   = { 0 };.  stat
1bba0 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
1bbb0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
1bbc0 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
1bbd0 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
1bbe0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
1bbf0 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28   zInt[40];.  if(
1bc00 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
1bc10 20 69 66 28 20 75 73 65 64 3d 3d 30 20 26 26 20   if( used==0 && 
1bc20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20 30 3b  z!=0 ) z[0] = 0;
1bc30 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20  .    used = 0;. 
1bc40 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d     return z;.  }
1bc50 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20  .  if( n<=0 ){. 
1bc60 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
1bc70 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20      used += n;. 
1bc80 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65       assert( use
1bc90 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d>=0 );.    }.  
1bca0 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65    n = lemonStrle
1bcb0 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  n(zText);.  }.  
1bcc0 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73 69 7a  if( (int) (n+siz
1bcd0 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64  eof(zInt)*2+used
1bce0 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a  ) >= alloced ){.
1bcf0 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20      alloced = n 
1bd00 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32  + sizeof(zInt)*2
1bd10 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20   + used + 200;. 
1bd20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 20     z = (char *) 
1bd30 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f  realloc(z,  allo
1bd40 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ced);.  }.  if( 
1bd50 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 65 6d  z==0 ) return em
1bd60 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  pty;.  while( n-
1bd70 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d  - > 0 ){.    c =
1bd80 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20   *(zText++);.   
1bd90 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e   if( c=='%' && n
1bda0 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d  >0 && zText[0]==
1bdb0 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c 65 6d  'd' ){.      lem
1bdc0 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c  on_sprintf(zInt,
1bdd0 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20   "%d", p1);.    
1bde0 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20    p1 = p2;.     
1bdf0 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 26 7a   lemon_strcpy(&z
1be00 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20  [used], zInt);. 
1be10 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d       used += lem
1be20 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64  onStrlen(&z[used
1be30 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b  ]);.      zText+
1be40 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  +;.      n--;.  
1be50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1be60 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68 61 72  [used++] = (char
1be70 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  )c;.    }.  }.  
1be80 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72  z[used] = 0;.  r
1be90 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
1bea0 2a 20 57 72 69 74 65 20 61 6e 64 20 74 72 61 6e  * Write and tran
1beb0 73 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e 63 6f  sform the rp->co
1bec0 64 65 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61  de string so tha
1bed0 74 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 65 78  t symbols are ex
1bee0 70 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70 75 6c  panded..** Popul
1bef0 61 74 65 20 74 68 65 20 72 70 2d 3e 63 6f 64 65  ate the rp->code
1bf00 50 72 65 66 69 78 20 61 6e 64 20 72 70 2d 3e 63  Prefix and rp->c
1bf10 6f 64 65 53 75 66 66 69 78 20 73 74 72 69 6e 67  odeSuffix string
1bf20 73 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  s, as appropriat
1bf30 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
1bf40 31 20 69 66 20 74 68 65 20 65 78 70 61 6e 64 65  1 if the expande
1bf50 64 20 63 6f 64 65 20 72 65 71 75 69 72 65 73 20  d code requires 
1bf60 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e 6f 72  that "yylhsminor
1bf70 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  " local variable
1bf80 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69 6e 65  .** to be define
1bf90 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  d..*/.PRIVATE in
1bfa0 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65  t translate_code
1bfb0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1bfc0 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65  emp, struct rule
1bfd0 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20 2a 63   *rp){.  char *c
1bfe0 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b  p, *xp;.  int i;
1bff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1c000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c010 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f 72 20  e if yylhsminor 
1c020 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  is used */.  int
1c030 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 30   dontUseRhs0 = 0
1c040 3b 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20  ;   /* If true, 
1c050 75 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74  use of left-most
1c060 20 52 48 53 20 6c 61 62 65 6c 20 69 73 20 69 6c   RHS label is il
1c070 6c 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74  legal */.  const
1c080 20 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d 20 30   char *zSkip = 0
1c090 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72 74 20  ; /* The zOvwrt 
1c0a0 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e 20 72  comment within r
1c0b0 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c  p->code, or NULL
1c0c0 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73 75 73   */.  char lhsus
1c0d0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ed = 0;      /* 
1c0e0 54 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  True if the LHS 
1c0f0 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  element has been
1c100 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
1c110 6c 68 73 64 69 72 65 63 74 3b 20 20 20 20 20 20  lhsdirect;      
1c120 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4c 48 53    /* True if LHS
1c130 20 77 72 69 74 65 73 20 64 69 72 65 63 74 6c 79   writes directly
1c140 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f 0a 20   into stack */. 
1c150 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
1c160 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  S];     /* True 
1c170 66 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65  for each RHS ele
1c180 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73  ment which is us
1c190 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 68  ed */.  char zLh
1c1a0 73 5b 35 30 5d 3b 20 20 20 20 20 20 20 20 20 2f  s[50];         /
1c1b0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4c 48  * Convert the LH
1c1c0 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20 74 68  S symbol into th
1c1d0 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  is string */.  c
1c1e0 68 61 72 20 7a 4f 76 77 72 74 5b 39 30 30 5d 3b  har zOvwrt[900];
1c1f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
1c200 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77 20 4c   that to allow L
1c210 48 53 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  HS to overwrite 
1c220 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d  RHS */..  for(i=
1c230 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
1c240 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b  ++) used[i] = 0;
1c250 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a  .  lhsused = 0;.
1c260 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d  .  if( rp->code=
1c270 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
1c280 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73 74 72   char newlinestr
1c290 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c  [2] = { '\n', '\
1c2a0 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  0' };.    rp->co
1c2b0 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b  de = newlinestr;
1c2c0 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20  .    rp->line = 
1c2d0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20  rp->ruleline;.  
1c2e0 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31    rp->noCode = 1
1c2f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c300 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20  p->noCode = 0;. 
1c310 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d 3e 6e   }...  if( rp->n
1c320 72 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rhs==0 ){.    /*
1c330 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1c340 20 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20 74 68   RHS symbols, th
1c350 65 6e 20 77 72 69 74 69 6e 67 20 64 69 72 65 63  en writing direc
1c360 74 6c 79 20 74 6f 20 74 68 65 20 4c 48 53 20 69  tly to the LHS i
1c370 73 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68 73 64  s ok */.    lhsd
1c380 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  irect = 1;.  }el
1c390 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c  se if( rp->rhsal
1c3a0 69 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ias[0]==0 ){.   
1c3b0 20 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73   /* The left-mos
1c3c0 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 68 61 73  t RHS symbol has
1c3d0 20 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48 53 20   no value.  LHS 
1c3e0 64 69 72 65 63 74 20 69 73 20 6f 6b 2e 20 20 42  direct is ok.  B
1c3f0 75 74 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  ut.    ** we hav
1c400 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 64 69  e to call the di
1c410 73 74 72 75 63 74 6f 72 20 6f 6e 20 74 68 65 20  structor on the 
1c420 52 48 53 20 73 79 6d 62 6f 6c 20 66 69 72 73 74  RHS symbol first
1c430 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65  . */.    lhsdire
1c440 63 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ct = 1;.    if( 
1c450 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72  has_destructor(r
1c460 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70 29 20  p->rhs[0],lemp) 
1c470 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f  ){.      append_
1c480 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  str(0,0,0,0);.  
1c490 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1c4a0 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28    yy_destructor(
1c4b0 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79  yypParser,%d,&yy
1c4c0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
1c4d0 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n", 0,.         
1c4e0 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
1c4f0 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70 2d 3e  0]->index,1-rp->
1c500 6e 72 68 73 29 3b 0a 20 20 20 20 20 20 72 70 2d  nrhs);.      rp-
1c510 3e 63 6f 64 65 50 72 65 66 69 78 20 3d 20 53 74  >codePrefix = St
1c520 72 73 61 66 65 28 61 70 70 65 6e 64 5f 73 74 72  rsafe(append_str
1c530 28 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20 20 20  (0,0,0,0));.    
1c540 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30    rp->noCode = 0
1c550 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1c560 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
1c570 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1c580 65 72 65 20 69 73 20 6e 6f 20 4c 48 53 20 76 61  ere is no LHS va
1c590 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f 0a 20  lue symbol. */. 
1c5a0 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31     lhsdirect = 1
1c5b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1c5c0 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61  rcmp(rp->lhsalia
1c5d0 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30  s,rp->rhsalias[0
1c5e0 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ])==0 ){.    /* 
1c5f0 54 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 61  The LHS symbol a
1c600 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  nd the left-most
1c610 20 52 48 53 20 73 79 6d 62 6f 6c 20 61 72 65 20   RHS symbol are 
1c620 74 68 65 20 73 61 6d 65 2c 20 73 6f 0a 20 20 20  the same, so.   
1c630 20 2a 2a 20 64 69 72 65 63 74 20 77 72 69 74 69   ** direct writi
1c640 6e 67 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f  ng is allowed */
1c650 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1c660 20 31 3b 0a 20 20 20 20 6c 68 73 75 73 65 64 20   1;.    lhsused 
1c670 3d 20 31 3b 0a 20 20 20 20 75 73 65 64 5b 30 5d  = 1;.    used[0]
1c680 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 72 70   = 1;.    if( rp
1c690 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21 3d 72 70  ->lhs->dtnum!=rp
1c6a0 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e 75 6d 20  ->rhs[0]->dtnum 
1c6b0 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
1c6c0 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
1c6d0 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
1c6e0 20 20 20 20 20 20 20 22 25 73 28 25 73 29 20 61         "%s(%s) a
1c6f0 6e 64 20 25 73 28 25 73 29 20 73 68 61 72 65 20  nd %s(%s) share 
1c700 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 62  the same label b
1c710 75 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ut have ".      
1c720 20 20 22 64 69 66 66 65 72 65 6e 74 20 64 61 74    "different dat
1c730 61 74 79 70 65 73 2e 22 2c 0a 20 20 20 20 20 20  atypes.",.      
1c740 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c    rp->lhs->name,
1c750 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72   rp->lhsalias, r
1c760 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61 6d 65 2c  p->rhs[0]->name,
1c770 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d   rp->rhsalias[0]
1c780 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
1c790 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d  rrorcnt++;.    }
1c7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65  .  }else{.    le
1c7b0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77  mon_sprintf(zOvw
1c7c0 72 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72  rt, "/*%s-overwr
1c7d0 69 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20  ites-%s*/",.    
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
1c7f0 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e  ->lhsalias, rp->
1c800 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20  rhsalias[0]);.  
1c810 20 20 7a 53 6b 69 70 20 3d 20 73 74 72 73 74 72    zSkip = strstr
1c820 28 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72  (rp->code, zOvwr
1c830 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6b 69  t);.    if( zSki
1c840 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  p!=0 ){.      /*
1c850 20 54 68 65 20 63 6f 64 65 20 63 6f 6e 74 61 69   The code contai
1c860 6e 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6d  ns a special com
1c870 6d 65 6e 74 20 74 68 61 74 20 69 6e 64 69 63 61  ment that indica
1c880 74 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  tes that it is s
1c890 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  afe.      ** for
1c8a0 20 74 68 65 20 4c 48 53 20 6c 61 62 65 6c 20 74   the LHS label t
1c8b0 6f 20 6f 76 65 72 77 72 69 74 65 20 6c 65 66 74  o overwrite left
1c8c0 2d 6d 6f 73 74 20 52 48 53 20 6c 61 62 65 6c 2e  -most RHS label.
1c8d0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64 69 72   */.      lhsdir
1c8e0 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ect = 1;.    }el
1c8f0 73 65 7b 0a 20 20 20 20 20 20 6c 68 73 64 69 72  se{.      lhsdir
1c900 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ect = 0;.    }. 
1c910 20 7d 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65   }.  if( lhsdire
1c920 63 74 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  ct ){.    sprint
1c930 66 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25  f(zLhs, "yymsp[%
1c940 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31  d].minor.yy%d",1
1c950 2d 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68  -rp->nrhs,rp->lh
1c960 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c  s->dtnum);.  }el
1c970 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c980 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73      sprintf(zLhs
1c990 2c 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79  , "yylhsminor.yy
1c9a0 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  %d",rp->lhs->dtn
1c9b0 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65  um);.  }..  appe
1c9c0 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
1c9d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73  ..  /* This cons
1c9e0 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20  t cast is wrong 
1c9f0 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66  but harmless, if
1ca00 20 77 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20   we're careful. 
1ca10 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61  */.  for(cp=(cha
1ca20 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  r *)rp->code; *c
1ca30 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66  p; cp++){.    if
1ca40 28 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20  ( cp==zSkip ){. 
1ca50 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1ca60 7a 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20  zOvwrt,0,0,0);. 
1ca70 20 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e       cp += lemon
1ca80 53 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31  Strlen(zOvwrt)-1
1ca90 3b 0a 20 20 20 20 20 20 64 6f 6e 74 55 73 65 52  ;.      dontUseR
1caa0 68 73 30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  hs0 = 1;.      c
1cab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1cac0 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 2a     if( ISALPHA(*
1cad0 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e  cp) && (cp==rp->
1cae0 63 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55  code || (!ISALNU
1caf0 4d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b  M(cp[-1]) && cp[
1cb00 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20  -1]!='_')) ){.  
1cb10 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a      char saved;.
1cb20 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63        for(xp= &c
1cb30 70 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78  p[1]; ISALNUM(*x
1cb40 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20  p) || *xp=='_'; 
1cb50 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76  xp++);.      sav
1cb60 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20  ed = *xp;.      
1cb70 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  *xp = 0;.      i
1cb80 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
1cb90 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d  && strcmp(cp,rp-
1cba0 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b  >lhsalias)==0 ){
1cbb0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
1cbc0 73 74 72 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b  str(zLhs,0,0,0);
1cbd0 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70  .        cp = xp
1cbe0 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65  ;.        lhsuse
1cbf0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
1cc00 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
1cc10 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1cc20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1cc30 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
1cc40 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63  s[i] && strcmp(c
1cc50 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  p,rp->rhsalias[i
1cc60 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1cc70 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26       if( i==0 &&
1cc80 20 64 6f 6e 74 55 73 65 52 68 73 30 20 29 7b 0a   dontUseRhs0 ){.
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72                Er
1cca0 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
1ccb0 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
1ccc0 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne,.            
1ccd0 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75       "Label %s u
1cce0 73 65 64 20 61 66 74 65 72 20 27 25 73 27 2e 22  sed after '%s'."
1ccf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cd00 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
1cd10 30 5d 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20  0], zOvwrt);.   
1cd20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d             lemp-
1cd30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1cd40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1cd50 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20  f( cp!=rp->code 
1cd60 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29  && cp[-1]=='@' )
1cd70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cd80 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  /* If the argume
1cd90 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
1cda0 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69  m @X then substi
1cdb0 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  tuted.          
1cdc0 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e      ** the token
1cdd0 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f   number of X, no
1cde0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58  t the value of X
1cdf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ce00 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
1ce10 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d  msp[%d].major",-
1ce20 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30  1,i-rp->nrhs+1,0
1ce30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1ce40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1ce60 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
1ce70 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1ce80 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20    int dtnum;.   
1ce90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1cea0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
1ceb0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
1cec0 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
1ced0 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  = sp->subsym[0]-
1cee0 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
1cef0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
1cf10 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a  um = sp->dtnum;.
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
1cf40 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
1cf50 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  %d].minor.yy%d",
1cf60 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20  0,i-rp->nrhs+1, 
1cf70 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
1cf80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cf90 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
1cfa0 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
1cfb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1cfc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1cfd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1cfe0 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d     }.      *xp =
1cff0 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20   saved;.    }.  
1d000 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c    append_str(cp,
1d010 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f   1, 0, 0);.  } /
1d020 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  * End loop */.. 
1d030 20 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20 67 65   /* Main code ge
1d040 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74  neration complet
1d050 65 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70  ed */.  cp = app
1d060 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
1d070 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20 63 70  ;.  if( cp && cp
1d080 5b 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d  [0] ) rp->code =
1d090 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20   Strsafe(cp);.  
1d0a0 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1d0b0 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ,0);..  /* Check
1d0c0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1d0d0 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75  e LHS has been u
1d0e0 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d  sed */.  if( rp-
1d0f0 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68  >lhsalias && !lh
1d100 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72  sused ){.    Err
1d110 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1d120 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1d130 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20  e,.      "Label 
1d140 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28  \"%s\" for \"%s(
1d150 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
1d160 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  sed.",.        r
1d170 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
1d180 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68  lhs->name,rp->lh
1d190 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d  salias);.    lem
1d1a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1d1b0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d1c0 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64  e destructor cod
1d1d0 65 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20  e for RHS minor 
1d1e0 76 61 6c 75 65 73 20 77 68 69 63 68 20 61 72 65  values which are
1d1f0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 64 2e   not referenced.
1d200 0a 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 65  .  ** Generate e
1d210 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 66 6f  rror messages fo
1d220 72 20 75 6e 75 73 65 64 20 6c 61 62 65 6c 73 20  r unused labels 
1d230 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 6c 61  and duplicate la
1d240 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bels..  */.  for
1d250 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
1d260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1d270 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
1d280 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  ){.      if( i>0
1d290 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1d2a0 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  j;.        if( r
1d2b0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73  p->lhsalias && s
1d2c0 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69  trcmp(rp->lhsali
1d2d0 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  as,rp->rhsalias[
1d2e0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1d2f0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1d300 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1d310 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1d320 20 20 20 20 20 20 22 25 73 28 25 73 29 20 68 61        "%s(%s) ha
1d330 73 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c  s the same label
1d340 20 61 73 20 74 68 65 20 4c 48 53 20 62 75 74 20   as the LHS but 
1d350 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d  is not the left-
1d360 6d 6f 73 74 20 22 0a 20 20 20 20 20 20 20 20 20  most ".         
1d370 20 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68     "symbol on th
1d380 65 20 52 48 53 2e 22 2c 0a 20 20 20 20 20 20 20  e RHS.",.       
1d390 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
1d3a0 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c  >name, rp->rhsal
1d3b0 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ias[i]);.       
1d3c0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1d3d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1d3e0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1d3f0 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
1d400 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
1d410 61 6c 69 61 73 5b 6a 5d 20 26 26 20 73 74 72 63  alias[j] && strc
1d420 6d 70 28 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  mp(rp->rhsalias[
1d430 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  j],rp->rhsalias[
1d440 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1d450 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1d460 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1d470 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1d480 20 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c            "Label
1d490 20 25 73 20 75 73 65 64 20 66 6f 72 20 6d 75 6c   %s used for mul
1d4a0 74 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 6f 6e  tiple symbols on
1d4b0 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 72 75   the RHS of a ru
1d4c0 6c 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  le.",.          
1d4d0 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
1d4e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
1d4f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1d500 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1d510 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d520 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d530 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1d540 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  used[i] ){.     
1d550 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1d560 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1d570 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1d580 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
1d590 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
1d5a0 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
1d5b0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
1d5c0 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69  ias[i],rp->rhs[i
1d5d0 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61  ]->name,rp->rhsa
1d5e0 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lias[i]);.      
1d5f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1d600 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1d610 7d 65 6c 73 65 20 69 66 28 20 69 3e 30 20 26 26  }else if( i>0 &&
1d620 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1d630 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29  rp->rhs[i],lemp)
1d640 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
1d650 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72  _str("  yy_destr
1d660 75 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c  uctor(yypParser,
1d670 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  %d,&yymsp[%d].mi
1d680 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20  nor);\n", 0,.   
1d690 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
1d6a0 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
1d6b0 68 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hs+1);.    }.  }
1d6c0 0a 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65  ..  /* If unable
1d6d0 20 74 6f 20 77 72 69 74 65 20 4c 48 53 20 76 61   to write LHS va
1d6e0 6c 75 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e  lues directly in
1d6f0 74 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 77 72  to the stack, wr
1d700 69 74 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 76  ite the.  ** sav
1d710 65 64 20 4c 48 53 20 76 61 6c 75 65 20 6e 6f 77  ed LHS value now
1d720 2e 20 2a 2f 0a 20 20 69 66 28 20 6c 68 73 64 69  . */.  if( lhsdi
1d730 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  rect==0 ){.    a
1d740 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 6d  ppend_str("  yym
1d750 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
1d760 64 20 3d 20 22 2c 20 30 2c 20 31 2d 72 70 2d 3e  d = ", 0, 1-rp->
1d770 6e 72 68 73 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64  nrhs, rp->lhs->d
1d780 74 6e 75 6d 29 3b 0a 20 20 20 20 61 70 70 65 6e  tnum);.    appen
1d790 64 5f 73 74 72 28 7a 4c 68 73 2c 20 30 2c 20 30  d_str(zLhs, 0, 0
1d7a0 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  , 0);.    append
1d7b0 5f 73 74 72 28 22 3b 5c 6e 22 2c 20 30 2c 20 30  _str(";\n", 0, 0
1d7c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1d7d0 53 75 66 66 69 78 20 63 6f 64 65 20 67 65 6e 65  Suffix code gene
1d7e0 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 20  ration complete 
1d7f0 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64  */.  cp = append
1d800 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
1d810 20 69 66 28 20 63 70 20 26 26 20 63 70 5b 30 5d   if( cp && cp[0]
1d820 20 29 7b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65   ){.    rp->code
1d830 53 75 66 66 69 78 20 3d 20 53 74 72 73 61 66 65  Suffix = Strsafe
1d840 28 63 70 29 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f  (cp);.    rp->no
1d850 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Code = 0;.  }.. 
1d860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d870 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d880 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1d890 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20  s when the rule 
1d8a0 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64 2e  "rp" is reduced.
1d8b0 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63    Write.** the c
1d8c0 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d  ode to "out".  M
1d8d0 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20  ake sure lineno 
1d8e0 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65  stays up-to-date
1d8f0 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
1d900 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46  d emit_code(.  F
1d910 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75  ILE *out,.  stru
1d920 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73  ct rule *rp,.  s
1d930 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1d940 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  p,.  int *lineno
1d950 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72 20  .){. const char 
1d960 2a 63 70 3b 0a 0a 20 2f 2a 20 53 65 74 75 70 20  *cp;.. /* Setup 
1d970 63 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 74 68  code prior to th
1d980 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76  e #line directiv
1d990 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f  e */. if( rp->co
1d9a0 64 65 50 72 65 66 69 78 20 26 26 20 72 70 2d 3e  dePrefix && rp->
1d9b0 63 6f 64 65 50 72 65 66 69 78 5b 30 5d 20 29 7b  codePrefix[0] ){
1d9c0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1d9d0 20 22 7b 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65   "{%s", rp->code
1d9e0 50 72 65 66 69 78 29 3b 0a 20 20 20 66 6f 72 28  Prefix);.   for(
1d9f0 63 70 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  cp=rp->codePrefi
1da00 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69  x; *cp; cp++){ i
1da10 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28  f( *cp=='\n' ) (
1da20 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d  *lineno)++; }. }
1da30 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .. /* Generate c
1da40 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65  ode to do the re
1da50 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
1da60 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  if( rp->code ){.
1da70 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f     if( !lemp->no
1da80 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20  linenosflag ){. 
1da90 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
1daa0 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64  .     tplt_lined
1dab0 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c  ir(out,rp->line,
1dac0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1dad0 0a 20 20 20 7d 0a 20 20 20 66 70 72 69 6e 74 66  .   }.   fprintf
1dae0 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63  (out,"{%s",rp->c
1daf0 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  ode);.   for(cp=
1db00 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63  rp->code; *cp; c
1db10 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27  p++){ if( *cp=='
1db20 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
1db30 2b 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28  +; }.   fprintf(
1db40 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
1db50 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20  neno)++;.   if( 
1db60 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
1db70 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c  flag ){.     (*l
1db80 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74  ineno)++;.     t
1db90 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1dba0 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
1dbb0 74 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a  tname);.   }. }.
1dbc0 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 62 72  . /* Generate br
1dbd0 65 61 6b 64 6f 77 6e 20 63 6f 64 65 20 74 68 61  eakdown code tha
1dbe0 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  t occurs after t
1dbf0 68 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69  he #line directi
1dc00 76 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  ve */. if( rp->c
1dc10 6f 64 65 53 75 66 66 69 78 20 26 26 20 72 70 2d  odeSuffix && rp-
1dc20 3e 63 6f 64 65 53 75 66 66 69 78 5b 30 5d 20 29  >codeSuffix[0] )
1dc30 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  {.   fprintf(out
1dc40 2c 20 22 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65  , "%s", rp->code
1dc50 53 75 66 66 69 78 29 3b 0a 20 20 20 66 6f 72 28  Suffix);.   for(
1dc60 63 70 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66 69  cp=rp->codeSuffi
1dc70 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69  x; *cp; cp++){ i
1dc80 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28  f( *cp=='\n' ) (
1dc90 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d  *lineno)++; }. }
1dca0 0a 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50  .. if( rp->codeP
1dcb0 72 65 66 69 78 20 29 7b 0a 20 20 20 66 70 72 69  refix ){.   fpri
1dcc0 6e 74 66 28 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b  ntf(out, "}\n");
1dcd0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d   (*lineno)++;. }
1dce0 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .. return;.}../*
1dcf0 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
1dd00 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
1dd10 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
1dd20 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
1dd30 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
1dd40 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
1dd50 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
1dd60 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
1dd70 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
1dd80 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1dd90 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
1dda0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
1ddb0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
1ddc0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
1ddd0 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
1dde0 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
1ddf0 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
1de00 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
1de10 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
1de20 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a  nt_stack_union(.
1de30 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20    FILE *out,    
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de50 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65   The output stre
1de60 61 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  am */.  struct l
1de70 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20  emon *lemp,     
1de80 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
1de90 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  info structure f
1dea0 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a  or this parser *
1deb0 2f 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f  /.  int *plineno
1dec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ded0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1dee0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  e line number */
1def0 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20  .  int mhflag   
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df10 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
1df20 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
1df30 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20   output */.){.  
1df40 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  int lineno = *pl
1df50 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65  ineno;    /* The
1df60 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   line number of 
1df70 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1df80 63 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20  char **types;   
1df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68            /* A h
1dfa0 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74  ash table of dat
1dfb0 61 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20  atypes */.  int 
1dfc0 61 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20  arraysize;      
1dfd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1dfe0 20 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72   the "types" arr
1dff0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64  ay */.  int maxd
1e000 74 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20  tlength;        
1e010 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e    /* Maximum len
1e020 67 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74  gth of any ".dat
1e030 61 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f  atype" field. */
1e040 0a 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20  .  char *stddt; 
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e060 53 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d  Standardized nam
1e070 65 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65  e for a datatype
1e080 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20   */.  int i,j;  
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1e0b0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 68   */.  unsigned h
1e0c0 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
1e0d0 2f 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74  /* For hashing t
1e0e0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70  he name of a typ
1e0f0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e100 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1e110 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e120 70 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  parser */..  /* 
1e130 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1e140 74 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20  tialize types[] 
1e150 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64  and allocate std
1e160 64 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73  dt[] */.  arrays
1e170 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d  ize = lemp->nsym
1e180 62 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73  bol * 2;.  types
1e190 20 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f   = (char**)callo
1e1a0 63 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69  c( arraysize, si
1e1b0 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20  zeof(char*) );. 
1e1c0 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20 29 7b   if( types==0 ){
1e1d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1e1e0 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
1e1f0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
1e200 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
1e210 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
1e220 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20  ; i++) types[i] 
1e230 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67  = 0;.  maxdtleng
1e240 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65  th = 0;.  if( le
1e250 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20  mp->vartype ){. 
1e260 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d     maxdtlength =
1e270 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d   lemonStrlen(lem
1e280 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d  p->vartype);.  }
1e290 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1e2a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1e2b0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  ){.    int len;.
1e2c0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1e2d0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
1e2e0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66  mbols[i];.    if
1e2f0 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d  ( sp->datatype==
1e300 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e310 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
1e320 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70 65  len(sp->datatype
1e330 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d  );.    if( len>m
1e340 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61 78  axdtlength ) max
1e350 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a  dtlength = len;.
1e360 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28 63    }.  stddt = (c
1e370 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78  har*)malloc( max
1e380 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20 29  dtlength*2 + 1 )
1e390 3b 0a 20 20 69 66 28 20 73 74 64 64 74 3d 3d 30  ;.  if( stddt==0
1e3a0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1e3b0 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
1e3c0 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
1e3d0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
1e3e0 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
1e3f0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
1e400 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
1e410 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
1e420 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
1e430 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
1e440 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
1e450 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
1e460 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
1e470 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
1e480 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
1e490 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
1e4a0 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
1e4b0 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
1e4c0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
1e4d0 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
1e4e0 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
1e4f0 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
1e500 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
1e510 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
1e520 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
1e530 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1e540 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1e550 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
1e560 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1e570 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1e580 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
1e590 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
1e5a0 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
1e5b0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
1e5c0 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
1e5d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1e5e0 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
1e5f0 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
1e600 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
1e610 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
1e620 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
1e630 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
1e640 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1e650 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
1e660 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
1e670 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
1e680 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
1e690 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
1e6a0 20 77 68 69 6c 65 28 20 49 53 53 50 41 43 45 28   while( ISSPACE(
1e6b0 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
1e6c0 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
1e6d0 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
1e6e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
1e6f0 20 26 26 20 49 53 53 50 41 43 45 28 73 74 64 64   && ISSPACE(stdd
1e700 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
1e710 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
1e720 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
1e730 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63  okentype && strc
1e740 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e  mp(stddt, lemp->
1e750 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b  tokentype)==0 ){
1e760 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1e770 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
1e780 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1e790 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f  hash = 0;.    fo
1e7a0 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b  r(j=0; stddt[j];
1e7b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73   j++){.      has
1e7c0 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74  h = hash*53 + st
1e7d0 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  ddt[j];.    }.  
1e7e0 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26    hash = (hash &
1e7f0 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72   0x7fffffff)%arr
1e800 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c  aysize;.    whil
1e810 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29  e( types[hash] )
1e820 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
1e830 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  mp(types[hash],s
1e840 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tddt)==0 ){.    
1e850 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1e860 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
1e870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e880 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20  .      hash++;. 
1e890 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 28       if( hash>=(
1e8a0 75 6e 73 69 67 6e 65 64 29 61 72 72 61 79 73 69  unsigned)arraysi
1e8b0 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20  ze ) hash = 0;. 
1e8c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70     }.    if( typ
1e8d0 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
1e8e0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
1e8f0 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20   hash + 1;.     
1e900 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28   types[hash] = (
1e910 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65  char*)malloc( le
1e920 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64 74 29  monStrlen(stddt)
1e930 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1 );.      if( 
1e940 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
1e950 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1e960 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
1e970 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
1e980 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
1e990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 65 6d       }.      lem
1e9a0 6f 6e 5f 73 74 72 63 70 79 28 74 79 70 65 73 5b  on_strcpy(types[
1e9b0 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20  hash],stddt);.  
1e9c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
1e9d0 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69  int out the defi
1e9e0 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45  nition of YYTOKE
1e9f0 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f  NTYPE and YYMINO
1ea00 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20  RTYPE */.  name 
1ea10 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1ea20 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1ea30 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  se";.  lineno = 
1ea40 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20  *plineno;.  if( 
1ea50 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
1ea60 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
1ea70 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
1ea80 2b 2b 3b 20 7d 0a 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 54  out,"#define %sT
1eaa0 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e  OKENTYPE %s\n",n
1eab0 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74  ame,.    lemp->t
1eac0 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74  okentype?lemp->t
1ead0 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22  okentype:"void*"
1eae0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1eaf0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
1eb00 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1eb10 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1eb20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1eb30 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  ,"typedef union 
1eb40 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1eb50 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1eb60 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22    int yyinit;\n"
1eb70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1eb80 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
1eb90 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e  TOKENTYPE yy0;\n
1eba0 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
1ebb0 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  +;.  for(i=0; i<
1ebc0 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b  arraysize; i++){
1ebd0 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69  .    if( types[i
1ebe0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
1ebf0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ec00 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c  ,"  %s yy%d;\n",
1ec10 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c  types[i],i+1); l
1ec20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1ec30 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d  e(types[i]);.  }
1ec40 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
1ec50 73 79 6d 20 26 26 20 6c 65 6d 70 2d 3e 65 72 72  sym && lemp->err
1ec60 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
1ec70 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ec80 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c    int yy%d;\n",l
1ec90 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
1eca0 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  um); lineno++;. 
1ecb0 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29   }.  free(stddt)
1ecc0 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b  ;.  free(types);
1ecd0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1ece0 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e  } YYMINORTYPE;\n
1ecf0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ed00 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  *plineno = linen
1ed10 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  o;.}../*.** Retu
1ed20 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
1ed30 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65   C datatype able
1ed40 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61   to represent va
1ed50 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  lues between.** 
1ed60 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63  lwr and upr, inc
1ed70 6c 75 73 69 76 65 2e 20 20 49 66 20 70 6e 42 79  lusive.  If pnBy
1ed80 74 65 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c  te!=NULL then al
1ed90 73 6f 20 77 72 69 74 65 20 74 68 65 20 73 69 7a  so write the siz
1eda0 65 6f 66 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  eof.** for that 
1edb0 74 79 70 65 20 28 31 2c 20 32 2c 20 6f 72 20 34  type (1, 2, or 4
1edc0 29 20 69 6e 74 6f 20 2a 70 6e 42 79 74 65 2e 0a  ) into *pnByte..
1edd0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1ede0 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69  char *minimum_si
1edf0 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c  ze_type(int lwr,
1ee00 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70   int upr, int *p
1ee10 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20  nByte){.  const 
1ee20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 69  char *zType = "i
1ee30 6e 74 22 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  nt";.  int nByte
1ee40 20 3d 20 34 3b 0a 20 20 69 66 28 20 6c 77 72 3e   = 4;.  if( lwr>
1ee50 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70  =0 ){.    if( up
1ee60 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20  r<=255 ){.      
1ee70 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1ee80 64 20 63 68 61 72 22 3b 0a 20 20 20 20 20 20 6e  d char";.      n
1ee90 42 79 74 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  Byte = 1;.    }e
1eea0 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35 35 33  lse if( upr<6553
1eeb0 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  5 ){.      zType
1eec0 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 73 68 6f   = "unsigned sho
1eed0 72 74 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e  rt int";.      n
1eee0 42 79 74 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65  Byte = 2;.    }e
1eef0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  lse{.      zType
1ef00 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 69 6e 74   = "unsigned int
1ef10 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ";.      nByte =
1ef20 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   4;.    }.  }els
1ef30 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20  e if( lwr>=-127 
1ef40 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20  && upr<=127 ){. 
1ef50 20 20 20 7a 54 79 70 65 20 3d 20 22 73 69 67 6e     zType = "sign
1ef60 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 6e 42  ed char";.    nB
1ef70 79 74 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  yte = 1;.  }else
1ef80 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37   if( lwr>=-32767
1ef90 20 26 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b   && upr<32767 ){
1efa0 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 73 68  .    zType = "sh
1efb0 6f 72 74 22 3b 0a 20 20 20 20 6e 42 79 74 65 20  ort";.    nByte 
1efc0 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 2;.  }.  if( p
1efd0 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20  nByte ) *pnByte 
1efe0 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72  = nByte;.  retur
1eff0 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
1f000 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e  * Each state con
1f010 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74  tains a set of t
1f020 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  oken transaction
1f030 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a   and a set of.**
1f040 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61   nonterminal tra
1f050 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  nsactions.  Each
1f060 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d   of these sets m
1f070 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  akes an instance
1f080 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
1f090 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
1f0a0 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
1f0b0 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73  se structures is
1f0c0 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65   used.** to orde
1f0d0 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  r the creation o
1f0e0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
1f0f0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
1f100 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78  le..*/.struct ax
1f110 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73  set {.  struct s
1f120 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20  tate *stp;   /* 
1f130 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
1f140 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tate */.  int is
1f150 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tkn;           /
1f160 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f  * True to use to
1f170 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72  kens.  False for
1f180 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a   non-terminals *
1f190 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  /.  int nAction;
1f1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f1b0 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f  er of actions */
1f1c0 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20  .  int iOrder;  
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1f1e0 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74  nal order of act
1f1f0 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a  ion sets */.};..
1f200 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f  /*.** Compare to
1f210 20 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65   axset structure
1f220 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
1f230 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
1f240 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61   int axset_compa
1f250 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61  re(const void *a
1f260 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29  , const void *b)
1f270 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  {.  struct axset
1f280 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61   *p1 = (struct a
1f290 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63  xset*)a;.  struc
1f2a0 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73  t axset *p2 = (s
1f2b0 74 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a  truct axset*)b;.
1f2c0 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70    int c;.  c = p
1f2d0 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d  2->nAction - p1-
1f2e0 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20  >nAction;.  if( 
1f2f0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
1f300 70 31 2d 3e 69 4f 72 64 65 72 20 2d 20 70 32 2d  p1->iOrder - p2-
1f310 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61  >iOrder;.  }.  a
1f320 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70  ssert( c!=0 || p
1f330 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72  1==p2 );.  retur
1f340 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  n c;.}../*.** Wr
1f350 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74  ite text on "out
1f360 22 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  " that describes
1f370 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a   the rule "rp"..
1f380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1f390 72 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c  riteRuleText(FIL
1f3a0 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72  E *out, struct r
1f3b0 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20  ule *rp){.  int 
1f3c0 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  j;.  fprintf(out
1f3d0 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c  ,"%s ::=", rp->l
1f3e0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
1f3f0 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73  (j=0; j<rp->nrhs
1f400 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
1f410 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1f420 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20  rp->rhs[j];.    
1f430 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4d 55  if( sp->type!=MU
1f440 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
1f450 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1f460 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
1f470 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f480 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1f490 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
1f4a0 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  s", sp->subsym[0
1f4b0 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
1f4c0 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e  for(k=1; k<sp->n
1f4d0 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20  subsym; k++){.  
1f4e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1f4f0 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73  t,"|%s",sp->subs
1f500 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[k]->name);.  
1f510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f520 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.../* Generate 
1f530 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f  C source code fo
1f540 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  r the parser */.
1f550 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65  void ReportTable
1f560 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (.  struct lemon
1f570 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 6d 68   *lemp,.  int mh
1f580 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f 75 74 70  flag     /* Outp
1f590 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72  ut in makeheader
1f5a0 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65  s format if true
1f5b0 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f   */.){.  FILE *o
1f5c0 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
1f5d0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
1f5e0 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20    int  lineno;. 
1f5f0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1f600 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
1f610 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63  ion *ap;.  struc
1f620 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
1f630 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41 63  ruct acttab *pAc
1f640 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  ttab;.  int i, j
1f650 2c 20 6e 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73  , n, sz;.  int s
1f660 7a 41 63 74 69 6f 6e 54 79 70 65 3b 20 20 20 20  zActionType;    
1f670 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 41 43 54   /* sizeof(YYACT
1f680 49 4f 4e 54 59 50 45 29 20 2a 2f 0a 20 20 69 6e  IONTYPE) */.  in
1f690 74 20 73 7a 43 6f 64 65 54 79 70 65 3b 20 20 20  t szCodeType;   
1f6a0 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59      /* sizeof(YY
1f6b0 43 4f 44 45 54 59 50 45 29 20 20 20 2a 2f 0a 20  CODETYPE)   */. 
1f6c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1f6d0 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66  e;.  int mnTknOf
1f6e0 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20  st, mxTknOfst;. 
1f6f0 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d   int mnNtOfst, m
1f700 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63  xNtOfst;.  struc
1f710 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20  t axset *ax;..  
1f720 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65  lemp->minShiftRe
1f730 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  duce = lemp->nst
1f740 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 65 72 72  ate;.  lemp->err
1f750 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6d  Action = lemp->m
1f760 69 6e 53 68 69 66 74 52 65 64 75 63 65 20 2b 20  inShiftReduce + 
1f770 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 6c  lemp->nrule;.  l
1f780 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 20 3d  emp->accAction =
1f790 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e   lemp->errAction
1f7a0 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6e 6f   + 1;.  lemp->no
1f7b0 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 61  Action = lemp->a
1f7c0 63 63 41 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20  ccAction + 1;.  
1f7d0 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20  lemp->minReduce 
1f7e0 3d 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e  = lemp->noAction
1f7f0 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6d 61   + 1;.  lemp->ma
1f800 78 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e  xAction = lemp->
1f810 6d 69 6e 52 65 64 75 63 65 20 2b 20 6c 65 6d 70  minReduce + lemp
1f820 2d 3e 6e 72 75 6c 65 3b 0a 0a 20 20 69 6e 20 3d  ->nrule;..  in =
1f830 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29   tplt_open(lemp)
1f840 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
1f850 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20  return;.  out = 
1f860 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1f870 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .c","wb");.  if(
1f880 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66   out==0 ){.    f
1f890 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72  close(in);.    r
1f8a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e  eturn;.  }.  lin
1f8b0 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f  eno = 1;.  tplt_
1f8c0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1f8d0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1f8e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1f8f0 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65  the include code
1f900 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70  , if any */.  tp
1f910 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1f920 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c  p,lemp->include,
1f930 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20  &lineno);.  if( 
1f940 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68  mhflag ){.    ch
1f950 61 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66 69  ar *incName = fi
1f960 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
1f970 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
1f980 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
1f990 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69 6e  de \"%s\"\n", in
1f9a0 63 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  cName); lineno++
1f9b0 3b 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e 61  ;.    free(incNa
1f9c0 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  me);.  }.  tplt_
1f9d0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1f9e0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1f9f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1fa00 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c  #defines for all
1fa10 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28   tokens */.  if(
1fa20 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
1fa30 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69  onst char *prefi
1fa40 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  x;.    fprintf(o
1fa50 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1fa60 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1fa70 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
1fa80 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65  okenprefix ) pre
1fa90 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65  fix = lemp->toke
1faa0 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73  nprefix;.    els
1fab0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1fac0 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22       prefix = ""
1fad0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
1fae0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1faf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70  ; i++){.      fp
1fb00 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1fb10 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e  ne %s%-30s %2d\n
1fb20 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73  ",prefix,lemp->s
1fb30 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  ymbols[i]->name,
1fb40 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f  i);.      lineno
1fb50 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ++;.    }.    fp
1fb60 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1fb70 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1fb80 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1fb90 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1fba0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1fbb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1fbc0 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72  defines */.  fpr
1fbd0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1fbe0 65 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c  e YYCODETYPE %s\
1fbf0 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  n",.    minimum_
1fc00 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d  size_type(0, lem
1fc10 70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20 26 73 7a 43  p->nsymbol, &szC
1fc20 6f 64 65 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e  odeType)); linen
1fc30 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1fc40 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f  ut,"#define YYNO
1fc50 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  CODE %d\n",lemp-
1fc60 3e 6e 73 79 6d 62 6f 6c 29 3b 20 20 6c 69 6e 65  >nsymbol);  line
1fc70 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1fc80 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41  out,"#define YYA
1fc90 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c  CTIONTYPE %s\n",
1fca0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
1fcb0 65 5f 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6d  e_type(0,lemp->m
1fcc0 61 78 41 63 74 69 6f 6e 2c 26 73 7a 41 63 74 69  axAction,&szActi
1fcd0 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f  onType)); lineno
1fce0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1fcf0 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
1fd00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1fd10 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20  fine YYWILDCARD 
1fd20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65  %d\n",.       le
1fd30 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e  mp->wildcard->in
1fd40 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1fd50 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63    }.  print_stac
1fd60 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
1fd70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
1fd80 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1fd90 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43   "#ifndef YYSTAC
1fda0 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65  KDEPTH\n"); line
1fdb0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1fdc0 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20  ->stacksize ){. 
1fdd0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1fde0 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1fdf0 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d  EPTH %s\n",lemp-
1fe00 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69  >stacksize);  li
1fe10 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1fe20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1fe30 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1fe40 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20  KDEPTH 100\n"); 
1fe50 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1fe60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1fe70 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1fe80 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1fe90 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1fea0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1feb0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1fec0 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20  +;.  }.  name = 
1fed0 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
1fee0 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
1fef0 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61  ";.  if( lemp->a
1ff00 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b  rg && lemp->arg[
1ff10 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c 65  0] ){.    i = le
1ff20 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
1ff30 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  arg);.    while(
1ff40 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41 43 45   i>=1 && ISSPACE
1ff50 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
1ff60 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c   ) i--;.    whil
1ff70 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53 41 4c  e( i>=1 && (ISAL
1ff80 4e 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  NUM(lemp->arg[i-
1ff90 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67  1]) || lemp->arg
1ffa0 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d  [i-1]=='_') ) i-
1ffb0 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  -;.    fprintf(o
1ffc0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1ffd0 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e  G_SDECL %s;\n",n
1ffe0 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20  ame,lemp->arg); 
1fff0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
20000 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20010 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20  ine %sARG_PDECL 
20020 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  ,%s\n",name,lemp
20030 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->arg);  lineno+
20040 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
20050 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
20060 47 5f 50 41 52 41 4d 20 2c 25 73 5c 6e 22 2c 6e  G_PARAM ,%s\n",n
20070 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  ame,&lemp->arg[i
20080 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
20090 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
200a0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
200b0 54 43 48 20 25 73 3d 79 79 70 50 61 72 73 65 72  TCH %s=yypParser
200c0 2d 3e 25 73 3b 5c 6e 22 2c 0a 20 20 20 20 20 20  ->%s;\n",.      
200d0 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
200e0 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
200f0 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
20100 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
20110 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
20120 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
20130 73 65 72 2d 3e 25 73 3d 25 73 3b 5c 6e 22 2c 0a  ser->%s=%s;\n",.
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
20160 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
20170 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
20180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
20190 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
201a0 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
201b0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
201c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
201d0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
201e0 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  PDECL\n",name); 
201f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
20200 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
20210 6e 65 20 25 73 41 52 47 5f 50 41 52 41 4d 5c 6e  ne %sARG_PARAM\n
20220 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
20230 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
20240 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
20250 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29  G_FETCH\n",name)
20260 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
20270 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
20280 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45  fine %sARG_STORE
20290 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
202a0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
202b0 65 6d 70 2d 3e 63 74 78 20 26 26 20 6c 65 6d 70  emp->ctx && lemp
202c0 2d 3e 63 74 78 5b 30 5d 20 29 7b 0a 20 20 20 20  ->ctx[0] ){.    
202d0 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  i = lemonStrlen(
202e0 6c 65 6d 70 2d 3e 63 74 78 29 3b 0a 20 20 20 20  lemp->ctx);.    
202f0 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 49  while( i>=1 && I
20300 53 53 50 41 43 45 28 6c 65 6d 70 2d 3e 63 74 78  SSPACE(lemp->ctx
20310 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20  [i-1]) ) i--;.  
20320 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26    while( i>=1 &&
20330 20 28 49 53 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e   (ISALNUM(lemp->
20340 63 74 78 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d  ctx[i-1]) || lem
20350 70 2d 3e 63 74 78 5b 69 2d 31 5d 3d 3d 27 5f 27  p->ctx[i-1]=='_'
20360 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72  ) ) i--;.    fpr
20370 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20380 65 20 25 73 43 54 58 5f 53 44 45 43 4c 20 25 73  e %sCTX_SDECL %s
20390 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  ;\n",name,lemp->
203a0 63 74 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ctx);  lineno++;
203b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
203c0 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f  ,"#define %sCTX_
203d0 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d  PDECL ,%s\n",nam
203e0 65 2c 6c 65 6d 70 2d 3e 63 74 78 29 3b 20 20 6c  e,lemp->ctx);  l
203f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
20400 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20410 65 20 25 73 43 54 58 5f 50 41 52 41 4d 20 2c 25  e %sCTX_PARAM ,%
20420 73 5c 6e 22 2c 6e 61 6d 65 2c 26 6c 65 6d 70 2d  s\n",name,&lemp-
20430 3e 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >ctx[i]);  linen
20440 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
20450 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
20460 43 54 58 5f 46 45 54 43 48 20 25 73 3d 79 79 70  CTX_FETCH %s=yyp
20470 50 61 72 73 65 72 2d 3e 25 73 3b 5c 6e 22 2c 0a  Parser->%s;\n",.
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 63 74 78 2c   name,lemp->ctx,
204a0 26 6c 65 6d 70 2d 3e 63 74 78 5b 69 5d 29 3b 20  &lemp->ctx[i]); 
204b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
204c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
204d0 69 6e 65 20 25 73 43 54 58 5f 53 54 4f 52 45 20  ine %sCTX_STORE 
204e0 79 79 70 50 61 72 73 65 72 2d 3e 25 73 3d 25 73  yypParser->%s=%s
204f0 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;\n",.          
20500 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d         name,&lem
20510 70 2d 3e 63 74 78 5b 69 5d 2c 26 6c 65 6d 70 2d  p->ctx[i],&lemp-
20520 3e 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >ctx[i]);  linen
20530 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
20540 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
20550 64 65 66 69 6e 65 20 25 73 43 54 58 5f 53 44 45  define %sCTX_SDE
20560 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  CL\n",name); lin
20570 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
20580 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20590 25 73 43 54 58 5f 50 44 45 43 4c 5c 6e 22 2c 6e  %sCTX_PDECL\n",n
205a0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
205b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
205c0 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f 50  "#define %sCTX_P
205d0 41 52 41 4d 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ARAM\n",name); l
205e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
205f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20600 65 20 25 73 43 54 58 5f 46 45 54 43 48 5c 6e 22  e %sCTX_FETCH\n"
20610 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
20620 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20630 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54 58  t,"#define %sCTX
20640 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b  _STORE\n",name);
20650 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
20660 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
20670 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
20680 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
20690 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
206a0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 26 26 20  lemp->errsym && 
206b0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
206c0 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
206d0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
206e0 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25   YYERRORSYMBOL %
206f0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
20700 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  m->index); linen
20710 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
20720 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
20730 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22  ERRSYMDT yy%d\n"
20740 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
20750 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
20760 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
20770 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
20780 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20790 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c  ,"#define YYFALL
207a0 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e  BACK 1\n");  lin
207b0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eno++;.  }..  /*
207c0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
207d0 69 6f 6e 20 74 61 62 6c 65 2c 20 62 75 74 20 64  ion table, but d
207e0 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20 69 74 20  o not output it 
207f0 79 65 74 2e 20 20 54 68 65 20 61 63 74 69 6f 6e  yet.  The action
20800 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74  .  ** table must
20810 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 65 66   be computed bef
20820 6f 72 65 20 67 65 6e 65 72 61 74 69 6e 67 20 74  ore generating t
20830 68 65 20 59 59 4e 53 54 41 54 45 20 6d 61 63 72  he YYNSTATE macr
20840 6f 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 77  o because.  ** w
20850 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 68  e need to know h
20860 6f 77 20 6d 61 6e 79 20 73 74 61 74 65 73 20 63  ow many states c
20870 61 6e 20 62 65 20 65 6c 69 6d 69 6e 61 74 65 64  an be eliminated
20880 2e 0a 20 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73  ..  */.  ax = (s
20890 74 72 75 63 74 20 61 78 73 65 74 20 2a 29 20 63  truct axset *) c
208a0 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 78 73 74  alloc(lemp->nxst
208b0 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78  ate*2, sizeof(ax
208c0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d  [0]));.  if( ax=
208d0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
208e0 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
208f0 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
20900 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
20910 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
20920 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
20930 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
20940 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61  sorted[i];.    a
20950 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70  x[i*2].stp = stp
20960 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73  ;.    ax[i*2].is
20970 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b  Tkn = 1;.    ax[
20980 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  i*2].nAction = s
20990 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20  tp->nTknAct;.   
209a0 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d   ax[i*2+1].stp =
209b0 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
209c0 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20  +1].isTkn = 0;. 
209d0 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63     ax[i*2+1].nAc
209e0 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  tion = stp->nNtA
209f0 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f  ct;.  }.  mxTknO
20a00 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
20a10 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20  = 0;.  mxNtOfst 
20a20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a  = mnNtOfst = 0;.
20a30 20 20 2f 2a 20 49 6e 20 61 6e 20 65 66 66 6f 72    /* In an effor
20a40 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  t to minimize th
20a50 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 73  e action table s
20a60 69 7a 65 2c 20 75 73 65 20 74 68 65 20 68 65 75  ize, use the heu
20a70 72 69 73 74 69 63 0a 20 20 2a 2a 20 6f 66 20 70  ristic.  ** of p
20a80 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65  lacing the large
20a90 73 74 20 61 63 74 69 6f 6e 20 73 65 74 73 20 66  st action sets f
20aa0 69 72 73 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  irst */.  for(i=
20ab0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61  0; i<lemp->nxsta
20ac0 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d  te*2; i++) ax[i]
20ad0 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71  .iOrder = i;.  q
20ae0 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e  sort(ax, lemp->n
20af0 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  xstate*2, sizeof
20b00 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63  (ax[0]), axset_c
20b10 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74  ompare);.  pActt
20b20 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f  ab = acttab_allo
20b30 63 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c  c(lemp->nsymbol,
20b40 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c   lemp->nterminal
20b50 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
20b60 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 20  lemp->nxstate*2 
20b70 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e  && ax[i].nAction
20b80 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  >0; i++){.    st
20b90 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20  p = ax[i].stp;. 
20ba0 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54     if( ax[i].isT
20bb0 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  kn ){.      for(
20bc0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
20bd0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
20be0 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
20bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
20c00 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d  ->sp->index>=lem
20c10 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
20c20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20c30 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
20c40 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
20c50 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
20c60 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
20c70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
20c80 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
20c90 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
20ca0 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
20cb0 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
20cc0 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62  TknOfst = acttab
20cd0 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 2c  _insert(pActtab,
20ce0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73   1);.      if( s
20cf0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54  tp->iTknOfst<mnT
20d00 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66  knOfst ) mnTknOf
20d10 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  st = stp->iTknOf
20d20 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  st;.      if( st
20d30 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b  p->iTknOfst>mxTk
20d40 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73  nOfst ) mxTknOfs
20d50 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
20d60 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
20d70 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
20d80 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
20d90 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ext){.        in
20da0 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  t action;.      
20db0 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
20dc0 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  dex<lemp->ntermi
20dd0 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  nal ) continue;.
20de0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
20df0 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d  sp->index==lemp-
20e00 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69  >nsymbol ) conti
20e10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
20e20 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  ion = compute_ac
20e30 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a  tion(lemp, ap);.
20e40 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69          if( acti
20e50 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  on<0 ) continue;
20e60 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f  .        acttab_
20e70 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
20e80 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61  ap->sp->index, a
20e90 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ction);.      }.
20ea0 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66        stp->iNtOf
20eb0 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65  st = acttab_inse
20ec0 72 74 28 70 41 63 74 74 61 62 2c 20 30 29 3b 0a  rt(pActtab, 0);.
20ed0 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
20ee0 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20  NtOfst<mnNtOfst 
20ef0 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mnNtOfst = stp
20f00 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20  ->iNtOfst;.     
20f10 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
20f20 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e  t>mxNtOfst ) mxN
20f30 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
20f40 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20  Ofst;.    }.#if 
20f50 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20  0  /* Uncomment 
20f60 66 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20 68  for a trace of h
20f70 6f 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ow the yy_action
20f80 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f  [] table fills o
20f90 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20  ut */.    { int 
20fa0 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f  jj, nn;.      fo
20fb0 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41  r(jj=nn=0; jj<pA
20fc0 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20  cttab->nAction; 
20fd0 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
20fe0 66 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74  f( pActtab->aAct
20ff0 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30  ion[jj].action<0
21000 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d   ) nn++;.      }
21010 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
21020 34 64 3a 20 53 74 61 74 65 20 25 33 64 20 25 73  4d: State %3d %s
21030 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35   n: %2d size: %5
21040 64 20 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c  d freespace: %d\
21050 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21060 20 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75   i, stp->statenu
21070 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f  m, ax[i].isTkn ?
21080 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20   "Token" : "Var 
21090 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ",.            
210a0 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20   ax[i].nAction, 
210b0 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e  pActtab->nAction
210c0 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  , nn);.    }.#en
210d0 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61  dif.  }.  free(a
210e0 78 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72  x);..  /* Mark r
210f0 75 6c 65 73 20 74 68 61 74 20 61 72 65 20 61 63  ules that are ac
21100 74 75 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20  tually used for 
21110 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61  reduce actions a
21120 66 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70  fter all.  ** op
21130 74 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65  timizations have
21140 20 62 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20   been applied.  
21150 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
21160 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
21170 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65  p->next) rp->doe
21180 73 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  sReduce = LEMON_
21190 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30  FALSE;.  for(i=0
211a0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
211b0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
211c0 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  (ap=lemp->sorted
211d0 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  [i]->ap; ap; ap=
211e0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
211f0 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
21200 45 44 55 43 45 20 7c 7c 20 61 70 2d 3e 74 79 70  EDUCE || ap->typ
21210 65 3d 3d 53 48 49 46 54 52 45 44 55 43 45 20 29  e==SHIFTREDUCE )
21220 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e  {.        ap->x.
21230 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d  rp->doesReduce =
21240 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
21250 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
21260 73 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65  sh rendering the
21270 20 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74   constants now t
21280 68 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74  hat the action t
21290 61 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  able has.  ** be
212a0 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20  en computed */. 
212b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
212c0 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20  efine YYNSTATE  
212d0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
212e0 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b  ,lemp->nxstate);
212f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
21300 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
21310 6e 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20  ne YYNRULE      
21320 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65          %d\n",le
21330 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e  mp->nrule);  lin
21340 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
21350 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
21360 4e 54 4f 4b 45 4e 20 20 20 20 20 20 20 20 20 20  NTOKEN          
21370 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e     %d\n",lemp->n
21380 74 65 72 6d 69 6e 61 6c 29 3b 20 6c 69 6e 65 6e  terminal); linen
21390 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
213a0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
213b0 41 58 5f 53 48 49 46 54 20 20 20 20 20 20 20 20  AX_SHIFT        
213c0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73   %d\n",lemp->nxs
213d0 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  tate-1); lineno+
213e0 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d  +;.  i = lemp->m
213f0 69 6e 53 68 69 66 74 52 65 64 75 63 65 3b 0a 20  inShiftReduce;. 
21400 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
21410 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 53 48 49  efine YY_MIN_SHI
21420 46 54 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22  FTREDUCE   %d\n"
21430 2c 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ,i); lineno++;. 
21440 20 69 20 2b 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c   i += lemp->nrul
21450 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
21460 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58  ,"#define YY_MAX
21470 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25  _SHIFTREDUCE   %
21480 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65  d\n", i-1); line
21490 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
214a0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
214b0 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20  ERROR_ACTION    
214c0 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 65    %d\n", lemp->e
214d0 72 72 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e  rrAction); linen
214e0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
214f0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41  ut,"#define YY_A
21500 43 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20  CCEPT_ACTION    
21510 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 61 63   %d\n", lemp->ac
21520 63 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f  cAction); lineno
21530 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
21540 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4e 4f  t,"#define YY_NO
21550 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  _ACTION         
21560 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6e 6f 41  %d\n", lemp->noA
21570 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ction); lineno++
21580 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21590 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f  "#define YY_MIN_
215a0 52 45 44 55 43 45 20 20 20 20 20 20 20 20 25 64  REDUCE        %d
215b0 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65  \n", lemp->minRe
215c0 64 75 63 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  duce); lineno++;
215d0 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e  .  i = lemp->min
215e0 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e  Reduce + lemp->n
215f0 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  rule;.  fprintf(
21600 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
21610 4d 41 58 5f 52 45 44 55 43 45 20 20 20 20 20 20  MAX_REDUCE      
21620 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c    %d\n", i-1); l
21630 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
21640 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
21650 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
21660 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70 75  ..  /* Now outpu
21670 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  t the action tab
21680 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  le and its assoc
21690 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  iates:.  **.  **
216a0 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20    yy_action[]   
216b0 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
216c0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
216d0 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ll actions..  **
216e0 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d    yy_lookahead[]
216f0 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e       A table con
21700 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b  taining the look
21710 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65  ahead for each e
21720 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20  ntry in.  **    
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65   yy_action.  Use
21750 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68  d to detect hash
21760 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
21770 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  *  yy_shift_ofst
21780 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
21790 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
217a0 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
217b0 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
217d0 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e  fting terminals.
217e0 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65  .  **  yy_reduce
217f0 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61  _ofst[]   For ea
21800 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
21810 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
21820 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65   shifting non-te
21850 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20  rminals after a 
21860 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79  reduce..  **  yy
21870 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20  _default[]      
21880 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
21890 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a  for each state..
218a0 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75    */..  /* Outpu
218b0 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  t the yy_action 
218c0 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d  table */.  lemp-
218d0 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e 20  >nactiontab = n 
218e0 3d 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f  = acttab_action_
218f0 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20  size(pActtab);. 
21900 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65   lemp->tablesize
21910 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79   += n*szActionTy
21920 70 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  pe;.  fprintf(ou
21930 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43  t,"#define YY_AC
21940 54 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c  TTAB_COUNT (%d)\
21950 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  n", n); lineno++
21960 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21970 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
21980 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63  ACTIONTYPE yy_ac
21990 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20  tion[] = {\n"); 
219a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
219b0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
219c0 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e  {.    int action
219d0 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74 69   = acttab_yyacti
219e0 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a  on(pActtab, i);.
219f0 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30      if( action<0
21a00 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70   ) action = lemp
21a10 2d 3e 6e 6f 41 63 74 69 6f 6e 3b 0a 20 20 20 20  ->noAction;.    
21a20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
21a30 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
21a40 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
21a50 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
21a60 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ,", action);.   
21a70 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
21a80 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
21a90 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
21aa0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
21ab0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
21ac0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
21ad0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
21ae0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
21af0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
21b00 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f  Output the yy_lo
21b10 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f  okahead table */
21b20 0a 20 20 6c 65 6d 70 2d 3e 6e 6c 6f 6f 6b 61 68  .  lemp->nlookah
21b30 65 61 64 74 61 62 20 3d 20 6e 20 3d 20 61 63 74  eadtab = n = act
21b40 74 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69  tab_lookahead_si
21b50 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 6c  ze(pActtab);.  l
21b60 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
21b70 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a  = n*szCodeType;.
21b80 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
21b90 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f  tatic const YYCO
21ba0 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68  DETYPE yy_lookah
21bb0 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ead[] = {\n"); l
21bc0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
21bd0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
21be0 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63  .    int la = ac
21bf0 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64  ttab_yylookahead
21c00 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20  (pActtab, i);.  
21c10 20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20    if( la<0 ) la 
21c20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  = lemp->nsymbol;
21c30 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
21c40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
21c50 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
21c60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21c70 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20  " %4d,", la);.  
21c80 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
21c90 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
21ca0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
21cb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
21cc0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
21cd0 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
21ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
21cf0 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
21d00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
21d10 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73   Output the yy_s
21d20 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c  hift_ofst[] tabl
21d30 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  e */.  n = lemp-
21d40 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  >nxstate;.  whil
21d50 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
21d60 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b  sorted[n-1]->iTk
21d70 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  nOfst==NO_OFFSET
21d80 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
21d90 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
21da0 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20  YY_SHIFT_COUNT  
21db0 20 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b    (%d)\n", n-1);
21dc0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
21dd0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
21de0 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20  ne YY_SHIFT_MIN 
21df0 20 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e       (%d)\n", mn
21e00 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  TknOfst); lineno
21e10 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
21e20 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
21e30 48 49 46 54 5f 4d 41 58 20 20 20 20 20 20 28 25  HIFT_MAX      (%
21e40 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74  d)\n", mxTknOfst
21e50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
21e60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
21e70 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
21e80 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b  shift_ofst[] = {
21e90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6d 69 6e 69  \n",.       mini
21ea0 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
21eb0 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e  TknOfst, lemp->n
21ec0 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e  terminal+lemp->n
21ed0 61 63 74 69 6f 6e 74 61 62 2c 20 26 73 7a 29 29  actiontab, &sz))
21ee0 3b 0a 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  ;.       lineno+
21ef0 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65  +;.  lemp->table
21f00 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20  size += n*sz;.  
21f10 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
21f20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
21f30 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
21f40 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
21f50 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
21f60 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  TknOfst;.    if(
21f70 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
21f80 20 29 20 6f 66 73 74 20 3d 20 6c 65 6d 70 2d 3e   ) ofst = lemp->
21f90 6e 61 63 74 69 6f 6e 74 61 62 3b 0a 20 20 20 20  nactiontab;.    
21fa0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
21fb0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
21fc0 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
21fd0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
21fe0 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
21ff0 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
22000 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
22010 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
22020 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
22030 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
22040 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
22050 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
22060 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
22070 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
22080 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75  tput the yy_redu
22090 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ce_ofst[] table 
220a0 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  */.  n = lemp->n
220b0 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  xstate;.  while(
220c0 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
220d0 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66  rted[n-1]->iNtOf
220e0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
220f0 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  n--;.  fprintf(o
22100 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
22110 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64  REDUCE_COUNT (%d
22120 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  )\n", n-1); line
22130 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
22140 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
22150 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25  _REDUCE_MIN   (%
22160 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29  d)\n", mnNtOfst)
22170 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
22180 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
22190 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41  ine YY_REDUCE_MA
221a0 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e  X   (%d)\n", mxN
221b0 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  tOfst); lineno++
221c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
221d0 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25   "static const %
221e0 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74  s yy_reduce_ofst
221f0 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20  [] = {\n",.     
22200 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
22210 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
22220 31 2c 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a  1, mxNtOfst, &sz
22230 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
22240 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
22250 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69  += n*sz;.  for(i
22260 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
22270 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
22280 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
22290 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
222a0 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
222b0 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
222c0 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
222d0 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
222e0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
222f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
22300 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
22310 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22320 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
22330 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
22340 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
22350 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
22360 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
22370 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
22380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
22390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
223a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
223b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
223c0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
223d0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
223e0 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
223f0 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
22400 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
22410 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
22420 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
22430 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
22440 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  tate;.  lemp->ta
22450 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41  blesize += n*szA
22460 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72  ctionType;.  for
22470 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
22480 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
22490 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
224a0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
224b0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
224c0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
224d0 69 66 28 20 73 74 70 2d 3e 69 44 66 6c 74 52 65  if( stp->iDfltRe
224e0 64 75 63 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  duce<0 ){.      
224f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
22500 34 64 2c 22 2c 20 6c 65 6d 70 2d 3e 65 72 72 41  4d,", lemp->errA
22510 63 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  ction);.    }els
22520 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
22530 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73  (out, " %4d,", s
22540 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20  tp->iDfltReduce 
22550 2b 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63  + lemp->minReduc
22560 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
22570 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
22580 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
22590 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
225a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
225b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
225c0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
225d0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
225e0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
225f0 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
22600 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
22610 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
22620 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
22630 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62  e table of fallb
22640 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  ack tokens..  */
22650 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
22660 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
22670 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e   int mx = lemp->
22680 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20  nterminal - 1;. 
22690 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26     while( mx>0 &
226a0 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  & lemp->symbols[
226b0 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  mx]->fallback==0
226c0 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20   ){ mx--; }.    
226d0 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
226e0 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a 43 6f 64 65  += (mx+1)*szCode
226f0 54 79 70 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Type;.    for(i=
22700 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a  0; i<=mx; i++){.
22710 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
22720 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73  bol *p = lemp->s
22730 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
22740 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b   if( p->fallback
22750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
22760 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
22770 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20   0,  /* %10s => 
22780 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70  nothing */\n", p
22790 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
227a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70  else{.        fp
227b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33  rintf(out, "  %3
227c0 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25  d,  /* %10s => %
227d0 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c  s */\n", p->fall
227e0 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20  back->index,.   
227f0 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20         p->name, 
22800 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d  p->fallback->nam
22810 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22820 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
22830 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  }.  }.  tplt_xfe
22840 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e  r(lemp->name, in
22850 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b  , out, &lineno);
22860 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
22870 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  a table containi
22880 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  ng the symbolic 
22890 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79  name of every sy
228a0 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mbol.  */.  for(
228b0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
228c0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
228d0 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 6c 69  lemon_sprintf(li
228e0 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
228f0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
22900 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
22910 66 28 6f 75 74 2c 22 20 20 2f 2a 20 25 34 64 20  f(out,"  /* %4d 
22920 2a 2f 20 5c 22 25 73 5c 22 2c 5c 6e 22 2c 69 2c  */ \"%s\",\n",i,
22930 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
22940 5d 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  ]->name); lineno
22950 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
22960 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
22970 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
22980 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
22990 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
229a0 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
229b0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
229c0 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
229d0 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
229e0 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
229f0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
22a00 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
22a10 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
22a20 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
22a30 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
22a40 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
22a50 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
22a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
22a70 3e 69 52 75 6c 65 3d 3d 69 20 29 3b 0a 20 20 20  >iRule==i );.   
22a80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
22a90 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
22aa0 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
22ab0 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
22ac0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
22ad0 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
22ae0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
22af0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
22b00 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
22b10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
22b20 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
22b30 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
22b40 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
22b50 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
22b60 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
22b70 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
22b80 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
22b90 68 65 20 70 61 72 73 65 72 2e 0a 20 20 2a 2a 20  he parser..  ** 
22ba0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
22bb0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
22bc0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
22bd0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
22be0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
22bf0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
22c00 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
22c10 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
22c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
22c30 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
22c40 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
22c50 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
22c60 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
22c70 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
22c80 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
22c90 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
22ca0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
22cb0 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44     /* TERMINAL D
22cc0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
22cd0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
22ce0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
22cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
22d00 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
22d10 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
22d20 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
22d30 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
22d40 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
22d50 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
22d60 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
22d70 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
22d80 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
22d90 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
22da0 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
22db0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
22dc0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
22dd0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
22de0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
22df0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
22e00 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
22e10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
22e20 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
22e30 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
22e40 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
22e50 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69  lt_sp = 0;.    i
22e60 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
22e70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
22e80 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
22e90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
22ea0 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
22eb0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
22ec0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
22ed0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
22ee0 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  AL ||.          
22ef0 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20  sp->index<=0 || 
22f00 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
22f10 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22f20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a      if( once ){.
22f30 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
22f40 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44  out, "      /* D
22f50 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49  efault NON-TERMI
22f60 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
22f70 2f 5c 6e 22 29 3b 6c 69 6e 65 6e 6f 2b 2b 3b 0a  /\n");lineno++;.
22f80 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
22f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22fa0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
22fb0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
22fc0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
22fd0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
22fe0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c  eno++;.      dfl
22ff0 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d  t_sp = sp;.    }
23000 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70  .    if( dflt_sp
23010 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  !=0 ){.      emi
23020 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
23030 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65  e(out,dflt_sp,le
23040 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
23050 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
23060 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
23070 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
23080 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
23090 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
230a0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
230b0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
230c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
230d0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
230e0 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
230f0 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  NAL || sp->destr
23100 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69  uctor==0 ) conti
23110 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  nue;.    if( sp-
23120 3e 64 65 73 74 4c 69 6e 65 6e 6f 3c 30 20 29 20  >destLineno<0 ) 
23130 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 41 6c  continue;  /* Al
23140 72 65 61 64 79 20 65 6d 69 74 74 65 64 20 2a 2f  ready emitted */
23150 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
23160 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
23170 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e  * %s */\n", sp->
23180 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
23190 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20  ; lineno++;..   
231a0 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c   /* Combine dupl
231b0 69 63 61 74 65 20 64 65 73 74 72 75 63 74 6f 72  icate destructor
231c0 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
231d0 63 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  case */.    for(
231e0 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  j=i+1; j<lemp->n
231f0 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  symbol; j++){.  
23200 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
23210 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73  l *sp2 = lemp->s
23220 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20  ymbols[j];.     
23230 20 69 66 28 20 73 70 32 20 26 26 20 73 70 32 2d   if( sp2 && sp2-
23240 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
23250 26 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74  && sp2->destruct
23260 6f 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  or.          && 
23270 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e  sp2->dtnum==sp->
23280 64 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20  dtnum.          
23290 26 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65  && strcmp(sp->de
232a0 73 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65  structor,sp2->de
232b0 73 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a  structor)==0 ){.
232c0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
232d0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
232e0 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a  d: /* %s */\n",.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32   sp2->index, sp2
23310 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
23320 2b 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d  +;.         sp2-
23330 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31  >destLineno = -1
23340 3b 20 20 2f 2a 20 41 76 6f 69 64 20 65 6d 69 74  ;  /* Avoid emit
23350 74 69 6e 67 20 74 68 69 73 20 64 65 73 74 72 75  ting this destru
23360 63 74 6f 72 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ctor again */.  
23370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23380 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
23390 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
233a0 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
233b0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
233c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
233d0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
233e0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
233f0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
23400 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
23410 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
23420 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
23430 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
23440 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
23450 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
23460 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
23470 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
23480 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  w,&lineno);.  tp
23490 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
234a0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
234b0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
234c0 74 65 20 74 68 65 20 74 61 62 6c 65 73 20 6f 66  te the tables of
234d0 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   rule informatio
234e0 6e 2e 20 20 79 79 52 75 6c 65 49 6e 66 6f 4c 68  n.  yyRuleInfoLh
234f0 73 5b 5d 20 61 6e 64 0a 20 20 2a 2a 20 79 79 52  s[] and.  ** yyR
23500 75 6c 65 49 6e 66 6f 4e 52 68 73 5b 5d 2e 0a 20  uleInfoNRhs[].. 
23510 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
23520 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
23530 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
23540 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
23550 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
23560 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
23570 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
23580 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e  r(i=0, rp=lemp->
23590 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
235a0 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  >next, i++){.   
235b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
235c0 25 34 64 2c 20 20 2f 2a 20 28 25 64 29 20 22 2c  %4d,  /* (%d) ",
235d0 20 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c   rp->lhs->index,
235e0 20 69 29 3b 0a 20 20 20 20 20 72 75 6c 65 5f 70   i);.     rule_p
235f0 72 69 6e 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  rint(out, rp);. 
23600 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
23610 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
23620 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
23630 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
23640 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  ,out,&lineno);. 
23650 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
23660 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
23670 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
23680 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
23690 22 20 20 25 33 64 2c 20 20 2f 2a 20 28 25 64 29  "  %3d,  /* (%d)
236a0 20 22 2c 20 2d 72 70 2d 3e 6e 72 68 73 2c 20 69   ", -rp->nrhs, i
236b0 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70 72 69 6e  );.    rule_prin
236c0 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
236d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f  fprintf(out," */
236e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
236f0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
23700 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
23710 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
23720 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23730 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20  which execution 
23740 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44 55  during each REDU
23750 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  CE action */.  i
23760 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70 3d 6c   = 0;.  for(rp=l
23770 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
23780 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
23790 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74 65 5f   i += translate_
237a0 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a  code(lemp, rp);.
237b0 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b 0a 20    }.  if( i ){. 
237c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
237d0 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f 52 54          YYMINORT
237e0 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b 5c  YPE yylhsminor;\
237f0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
23800 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f 75   }.  /* First ou
23810 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65 72  tput rules other
23820 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c   than the defaul
23830 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72  t: rule */.  for
23840 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
23850 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
23860 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c  {.    struct rul
23870 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20 20  e *rp2;         
23880 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 72        /* Other r
23890 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61  ules with the sa
238a0 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  me action */.   
238b0 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d 69   if( rp->codeEmi
238c0 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tted ) continue;
238d0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f 43  .    if( rp->noC
238e0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ode ){.      /* 
238f0 4e 6f 20 43 20 63 6f 64 65 20 61 63 74 69 6f 6e  No C code action
23900 73 2c 20 73 6f 20 74 68 69 73 20 77 69 6c 6c 20  s, so this will 
23910 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 22  be part of the "
23920 64 65 66 61 75 6c 74 3a 22 20 72 75 6c 65 20 2a  default:" rule *
23930 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
23940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
23950 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63  ntf(out,"      c
23960 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70  ase %d: /* ", rp
23970 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72  ->iRule);.    wr
23980 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
23990 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
239a0 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b  f(out, " */\n");
239b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
239c0 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b  or(rp2=rp->next;
239d0 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e   rp2; rp2=rp2->n
239e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
239f0 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63  rp2->code==rp->c
23a00 6f 64 65 20 26 26 20 72 70 32 2d 3e 63 6f 64 65  ode && rp2->code
23a10 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65  Prefix==rp->code
23a20 50 72 65 66 69 78 0a 20 20 20 20 20 20 20 20 20  Prefix.         
23a30 20 20 20 20 26 26 20 72 70 32 2d 3e 63 6f 64 65      && rp2->code
23a40 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65  Suffix==rp->code
23a50 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Suffix ){.      
23a60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
23a70 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a       case %d: /*
23a80 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b   ", rp2->iRule);
23a90 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52 75  .        writeRu
23aa0 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29  leText(out, rp2)
23ab0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
23ac0 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73  f(out," */ yytes
23ad0 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
23ae0 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 52  %d);\n", rp2->iR
23af0 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ule); lineno++;.
23b00 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64          rp2->cod
23b10 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20  eEmitted = 1;.  
23b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23b30 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70  emit_code(out,rp
23b40 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
23b50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
23b60 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  "        break;\
23b70 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
23b80 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74     rp->codeEmitt
23b90 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  ed = 1;.  }.  /*
23ba0 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74   Finally, output
23bb0 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
23bc0 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61  le.  We choose a
23bd0 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61  s the default: a
23be0 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63  ll.  ** empty ac
23bf0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69  tions. */.  fpri
23c00 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64  ntf(out,"      d
23c10 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e  efault:\n"); lin
23c20 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d  eno++;.  for(rp=
23c30 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
23c40 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
23c50 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d    if( rp->codeEm
23c60 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  itted ) continue
23c70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70  ;.    assert( rp
23c80 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20 20 20 20  ->noCode );.    
23c90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
23ca0 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
23cb0 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72  ->iRule);.    wr
23cc0 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
23cd0 20 72 70 29 3b 0a 20 20 20 20 69 66 28 20 72 70   rp);.    if( rp
23ce0 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 29 7b 0a  ->doesReduce ){.
23cf0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
23d00 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63 61  t, " */ yytestca
23d10 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29  se(yyruleno==%d)
23d20 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  ;\n", rp->iRule)
23d30 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
23d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
23d50 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 4f 50 54  intf(out, " (OPT
23d60 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a 2f 20 61  IMIZED OUT) */ a
23d70 73 73 65 72 74 28 79 79 72 75 6c 65 6e 6f 21 3d  ssert(yyruleno!=
23d80 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %d);\n",.       
23d90 20 20 20 20 20 20 20 72 70 2d 3e 69 52 75 6c 65         rp->iRule
23da0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
23db0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
23dc0 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
23dd0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
23de0 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
23df0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
23e00 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
23e10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23e20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69  which executes i
23e30 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20  f a parse fails 
23e40 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
23e50 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66  out,lemp,lemp->f
23e60 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b  ailure,&lineno);
23e70 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
23e80 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
23e90 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
23ea0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
23eb0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
23ec0 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
23ed0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74  occurs */.  tplt
23ee0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
23ef0 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e  lemp->error,&lin
23f00 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
23f10 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23f20 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23f30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
23f40 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
23f50 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
23f60 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
23f70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
23f80 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
23f90 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f  ->accept,&lineno
23fa0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
23fb0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
23fc0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
23fd0 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
23fe0 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
23ff0 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
24000 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
24010 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
24020 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ode,&lineno);.. 
24030 20 61 63 74 74 61 62 5f 66 72 65 65 28 70 41 63   acttab_free(pAc
24040 74 74 61 62 29 3b 0a 20 20 66 63 6c 6f 73 65 28  ttab);.  fclose(
24050 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
24060 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
24070 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
24080 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
24090 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
240a0 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
240b0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
240c0 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p).{.  FILE *out
240d0 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  , *in;.  const c
240e0 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
240f0 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
24100 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
24110 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
24120 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
24130 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
24140 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
24150 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
24160 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
24170 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
24180 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
24190 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
241a0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
241b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43  ){.    int nextC
241c0 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  har;.    for(i=1
241d0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
241e0 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
241f0 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
24200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  i++){.      lemo
24210 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65 72  n_sprintf(patter
24220 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
24230 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20  0s %3d\n",.     
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24250 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
24260 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
24270 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
24280 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
24290 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
242a0 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67     nextChar = fg
242b0 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c  etc(in);.    fcl
242c0 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28  ose(in);.    if(
242d0 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69   i==lemp->ntermi
242e0 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d  nal && nextChar=
242f0 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =EOF ){.      /*
24300 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
24310 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
24320 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
24330 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
24340 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
24350 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
24360 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
24370 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
24380 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
24390 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
243a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
243b0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
243c0 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  3d\n",prefix,lem
243d0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
243e0 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
243f0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
24400 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
24410 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69  /* Reduce the si
24420 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
24430 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73   tables, if poss
24440 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ible, by making 
24450 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c  use.** of defaul
24460 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ts..**.** In thi
24470 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61  s version, we ta
24480 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71  ke the most freq
24490 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69  uent REDUCE acti
244a0 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69  on and make.** i
244b0 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  t the default.  
244c0 45 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73  Except, there is
244d0 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74   no default if t
244e0 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
244f0 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62  n.** is a possib
24500 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a  le look-ahead..*
24510 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54  /.void CompressT
24520 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ables(struct lem
24530 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
24540 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
24550 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
24560 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e 65 78   *ap, *ap2, *nex
24570 74 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  tap;.  struct ru
24580 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72  le *rp, *rp2, *r
24590 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73  best;.  int nbes
245a0 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t, n;.  int i;. 
245b0 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61 72   int usesWildcar
245c0 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d;..  for(i=0; i
245d0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
245e0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
245f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
24600 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20      nbest = 0;. 
24610 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20 20     rbest = 0;.  
24620 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d    usesWildcard =
24630 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d   0;..    for(ap=
24640 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
24650 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
24660 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53   if( ap->type==S
24670 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d  HIFT && ap->sp==
24680 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29  lemp->wildcard )
24690 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57 69  {.        usesWi
246a0 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20 20  ldcard = 1;.    
246b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
246c0 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29  ->type!=REDUCE )
246d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
246e0 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a   rp = ap->x.rp;.
246f0 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
24700 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e 75  sStart ) continu
24710 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d  e;.      if( rp=
24720 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
24730 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  e;.      n = 1;.
24740 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70        for(ap2=ap
24750 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32  ->next; ap2; ap2
24760 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =ap2->next){.   
24770 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79       if( ap2->ty
24780 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
24790 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72  tinue;.        r
247a0 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a  p2 = ap2->x.rp;.
247b0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
247c0 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
247d0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
247e0 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20  p2==rp ) n++;.  
247f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24800 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20  n>nbest ){.     
24810 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20     nbest = n;.  
24820 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70        rbest = rp
24830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24840 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d  .    /* Do not m
24850 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66  ake a default if
24860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
24870 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a  ules to default.
24880 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74      ** is not at
24890 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20 74   least 1 or if t
248a0 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
248b0 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a  n is a possible.
248c0 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64      ** lookahead
248d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
248e0 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73   nbest<1 || uses
248f0 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69  Wildcard ) conti
24900 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f  nue;...    /* Co
24910 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52  mbine matching R
24920 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e  EDUCE actions in
24930 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61  to a single defa
24940 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61  ult */.    for(a
24950 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
24960 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
24970 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
24980 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
24990 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65  .rp==rbest ) bre
249a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
249b0 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20  sert( ap );.    
249c0 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ap->sp = Symbol_
249d0 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29  new("{default}")
249e0 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d  ;.    for(ap=ap-
249f0 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70  >next; ap; ap=ap
24a00 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
24a10 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
24a20 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
24a30 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70  =rbest ) ap->typ
24a40 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20  e = NOT_USED;.  
24a50 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20    }.    stp->ap 
24a60 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74  = Action_sort(st
24a70 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66 6f 72  p->ap);..    for
24a80 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
24a90 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
24aa0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
24ab0 65 3d 3d 53 48 49 46 54 20 29 20 62 72 65 61 6b  e==SHIFT ) break
24ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  ;.      if( ap->
24ad0 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
24ae0 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73 74 20  ap->x.rp!=rbest 
24af0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
24b00 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29 7b 0a     if( ap==0 ){.
24b10 20 20 20 20 20 20 73 74 70 2d 3e 61 75 74 6f 52        stp->autoR
24b20 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  educe = 1;.     
24b30 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63   stp->pDfltReduc
24b40 65 20 3d 20 72 62 65 73 74 3b 0a 20 20 20 20 7d  e = rbest;.    }
24b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
24b60 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20 6f 76  a second pass ov
24b70 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e  er all states an
24b80 64 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 76  d actions.  Conv
24b90 65 72 74 0a 20 20 2a 2a 20 65 76 65 72 79 20 61  ert.  ** every a
24ba0 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20  ction that is a 
24bb0 53 48 49 46 54 20 74 6f 20 61 6e 20 61 75 74 6f  SHIFT to an auto
24bc0 52 65 64 75 63 65 20 73 74 61 74 65 20 69 6e 74  Reduce state int
24bd0 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46 54 52 45  o.  ** a SHIFTRE
24be0 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20 20 2a  DUCE action..  *
24bf0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
24c00 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
24c10 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
24c20 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
24c30 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
24c40 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
24c50 74 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  t){.      struct
24c60 20 73 74 61 74 65 20 2a 70 4e 65 78 74 53 74 61   state *pNextSta
24c70 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  te;.      if( ap
24c80 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 20 29 20  ->type!=SHIFT ) 
24c90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24ca0 70 4e 65 78 74 53 74 61 74 65 20 3d 20 61 70 2d  pNextState = ap-
24cb0 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 69 66  >x.stp;.      if
24cc0 28 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 61 75  ( pNextState->au
24cd0 74 6f 52 65 64 75 63 65 20 26 26 20 70 4e 65 78  toReduce && pNex
24ce0 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64  tState->pDfltRed
24cf0 75 63 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  uce!=0 ){.      
24d00 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 53 48 49    ap->type = SHI
24d10 46 54 52 45 44 55 43 45 3b 0a 20 20 20 20 20 20  FTREDUCE;.      
24d20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70 4e 65    ap->x.rp = pNe
24d30 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65  xtState->pDfltRe
24d40 64 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  duce;.      }.  
24d50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
24d60 20 61 20 53 48 49 46 54 52 45 44 55 43 45 20 61   a SHIFTREDUCE a
24d70 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 73 20  ction specifies 
24d80 61 20 72 75 6c 65 20 74 68 61 74 20 68 61 73 20  a rule that has 
24d90 61 20 73 69 6e 67 6c 65 20 52 48 53 20 74 65 72  a single RHS ter
24da0 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69 6e 67 20  m.  ** (meaning 
24db0 74 68 61 74 20 74 68 65 20 53 48 49 46 54 52 45  that the SHIFTRE
24dc0 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e 64 20 62  DUCE will land b
24dd0 61 63 6b 20 69 6e 20 74 68 65 20 73 74 61 74 65  ack in the state
24de0 20 77 68 65 72 65 20 69 74 0a 20 20 2a 2a 20 73   where it.  ** s
24df0 74 61 72 74 65 64 29 20 61 6e 64 20 69 66 20 74  tarted) and if t
24e00 68 65 72 65 20 69 73 20 6e 6f 20 43 2d 63 6f 64  here is no C-cod
24e10 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
24e20 68 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  h the reduce act
24e30 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ion,.  ** then w
24e40 65 20 63 61 6e 20 67 6f 20 61 68 65 61 64 20 61  e can go ahead a
24e50 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 61  nd convert the a
24e60 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
24e70 73 61 6d 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  same as the.  **
24e80 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
24e90 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  RHS of the rule.
24ea0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
24eb0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
24ec0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
24ed0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
24ee0 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
24ef0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 6e 65 78  ->ap; ap; ap=nex
24f00 74 61 70 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  tap){.      next
24f10 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74 3b 0a 20  ap = ap->next;. 
24f20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
24f30 65 21 3d 53 48 49 46 54 52 45 44 55 43 45 20 29  e!=SHIFTREDUCE )
24f40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24f50 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a   rp = ap->x.rp;.
24f60 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f        if( rp->no
24f70 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Code==0 ) contin
24f80 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  ue;.      if( rp
24f90 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63 6f 6e 74  ->nrhs!=1 ) cont
24fa0 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20 20 20 20  inue;.#if 1.    
24fb0 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70 6c 79 20    /* Only apply 
24fc0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
24fd0 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  n to non-termina
24fe0 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64 20 62 65  ls.  It would be
24ff0 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   OK to.      ** 
25000 61 70 70 6c 79 20 69 74 20 74 6f 20 74 65 72 6d  apply it to term
25010 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 74 6f 6f  inal symbols too
25020 2c 20 62 75 74 20 74 68 61 74 20 6d 61 6b 65 73  , but that makes
25030 20 74 68 65 20 70 61 72 73 65 72 20 74 61 62 6c   the parser tabl
25040 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  es.      ** larg
25050 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
25060 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
25070 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
25080 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69   continue;.#endi
25090 66 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  f.      /* If we
250a0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
250b0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  t, it means the 
250c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
250d0 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20   be applied */. 
250e0 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20 61 70       nextap = ap
250f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
25100 73 74 70 2d 3e 61 70 3b 20 61 70 32 20 26 26 20  stp->ap; ap2 && 
25110 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61 70 32 2d  (ap2==ap || ap2-
25120 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29 3b 20 61  >sp!=rp->lhs); a
25130 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 7d 0a  p2=ap2->next){}.
25140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
25150 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 70  2!=0 );.      ap
25160 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32 2d 3e 73  ->spOpt = ap2->s
25170 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e 74 79 70  p;.      ap->typ
25180 65 20 3d 20 61 70 32 2d 3e 74 79 70 65 3b 0a 20  e = ap2->type;. 
25190 20 20 20 20 20 61 70 2d 3e 78 20 3d 20 61 70 32       ap->x = ap2
251a0 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ->x;.    }.  }.}
251b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
251c0 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
251d0 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
251e0 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
251f0 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
25200 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
25210 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
25220 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
25230 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
25240 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
25250 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
25260 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
25270 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
25280 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
25290 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
252a0 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
252b0 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
252c0 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
252d0 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  c
252e0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
252f0 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
25300 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
25310 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
25320 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
25330 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
25340 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
25350 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
25360 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
25370 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
25380 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
25390 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
253a0 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
253b0 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73  .      n = pB->s
253c0 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74  tatenum - pA->st
253d0 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  atenum;.    }.  
253e0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30  }.  assert( n!=0
253f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   );.  return n;.
25400 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
25410 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
25420 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
25430 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
25440 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
25450 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
25460 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
25470 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
25480 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
25490 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63  sortStates(struc
254a0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
254b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
254c0 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
254d0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
254e0 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
254f0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
25500 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
25510 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
25520 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
25530 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
25540 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
25550 66 6c 74 52 65 64 75 63 65 20 3d 20 2d 31 3b 20  fltReduce = -1; 
25560 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74  /* Init dflt act
25570 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65  ion to "syntax e
25580 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70  rror" */.    stp
25590 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
255a0 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
255b0 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
255c0 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
255d0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
255e0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
255f0 20 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20    int iAction = 
25600 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
25610 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69  emp,ap);.      i
25620 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b  f( iAction>=0 ){
25630 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
25640 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
25650 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
25660 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b          stp->nTk
25670 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nAct++;.        
25680 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70  }else if( ap->sp
25690 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73  ->index<lemp->ns
256a0 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ymbol ){.       
256b0 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b     stp->nNtAct++
256c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
256d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
256e0 74 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75  t( stp->autoRedu
256f0 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44  ce==0 || stp->pD
25700 66 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78  fltReduce==ap->x
25710 2e 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20  .rp );.         
25720 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
25730 65 20 3d 20 69 41 63 74 69 6f 6e 3b 0a 20 20 20  e = iAction;.   
25740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25750 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74     }.  }.  qsort
25760 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31  (&lemp->sorted[1
25770 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d  ], lemp->nstate-
25780 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e  1, sizeof(lemp->
25790 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20  sorted[0]),.    
257a0 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74 43      stateResortC
257b0 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69  ompare);.  for(i
257c0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
257d0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  te; i++){.    le
257e0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73  mp->sorted[i]->s
257f0 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d  tatenum = i;.  }
25800 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  .  lemp->nxstate
25810 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
25820 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d 70 2d 3e  .  while( lemp->
25830 6e 78 73 74 61 74 65 3e 31 20 26 26 20 6c 65 6d  nxstate>1 && lem
25840 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e  p->sorted[lemp->
25850 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61 75 74 6f  nxstate-1]->auto
25860 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20 6c 65  Reduce ){.    le
25870 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b 0a 20  mp->nxstate--;. 
25880 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
25890 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
258a0 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20  he file "set.c" 
258b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
258c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
258d0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ****/./*.** Set 
258e0 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75  manipulation rou
258f0 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tines for the LE
25900 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
25910 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ator..*/..static
25920 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a   int size = 0;..
25930 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73  /* Set the set s
25940 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53  ize */.void SetS
25950 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73  ize(int n).{.  s
25960 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a  ize = n+1;.}../*
25970 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
25980 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74  set */.char *Set
25990 4e 65 77 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  New(void){.  cha
259a0 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61  r *s;.  s = (cha
259b0 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c  r*)calloc( size,
259c0 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20   1);.  if( s==0 
259d0 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  ){.    memory_er
259e0 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
259f0 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61  urn s;.}../* Dea
25a00 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
25a10 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28 63 68  .void SetFree(ch
25a20 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28  ar *s).{.  free(
25a30 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  s);.}../* Add a 
25a40 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
25a50 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  he set.  Return 
25a60 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d  TRUE if the elem
25a70 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a  ent was added.**
25a80 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74   and FALSE if it
25a90 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65   was already the
25aa0 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  re. */.int SetAd
25ab0 64 28 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65  d(char *s, int e
25ac0 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20  ).{.  int rv;.  
25ad0 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20  assert( e>=0 && 
25ae0 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d  e<size );.  rv =
25af0 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20   s[e];.  s[e] = 
25b00 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b  1;.  return !rv;
25b10 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79  .}../* Add every
25b20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74   element of s2 t
25b30 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52  o s1.  Return TR
25b40 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73  UE if s1 changes
25b50 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f  . */.int SetUnio
25b60 6e 28 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72  n(char *s1, char
25b70 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c   *s2).{.  int i,
25b80 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f   progress;.  pro
25b90 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72  gress = 0;.  for
25ba0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
25bb0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69  +){.    if( s2[i
25bc0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
25bd0 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d  .    if( s1[i]==
25be0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72  0 ){.      progr
25bf0 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  ess = 1;.      s
25c00 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  1[i] = 1;.    }.
25c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f    }.  return pro
25c20 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  gress;.}./******
25c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c40 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
25c50 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  table.c" *******
25c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c70 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
25c80 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
25c90 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
25ca0 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
25cb0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
25cc0 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
25cd0 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
25ce0 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
25cf0 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
25d00 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
25d10 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
25d20 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
25d30 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
25d40 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
25d50 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
25d60 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
25d70 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
25d80 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
25d90 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
25da0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
25db0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
25dc0 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54  ator..*/..PRIVAT
25dd0 45 20 75 6e 73 69 67 6e 65 64 20 73 74 72 68 61  E unsigned strha
25de0 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  sh(const char *x
25df0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
25e00 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
25e10 78 20 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a  x ) h = h*13 + *
25e20 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x++);.  return 
25e30 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c  h;.}../* Works l
25e40 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74  ike strdup, sort
25e50 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72   of.  Save a str
25e60 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20  ing in malloced 
25e70 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b  memory, but.** k
25e80 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61  eep strings in a
25e90 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74   table so that t
25ea0 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69  he same string i
25eb0 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a  s not in more.**
25ec0 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e   than one place.
25ed0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
25ee0 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68  Strsafe(const ch
25ef0 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74  ar *y).{.  const
25f00 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
25f10 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d   *cpy;..  if( y=
25f20 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
25f30 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
25f40 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
25f50 20 26 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a   && (cpy=(char *
25f60 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
25f70 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20  rlen(y)+1 ))!=0 
25f80 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  ){.    lemon_str
25f90 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20  cpy(cpy,y);.    
25fa0 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72  z = cpy;.    Str
25fb0 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a  safe_insert(z);.
25fc0 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63    }.  MemoryChec
25fd0 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  k(z);.  return z
25fe0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
25ff0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
26000 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
26010 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
26020 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
26030 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
26040 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x1"..*/.struct s
26050 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x1 {.  int size
26060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26070 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
26080 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
26090 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260b0 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
260c0 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
260d0 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
26100 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
26110 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
26120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26130 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
26140 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
26150 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c  ct s_x1node *tbl
26160 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
26170 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
26180 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
26190 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
261a0 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
261b0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
261c0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
261d0 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
261e0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
261f0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
26200 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
26210 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
26220 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
26230 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a  ruct s_x1node {.
26240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61    const char *da
26250 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ta;        /* Th
26260 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
26270 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78  ct s_x1node *nex
26280 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
26290 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
262a0 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
262b0 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x1node **fro
262c0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
262d0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65  link */.} x1node
262e0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
262f0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
26300 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
26310 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
26320 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
26330 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61  struct s_x1 *x1a
26340 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
26350 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
26360 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
26370 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64  trsafe_init(void
26380 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72  ){.  if( x1a ) r
26390 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28  eturn;.  x1a = (
263a0 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c  struct s_x1*)mal
263b0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
263c0 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66  ct s_x1) );.  if
263d0 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61  ( x1a ){.    x1a
263e0 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  ->size = 1024;. 
263f0 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20     x1a->count = 
26400 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20  0;.    x1a->tbl 
26410 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x1node*)callo
26420 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78  c(1024, sizeof(x
26430 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
26440 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
26450 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x1a->tbl==0 )
26460 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61  {.      free(x1a
26470 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30  );.      x1a = 0
26480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26490 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
264a0 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64  x1a->ht = (x1nod
264b0 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31  e**)&(x1a->tbl[1
264c0 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  024]);.      for
264d0 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b  (i=0; i<1024; i+
264e0 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x1a->ht[i] = 
264f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
26500 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
26510 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
26520 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
26530 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
26540 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
26550 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
26560 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
26570 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73  tten */.int Strs
26580 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
26590 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20   char *data).{. 
265a0 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x1node *np;.  u
265b0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
265c0 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
265d0 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
265e0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
265f0 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
26600 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
26610 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
26620 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
26630 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
26640 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  rcmp(np->data,da
26650 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
26660 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
26670 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
26680 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
26690 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
266a0 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
266b0 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
266c0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
266d0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
266e0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
266f0 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f   }.  if( x1a->co
26700 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29  unt>=x1a->size )
26710 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
26720 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
26730 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
26740 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
26750 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
26760 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  1 array;.    arr
26770 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
26780 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b  e = x1a->size*2;
26790 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
267a0 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x1a->count;. 
267b0 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
267c0 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x1node*)calloc(a
267d0 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
267e0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
267f0 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
26800 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
26810 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
26820 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
26830 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
26840 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31    array.ht = (x1
26850 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
26860 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
26870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
26880 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
26890 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
268a0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e  for(i=0; i<x1a->
268b0 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
268c0 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x1node *oldnp
268d0 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
268e0 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  oldnp = &(x1a->t
268f0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
26900 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
26910 3e 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a  >data) & (arrSiz
26920 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
26930 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
26940 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
26950 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
26960 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
26970 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
26980 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
26990 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
269a0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
269b0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
269c0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
269d0 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
269e0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
269f0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
26a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
26a10 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
26a20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
26a30 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
26a40 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
26a50 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
26a60 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
26a70 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
26a80 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
26a90 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
26aa0 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
26ab0 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
26ac0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
26ad0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
26ae0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
26af0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
26b00 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
26b10 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
26b20 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
26b30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
26b40 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
26b50 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
26b60 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
26b70 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
26b80 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
26b90 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
26ba0 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  char *key).{.  u
26bb0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e  nsigned h;.  x1n
26bc0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
26bd0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
26be0 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
26bf0 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
26c00 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
26c10 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
26c20 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
26c30 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
26c40 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
26c50 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
26c60 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
26c70 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
26c80 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
26c90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
26ca0 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
26cb0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
26cc0 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
26cd0 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
26ce0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
26cf0 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
26d00 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
26d10 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
26d20 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
26d30 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72  char *x).{.  str
26d40 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
26d50 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  .  sp = Symbol_f
26d60 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70  ind(x);.  if( sp
26d70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  ==0 ){.    sp = 
26d80 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
26d90 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
26da0 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29  f(struct symbol)
26db0 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   );.    MemoryCh
26dc0 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d  eck(sp);.    sp-
26dd0 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28  >name = Strsafe(
26de0 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65  x);.    sp->type
26df0 20 3d 20 49 53 55 50 50 45 52 28 2a 78 29 20 3f   = ISUPPER(*x) ?
26e00 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54   TERMINAL : NONT
26e10 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d  ERMINAL;.    sp-
26e20 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73  >rule = 0;.    s
26e30 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
26e40 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20  .    sp->prec = 
26e50 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f  -1;.    sp->asso
26e60 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d  c = UNK;.    sp-
26e70 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20  >firstset = 0;. 
26e80 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20     sp->lambda = 
26e90 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20  LEMON_FALSE;.   
26ea0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
26eb0 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  = 0;.    sp->des
26ec0 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20  tLineno = 0;.   
26ed0 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20   sp->datatype = 
26ee0 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e  0;.    sp->useCn
26ef0 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f  t = 0;.    Symbo
26f00 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e  l_insert(sp,sp->
26f10 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d  name);.  }.  sp-
26f20 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74  >useCnt++;.  ret
26f30 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  urn sp;.}../* Co
26f40 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c  mpare two symbol
26f50 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
26f60 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
26f70 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72  negative,.** zer
26f80 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
26f90 66 20 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e  f a is less then
26fa0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
26fb0 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62  reater.** than b
26fc0 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20  ..**.** Symbols 
26fd0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
26fe0 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65  upper case lette
26ff0 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72  rs (terminals or
27000 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74   tokens).** must
27010 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d   sort before sym
27020 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
27030 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20  with lower case 
27040 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d  letters.** (non-
27050 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64  terminals).  And
27060 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73   MULTITERMINAL s
27070 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20  ymbols (created 
27080 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f  using the.** %to
27090 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74  ken_class direct
270a0 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61  ive) must sort a
270b0 74 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20  t the very end. 
270c0 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  Other than.** th
270d0 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f  at, the order do
270e0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a  es not matter..*
270f0 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70  *.** We find exp
27100 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74  erimentally that
27110 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d   leaving the sym
27120 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72  bols in their or
27130 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20  iginal.** order 
27140 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20  (the order they 
27150 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
27160 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69  grammar file) gi
27170 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c  ves the.** small
27180 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65  est parser table
27190 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
271a0 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63  int Symbolcmpp(c
271b0 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63  onst void *_a, c
271c0 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b  onst void *_b).{
271d0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
271e0 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f  symbol *a = *(co
271f0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
27200 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73  l **) _a;.  cons
27210 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
27220 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  *b = *(const str
27230 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f  uct symbol **) _
27240 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d  b;.  int i1 = a-
27250 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
27260 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61  INAL ? 3 : a->na
27270 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
27280 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d  1;.  int i2 = b-
27290 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
272a0 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61  INAL ? 3 : b->na
272b0 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
272c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d  1;.  return i1==
272d0 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20  i2 ? a->index - 
272e0 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20  b->index : i1 - 
272f0 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
27300 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
27310 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
27320 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
27330 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
27340 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
27350 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
27360 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
27370 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27380 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
27390 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
273a0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273c0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
273d0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
273e0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
27410 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
27420 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
27430 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27440 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
27450 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
27460 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
27470 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
27480 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
27490 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
274a0 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
274b0 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
274c0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
274d0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
274e0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
274f0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
27500 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
27510 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
27520 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
27530 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
27540 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
27550 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
27560 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20  l *data;     /* 
27570 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f  The data */.  co
27580 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20  nst char *key;  
27590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
275a0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
275b0 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
275c0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
275d0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
275e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
275f0 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
27600 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
27610 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
27620 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
27630 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
27640 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
27650 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
27660 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
27670 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
27680 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
27690 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
276a0 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
276b0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _init(void){.  i
276c0 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
276d0 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
276e0 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
276f0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
27700 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
27710 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
27720 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
27730 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
27740 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
27750 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20  de*)calloc(128, 
27760 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
27770 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
27780 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e  );.    if( x2a->
27790 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
277a0 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20  free(x2a);.     
277b0 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x2a = 0;.    }e
277c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
277d0 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20  ;.      x2a->ht 
277e0 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32  = (x2node**)&(x2
277f0 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
27800 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
27810 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74  28; i++) x2a->ht
27820 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
27830 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
27840 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
27850 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
27860 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
27870 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
27880 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
27890 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
278a0 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
278b0 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
278c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
278d0 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ata, const char 
278e0 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65  *key).{.  x2node
278f0 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
27900 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
27910 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
27920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
27930 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
27940 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
27950 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
27960 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
27970 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
27980 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
27990 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
279a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
279b0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
279c0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
279d0 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
279e0 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
279f0 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
27a00 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
27a10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
27a20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
27a30 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
27a40 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
27a50 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
27a60 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
27a70 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
27a80 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
27a90 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
27aa0 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20  ct s_x2 array;. 
27ab0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
27ac0 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73  arrSize = x2a->s
27ad0 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
27ae0 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f  .count = x2a->co
27af0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
27b00 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61  bl = (x2node*)ca
27b10 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
27b20 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
27b30 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b  izeof(x2node*));
27b40 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
27b50 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
27b60 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
27b70 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
27b80 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
27b90 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
27ba0 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
27bb0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
27bc0 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
27bd0 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
27be0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27bf0 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x2a->count; i++
27c00 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20  ){.      x2node 
27c10 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
27c20 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
27c30 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x2a->tbl[i]);.  
27c40 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
27c50 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61  oldnp->key) & (a
27c60 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
27c70 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
27c80 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
27c90 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
27ca0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
27cb0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
27cc0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
27cd0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
27ce0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
27cf0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
27d00 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
27d10 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
27d20 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
27d30 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
27d40 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
27d50 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
27d60 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
27d70 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
27d80 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
27d90 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
27da0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
27db0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
27dc0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
27dd0 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
27de0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
27df0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
27e00 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
27e10 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
27e20 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
27e30 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
27e40 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
27e50 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
27e60 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
27e70 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
27e80 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
27e90 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
27ea0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
27eb0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
27ec0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
27ed0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
27ee0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
27ef0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
27f00 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
27f10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79  (const char *key
27f20 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
27f30 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x2node *np;.
27f40 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
27f50 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
27f60 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28  strhash(key) & (
27f70 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
27f80 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
27f90 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
27fa0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
27fb0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
27fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
27fd0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
27fe0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
27ff0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
28000 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68   Return the n-th
28010 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e   data.  Return N
28020 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20  ULL if n is out 
28030 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72  of range. */.str
28040 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
28050 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a  ol_Nth(int n).{.
28060 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
28070 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61  *data;.  if( x2a
28080 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32   && n>0 && n<=x2
28090 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  a->count ){.    
280a0 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  data = x2a->tbl[
280b0 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c  n-1].data;.  }el
280c0 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30  se{.    data = 0
280d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
280e0 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  ata;.}../* Retur
280f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
28100 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53  e array */.int S
28110 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a  ymbol_count().{.
28120 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78    return x2a ? x
28130 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d  2a->count : 0;.}
28140 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
28150 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
28160 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
28170 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
28180 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
28190 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
281a0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
281b0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
281c0 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
281d0 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
281e0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
281f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
28200 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  bol_arrayof().{.
28210 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
28220 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
28230 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  ,arrSize;.  if( 
28240 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
28250 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78  0;.  arrSize = x
28260 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  2a->count;.  arr
28270 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ay = (struct sym
28280 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72  bol **)calloc(ar
28290 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  rSize, sizeof(st
282a0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b  ruct symbol *));
282b0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
282c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
282d0 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
282e0 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c  ay[i] = x2a->tbl
282f0 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
28300 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
28310 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
28320 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
28330 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  /.int Configcmp(
28340 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63  const char *_a,c
28350 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b  onst char *_b).{
28360 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
28370 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72  config *a = (str
28380 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61  uct config *) _a
28390 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
283a0 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74   config *b = (st
283b0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f  ruct config *) _
283c0 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20  b;.  int x;.  x 
283d0 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
283e0 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
283f0 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
28400 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
28410 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a  .  return x;.}..
28420 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
28430 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45  tates */.PRIVATE
28440 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74   int statecmp(st
28450 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20  ruct config *a, 
28460 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
28470 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ).{.  int rc;.  
28480 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20  for(rc=0; rc==0 
28490 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d  && a && b;  a=a-
284a0 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20  >bp, b=b->bp){. 
284b0 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69     rc = a->rp->i
284c0 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
284d0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  dex;.    if( rc=
284e0 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74  =0 ) rc = a->dot
284f0 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20   - b->dot;.  }. 
28500 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
28510 20 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31    if( a ) rc = 1
28520 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63  ;.    if( b ) rc
28530 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
28540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61  urn rc;.}../* Ha
28550 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52  sh a state */.PR
28560 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73  IVATE unsigned s
28570 74 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20  tatehash(struct 
28580 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75  config *a).{.  u
28590 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77  nsigned h=0;.  w
285a0 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68  hile( a ){.    h
285b0 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
285c0 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
285d0 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e  dot;.    a = a->
285e0 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  bp;.  }.  return
285f0 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61   h;.}../* Alloca
28600 74 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73  te a new state s
28610 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75  tructure */.stru
28620 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
28630 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  new().{.  struct
28640 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65   state *newstate
28650 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28  ;.  newstate = (
28660 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63  struct state *)c
28670 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28  alloc(1, sizeof(
28680 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
28690 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
286a0 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75  ewstate);.  retu
286b0 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a  rn newstate;.}..
286c0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
286d0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
286e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
286f0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
28700 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
28710 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
28720 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b  */.struct s_x3 {
28730 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
28740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28750 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
28760 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
28790 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
287a0 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
287b0 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
287e0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28800 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
28810 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
28820 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
28830 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x3node *tbl;  /*
28840 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
28850 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
28860 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x3node **ht;
28870 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
28880 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
28890 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
288a0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
288b0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
288c0 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
288d0 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
288e0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
288f0 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
28900 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
28910 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x3node {.  str
28920 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
28950 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
28960 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
28970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28980 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
28990 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x3node *next; 
289a0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
289b0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
289c0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
289d0 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x3node **from; 
289e0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
289f0 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a  k */.} x3node;..
28a00 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
28a10 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
28a20 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
28a30 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
28a40 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
28a50 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a  uct s_x3 *x3a;..
28a60 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
28a70 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
28a80 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74  ray */.void Stat
28a90 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  e_init(void){.  
28aa0 69 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e  if( x3a ) return
28ab0 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63  ;.  x3a = (struc
28ac0 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x3*)malloc( 
28ad0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
28ae0 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61  x3) );.  if( x3a
28af0 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a   ){.    x3a->siz
28b00 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61  e = 128;.    x3a
28b10 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
28b20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e   x3a->tbl = (x3n
28b30 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c  ode*)calloc(128,
28b40 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20   sizeof(x3node) 
28b50 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
28b60 29 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d  ));.    if( x3a-
28b70 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
28b80 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20   free(x3a);.    
28b90 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x3a = 0;.    }
28ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
28bb0 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74  i;.      x3a->ht
28bc0 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78   = (x3node**)&(x
28bd0 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20  3a->tbl[128]);. 
28be0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
28bf0 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68  128; i++) x3a->h
28c00 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
28c10 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
28c20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
28c30 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
28c40 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
28c50 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
28c60 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
28c70 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
28c80 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
28c90 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
28ca0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
28cb0 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ta, struct confi
28cc0 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f  g *key).{.  x3no
28cd0 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
28ce0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
28cf0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d   ph;..  if( x3a=
28d00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
28d10 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28   ph = statehash(
28d20 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
28d30 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
28d40 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
28d50 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
28d60 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
28d70 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
28d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
28d90 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
28da0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
28db0 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
28dc0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
28dd0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
28de0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
28df0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
28e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
28e10 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
28e20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e   if( x3a->count>
28e30 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x3a->size ){.  
28e40 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
28e50 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
28e60 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
28e70 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
28e80 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72    struct s_x3 ar
28e90 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
28ea0 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20  ize = arrSize = 
28eb0 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x3a->size*2;.   
28ec0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
28ed0 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  3a->count;.    a
28ee0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f  rray.tbl = (x3no
28ef0 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69  de*)calloc(arrSi
28f00 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ze, sizeof(x3nod
28f10 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
28f20 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61  de*));.    if( a
28f30 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
28f40 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
28f50 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
28f60 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
28f70 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65  ray.ht = (x3node
28f80 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61  **)&(array.tbl[a
28f90 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  rrSize]);.    fo
28fa0 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
28fb0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
28fc0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
28fd0 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e  i=0; i<x3a->coun
28fe0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
28ff0 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  3node *oldnp, *n
29000 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
29010 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69  p = &(x3a->tbl[i
29020 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
29030 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  atehash(oldnp->k
29040 65 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ey) & (arrSize-1
29050 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
29060 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
29070 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
29080 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
29090 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
290a0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
290b0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
290c0 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
290d0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
290e0 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
290f0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
29100 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
29110 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
29120 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
29130 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
29140 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
29150 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61    }.    free(x3a
29160 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61  ->tbl);.    *x3a
29170 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
29180 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
29190 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
291a0 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
291b0 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61  1);.  np = &(x3a
291c0 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74  ->tbl[x3a->count
291d0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
291e0 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
291f0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
29200 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61  x3a->ht[h] ) x3a
29210 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
29220 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
29230 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68  p->next = x3a->h
29240 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b  t[h];.  x3a->ht[
29250 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
29260 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b  rom = &(x3a->ht[
29270 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
29280 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
29290 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
292a0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
292b0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
292c0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
292d0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
292e0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
292f0 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f  e_find(struct co
29300 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  nfig *key).{.  u
29310 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e  nsigned h;.  x3n
29320 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
29330 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
29340 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61  0;.  h = stateha
29350 73 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e  sh(key) & (x3a->
29360 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
29370 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
29380 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
29390 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
293a0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
293b0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
293c0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
293d0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
293e0 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
293f0 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
29400 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
29410 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
29420 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
29430 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
29440 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
29450 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
29460 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
29470 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
29480 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
29490 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
294a0 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
294b0 6f 66 28 76 6f 69 64 29 0a 7b 0a 20 20 73 74 72  of(void).{.  str
294c0 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
294d0 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69  y;.  int i,arrSi
294e0 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  ze;.  if( x3a==0
294f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
29500 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f  rrSize = x3a->co
29510 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
29520 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29  struct state **)
29530 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
29540 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
29550 61 74 65 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  ate *));.  if( a
29560 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
29570 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
29580 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20  i++) array[i] = 
29590 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x3a->tbl[i].data
295a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
295b0 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  rray;.}../* Hash
295c0 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
295d0 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69   */.PRIVATE unsi
295e0 67 6e 65 64 20 63 6f 6e 66 69 67 68 61 73 68 28  gned confighash(
295f0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
29600 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
29610 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
29620 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
29630 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
29640 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
29650 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
29660 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
29670 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
29680 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
29690 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
296a0 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
296b0 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
296c0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
296d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
296e0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
296f0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
29720 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
29730 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
29740 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
29750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
29760 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
29770 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
29780 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29790 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
297a0 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
297b0 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
297c0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
297d0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
297e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
297f0 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
29800 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
29810 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
29820 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
29830 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
29840 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
29850 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
29860 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
29870 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
29880 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
29890 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
298a0 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
298b0 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298d0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
298e0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
298f0 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
29900 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
29910 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
29920 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
29930 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
29940 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
29950 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
29960 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
29970 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
29980 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
29990 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
299a0 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
299b0 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
299c0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
299d0 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
299e0 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
299f0 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  it(void){.  if( 
29a00 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
29a10 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
29a20 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
29a30 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
29a40 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
29a50 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
29a60 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
29a70 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
29a80 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
29a90 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f  calloc(64, sizeo
29aa0 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
29ab0 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
29ac0 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
29ad0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
29ae0 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
29af0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29b00 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29b10 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
29b20 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
29b30 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
29b40 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
29b50 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
29b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
29b70 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
29b80 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
29b90 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
29ba0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
29bb0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
29bc0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
29bd0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
29be0 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
29bf0 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74  gtable_insert(st
29c00 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
29c10 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a).{.  x4node *n
29c20 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
29c30 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
29c40 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
29c50 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
29c60 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
29c70 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
29c80 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
29c90 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
29ca0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
29cb0 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
29cc0 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
29cd0 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20  np->data,(const 
29ce0 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30  char *) data)==0
29cf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
29d00 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
29d10 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
29d20 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
29d30 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
29d40 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
29d50 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
29d60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
29d70 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
29d80 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
29d90 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
29da0 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
29db0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
29dc0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
29dd0 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
29de0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
29df0 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61  struct s_x4 arra
29e00 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
29e10 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 34  e = arrSize = x4
29e20 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
29e30 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
29e40 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
29e50 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
29e60 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
29e70 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29  , sizeof(x4node)
29e80 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
29e90 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
29ea0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
29eb0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
29ec0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
29ed0 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
29ee0 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  y.ht = (x4node**
29ef0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
29f00 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
29f10 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
29f20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
29f30 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
29f40 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
29f50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
29f60 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
29f70 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
29f80 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
29f90 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
29fa0 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
29fb0 74 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ta) & (arrSize-1
29fc0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
29fd0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
29fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
29ff0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
2a000 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
2a010 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
2a020 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
2a030 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
2a040 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
2a050 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
2a060 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
2a070 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
2a080 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
2a090 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
2a0a0 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
2a0b0 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
2a0c0 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
2a0d0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
2a0e0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
2a0f0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
2a100 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
2a110 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
2a120 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
2a130 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
2a140 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
2a150 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
2a160 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
2a170 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
2a180 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
2a190 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
2a1a0 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
2a1b0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
2a1c0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
2a1d0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
2a1e0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
2a1f0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
2a200 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
2a210 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
2a220 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
2a230 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
2a240 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
2a250 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
2a260 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
2a270 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
2a280 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
2a290 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
2a2a0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
2a2b0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
2a2c0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
2a2d0 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
2a2e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
2a2f0 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
2a300 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29  har *) key)==0 )
2a310 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
2a320 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
2a330 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
2a340 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
2a350 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
2a360 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
2a370 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
2a380 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
2a390 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
2a3a0 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
2a3b0 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
2a3c0 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
2a3d0 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
2a3e0 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
2a3f0 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  f)(struct config
2a400 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *)).{.  int i;.
2a410 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
2a420 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
2a430 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
2a440 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
2a450 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
2a460 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
2a470 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
2a480 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
2a490 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
2a4a0 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
2a4b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
2a4c0 0a                                               .