/ Hex Artifact Content
Login

Artifact 56eb42d92187547c58646482a49686e114eb4c0e8363820c70b5134bd6bb954f:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bols */.  int mi
38c0: 6e 53 68 69 66 74 52 65 64 75 63 65 3b 20 20 20  nShiftReduce;   
38d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68     /* Minimum sh
38e0: 69 66 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f  ift-reduce actio
38f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
3900: 20 65 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20   errAction;     
3910: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61        /* Error a
3920: 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  ction value */. 
3930: 20 69 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20   int accAction; 
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
3950: 65 70 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65  ept action value
3960: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69   */.  int noActi
3970: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  on;            /
3980: 2a 20 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76  * No-op action v
3990: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  alue */.  int mi
39a0: 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  nReduce;        
39b0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65     /* Minimum re
39c0: 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
39d0: 20 69 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20   int maxAction; 
39e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
39f0: 69 6d 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75  imum action valu
3a00: 65 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  e of any kind */
3a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3a20: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
3a30: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
3a40: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
3a50: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
3a60: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
3a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
3a80: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
3a90: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
3aa0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
3ab0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
3ac0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
3ad0: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
3ae0: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
3af0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
3b00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3b10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
3b30: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b50: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
3b60: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
3b70: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
3b80: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
3b90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
3ba0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
3bb0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
3bc0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
3bd0: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3bf0: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
3c00: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
3c10: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
3c20: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
3c30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c40: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
3c50: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
3c60: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
3c70: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
3c80: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
3c90: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
3ca0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
3cb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3cc0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
3cd0: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
3ce0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
3cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3d00: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3d10: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
3d20: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
3d30: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
3d40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3d50: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
3d60: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
3d70: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3d90: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3da0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
3db0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
3dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3dd0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3de0: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
3df0: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
3e00: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
3e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
3e20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
3e30: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
3e40: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
3e50: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
3e60: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
3e70: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
3e80: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
3e90: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
3ea0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
3eb0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
3ec0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
3ed0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
3ee0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3ef0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
3f10: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3f30: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3f40: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
3f50: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
3f60: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
3f70: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
3f80: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
3f90: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
3fa0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fc0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
3fd0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
3fe0: 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20 20 20  nactiontab;     
3ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4000: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4010: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
4020: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6c 6f 6f  le */.  int nloo
4030: 6b 61 68 65 61 64 74 61 62 3b 20 20 20 20 20 20  kaheadtab;      
4040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4050: 74 72 69 65 73 20 69 6e 20 79 79 5f 6c 6f 6f 6b  tries in yy_look
4060: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
4070: 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20   tablesize;     
4080: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74        /* Total t
4090: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c  able size of all
40a0: 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73   tables in bytes
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
40c0: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
40d0: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
40e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
40f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
4100: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
4110: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
4120: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
4130: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
4140: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
4150: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
4160: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
4170: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
4180: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
4190: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
41c0: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
41d0: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
41e0: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
41f0: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
4200: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
4210: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
4220: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
4240: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
4250: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
4280: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
4290: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
42a0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
42b0: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
42c0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
42d0: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
42e0: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
42f0: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
4300: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
4310: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
4320: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
4330: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
4340: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
4350: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
4360: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
4370: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
4380: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
4390: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
43a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
43b0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
43c0: 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e  or..*/./* Routin
43d0: 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  es for handling 
43e0: 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f  a strings */..co
43f0: 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
4400: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  e(const char *);
4410: 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  ..void Strsafe_i
4420: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4430: 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
4440: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e  nst char *);.con
4450: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
4460: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
4470: 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65   *);../* Routine
4480: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73  s for handling s
4490: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
44a0: 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74  ammar */..struct
44b0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
44c0: 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
44d0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  );.int Symbolcmp
44e0: 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20  p(const void *, 
44f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76  const void *);.v
4500: 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
4510: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  void);.int Symbo
4520: 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
4530: 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20  symbol *, const 
4540: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4550: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
4560: 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
4570: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4580: 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
4590: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
45a0: 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  unt(void);.struc
45b0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
45c0: 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  l_arrayof(void);
45d0: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  ../* Routines to
45e0: 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74   manage the stat
45f0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20  e table */..int 
4600: 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
4610: 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68  char *, const ch
4620: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ar *);.struct st
4630: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76  ate *State_new(v
4640: 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65  oid);.void State
4650: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4660: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
4670: 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74  ruct state *, st
4680: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
4690: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
46a0: 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
46b0: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
46c0: 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f  t state **State_
46d0: 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a  arrayof(void);..
46e0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
46f0: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
4700: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
4710: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
4720: 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
4730: 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  );.int Configtab
4740: 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  le_insert(struct
4750: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
4760: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
4770: 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
4780: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
4790: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
47a0: 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75  lear(int(*)(stru
47b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a  ct config *));..
47c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
47e0: 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "action.c" ***
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
4810: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
4820: 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61  cessing parser a
4830: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45  ctions in the LE
4840: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4850: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c  ator..*/../* All
4860: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73  ocate a new pars
4870: 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61  er action */.sta
4880: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
4890: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
48a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  id){.  static st
48b0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65  ruct action *fre
48c0: 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  elist = 0;.  str
48d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
48e0: 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72  ction;..  if( fr
48f0: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4910: 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66  amt = 100;.    f
4920: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
4930: 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f  t action *)callo
4940: 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  c(amt, sizeof(st
4950: 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20  ruct action));. 
4960: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
4970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
4980: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
4990: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
49a0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
49b0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29  parser action.")
49c0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
49d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
49e0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
49f0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
4a00: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
4a10: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
4a20: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4a30: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4a40: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  on = freelist;. 
4a50: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
4a60: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
4a70: 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  turn newaction;.
4a80: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
4a90: 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f  o actions for so
4aa0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
4ab0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
4ac0: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
4ad0: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4ae0: 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65  rst action is le
4af0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
4b00: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
4b10: 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a  an.** the first.
4b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
4b30: 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63  tioncmp(.  struc
4b40: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20  t action *ap1,. 
4b50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4b60: 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ap2.){.  int rc;
4b70: 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d  .  rc = ap1->sp-
4b80: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70  >index - ap2->sp
4b90: 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72  ->index;.  if( r
4ba0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
4bb0: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
4bc0: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
4bd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4be0: 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d  0 && (ap1->type=
4bf0: 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e  =REDUCE || ap1->
4c00: 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
4c10: 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  E) ){.    rc = a
4c20: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
4c30: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
4c40: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4c60: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
4c70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c80: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
4c90: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
4ca0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
4cb0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
4cc0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
4cd0: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
4ce0: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4cf0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
4d00: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
4d10: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
4d40: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
4d50: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
4d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
4d70: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
4d80: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
4d90: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
4da0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
4db0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
4dc0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
4dd0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
4de0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
4df0: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
4e00: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
4e10: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
4e20: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
4e30: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4e40: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
4e50: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
4e60: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e 65 77  ->sp = sp;.  new
4e70: 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20 3d 20  action->spOpt = 
4e80: 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  0;.  if( type==S
4e90: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 61  HIFT ){.    newa
4ea0: 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d 20 28  ction->x.stp = (
4eb0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 61  struct state *)a
4ec0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
4ed0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 72 70   newaction->x.rp
4ee0: 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
4ef0: 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  *)arg;.  }.}./**
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f  **** New code to
4f20: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
4f30: 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a  acttab" module *
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
4f50: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d  * This module im
4f60: 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65  plements routine
4f70: 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75  s use to constru
4f80: 63 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ct the yy_action
4f90: 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  [] table..*/../*
4fa0: 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  .** The state of
4fb0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
4fc0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4fd0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ruction is an in
4fe0: 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65  stance of.** the
4ff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5000: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5010: 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
5020: 6d 61 70 73 20 74 68 65 20 70 61 69 72 20 28 73  maps the pair (s
5030: 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f  tate_number, loo
5040: 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61 6e 0a  kahead) into an.
5050: 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  ** action_number
5060: 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  .  The table is 
5070: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
5080: 67 65 72 73 20 70 61 69 72 73 2e 20 20 54 68 65  gers pairs.  The
5090: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a   state_number.**
50a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e 20 69   determines an i
50b0: 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 69 6e  nitial offset in
50c0: 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  to the yy_action
50d0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c 6f 6f   array.  The loo
50e0: 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75 65 20  kahead.** value 
50f0: 69 73 20 74 68 65 6e 20 61 64 64 65 64 20 74 6f  is then added to
5100: 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20 6f 66   this initial of
5110: 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e 20 69  fset to get an i
5120: 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68 65 0a  ndex X into the.
5130: 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72  ** yy_action arr
5140: 61 79 2e 20 49 66 20 74 68 65 20 61 41 63 74 69  ay. If the aActi
5150: 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[X].lookahead 
5160: 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c 75 65  equals the value
5170: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20 74 68   of the.** of th
5180: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 70 75  e lookahead inpu
5190: 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
51a0: 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 5f  e of the action_
51b0: 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20 69 73  number output is
51c0: 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 61  .** aAction[X].a
51d0: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 6c  ction.  If the l
51e0: 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e 6f 74  ookaheads do not
51f0: 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68 65 0a   match then the.
5200: 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  ** default actio
5210: 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 5f  n for the state_
5220: 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
5230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63  ed..**.** All ac
5240: 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
5250: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 73   with a single s
5260: 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20  tate_number are 
5270: 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a 2a 2a  first entered.**
5280: 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65 61 64   into aLookahead
5290: 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  [] using multipl
52a0: 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  e calls to actta
52b0: 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54 68 65  b_action().  The
52c0: 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f 6e 73  n the.** actions
52d0: 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67 6c 65   for that single
52e0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
52f0: 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20 74 68  e placed into th
5300: 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a 20 61  e aAction[].** a
5310: 72 72 61 79 20 77 69 74 68 20 61 20 73 69 6e 67  rray with a sing
5320: 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61  le call to actta
5330: 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65  b_insert().  The
5340: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29   acttab_insert()
5350: 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65   call.** also re
5360: 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68  sets the aLookah
5370: 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70  ead[] array in p
5380: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74  reparation for t
5390: 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65  he next.** state
53a0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75   number..*/.stru
53b0: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
53c0: 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b  ion {.  int look
53d0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
53e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
53f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b  he lookahead tok
5400: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69  en */.  int acti
5410: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
5420: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
5430: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
5440: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d  n lookahead */.}
5450: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
5460: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
5470: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
5480: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
54b0: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
54c0: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
54d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
54e0: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
54f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
5500: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
5510: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5520: 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e  ion.    *aAction
5530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5540: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
5550: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
5560: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
5570: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
5580: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5590: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
55a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
55c0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
55d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
55e0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
55f0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
5600: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
5610: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
5620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5630: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
5640: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
5650: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5660: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
5670: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
5680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
5690: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
56a0: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
56b0: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
56c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
56d0: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
56e0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
56f0: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
5700: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
5710: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5730: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79  r of terminal sy
5740: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
5750: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
5760: 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 74 61 6c          /* total
5770: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   number of symbo
5780: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74  ls */.};../* Ret
5790: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
57a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
57b0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
57c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
57d0: 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a  ab_lookahead_siz
57e0: 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69  e(X) ((X)->nActi
57f0: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5800: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5810: 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f  ntry in yy_actio
5820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  n */.#define act
5830: 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e  tab_yyaction(X,N
5840: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5850: 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20  [N].action)../* 
5860: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
5870: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
5880: 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  yy_lookahead */.
5890: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
58a0: 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20  ylookahead(X,N) 
58b0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
58c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a  ].lookahead)../*
58d0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
58e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
58f0: 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74 61   the given actta
5900: 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  b */.void acttab
5910: 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70 29  _free(acttab *p)
5920: 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63  {.  free( p->aAc
5930: 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20  tion );.  free( 
5940: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b  p->aLookahead );
5950: 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a  .  free( p );.}.
5960: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
5970: 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63 74  ew acttab struct
5980: 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61  ure */.acttab *a
5990: 63 74 74 61 62 5f 61 6c 6c 6f 63 28 69 6e 74 20  cttab_alloc(int 
59a0: 6e 73 79 6d 62 6f 6c 2c 20 69 6e 74 20 6e 74 65  nsymbol, int nte
59b0: 72 6d 69 6e 61 6c 29 7b 0a 20 20 61 63 74 74 61  rminal){.  actta
59c0: 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62 20 2a  b *p = (acttab *
59d0: 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a  ) calloc( 1, siz
59e0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
59f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   p==0 ){.    fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
5a10: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
5a20: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
5a30: 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20 20 20   acttab.");.    
5a40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
5a50: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5a60: 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e 73  of(*p));.  p->ns
5a70: 79 6d 62 6f 6c 20 3d 20 6e 73 79 6d 62 6f 6c 3b  ymbol = nsymbol;
5a80: 0a 20 20 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  .  p->nterminal 
5a90: 3d 20 6e 74 65 72 6d 69 6e 61 6c 3b 0a 20 20 72  = nterminal;.  r
5aa0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41  eturn p;.}../* A
5ab0: 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20  dd a new action 
5ac0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
5ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
5ae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5af0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
5b00: 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61  e for each looka
5b10: 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69  head for a parti
5b20: 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a  cular.** state..
5b30: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
5b40: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
5b50: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
5b60: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
5b70: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
5b80: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
5b90: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5ba0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
5bb0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
5bc0: 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63  okahead = (struc
5bd0: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
5be0: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
5bf0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20  ->aLookahead,.  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5c20: 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  f(p->aLookahead[
5c30: 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  0])*p->nLookahea
5c40: 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66  dAlloc );.    if
5c50: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->aLookahead=
5c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
5c70: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
5c80: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
5c90: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
5ca0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
5cb0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >nLookahead==0 )
5cc0: 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61  {.    p->mxLooka
5cd0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5ce0: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ;.    p->mnLooka
5cf0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5d00: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f  ;.    p->mnActio
5d10: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65  n = action;.  }e
5d20: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
5d30: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b  mxLookahead<look
5d40: 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f  ahead ) p->mxLoo
5d50: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5d60: 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  ad;.    if( p->m
5d70: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61  nLookahead>looka
5d80: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  head ){.      p-
5d90: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
5da0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
5db0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5dc0: 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tion;.    }.  }.
5dd0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5de0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c  p->nLookahead].l
5df0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5e00: 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  head;.  p->aLook
5e10: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5e20: 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63  ead].action = ac
5e30: 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  tion;.  p->nLook
5e40: 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ahead++;.}../*.*
5e50: 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61  * Add the transa
5e60: 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20  ction set built 
5e70: 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61  up with prior ca
5e80: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
5e90: 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74  tion().** into t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5eb0: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72  n table.  Then r
5ec0: 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63  eset the transac
5ed0: 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a  tion set back.**
5ee0: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74   to an empty set
5ef0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
5f00: 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20  for a new round 
5f10: 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  of acttab_action
5f20: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () calls..**.** 
5f30: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5f40: 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f  t into the actio
5f50: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e  n table of the n
5f60: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
5f70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 6b  **.** If the mak
5f80: 65 49 74 53 61 66 65 20 70 61 72 61 6d 65 74 65  eItSafe paramete
5f90: 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  r is true, then 
5fa0: 74 68 65 20 6f 66 66 73 65 74 20 69 73 20 63 68  the offset is ch
5fb0: 6f 73 65 6e 20 73 6f 20 74 68 61 74 0a 2a 2a 20  osen so that.** 
5fc0: 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
5fd0: 20 74 6f 20 6f 76 65 72 72 65 61 64 20 74 68 65   to overread the
5fe0: 20 79 79 5f 6c 6f 6f 6b 61 73 69 64 65 5b 5d 20   yy_lookaside[] 
5ff0: 74 61 62 6c 65 20 72 65 67 61 72 64 6c 65 73 73  table regardless
6000: 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61   of.** the looka
6010: 73 69 64 65 20 74 6f 6b 65 6e 2e 20 20 54 68 69  side token.  Thi
6020: 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 74 68  s is done for th
6030: 65 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  e terminal symbo
6040: 6c 73 2c 20 61 73 20 74 68 65 79 0a 2a 2a 20 63  ls, as they.** c
6050: 6f 6d 65 20 66 72 6f 6d 20 65 78 74 65 72 6e 61  ome from externa
6060: 6c 20 69 6e 70 75 74 73 20 61 6e 64 20 63 61 6e  l inputs and can
6070: 20 63 6f 6e 74 61 69 6e 20 73 79 6e 74 61 78 20   contain syntax 
6080: 65 72 72 6f 72 73 2e 20 20 57 68 65 6e 20 6d 61  errors.  When ma
6090: 6b 65 49 74 53 61 66 65 0a 2a 2a 20 69 73 20 66  keItSafe.** is f
60a0: 61 6c 73 65 2c 20 74 68 65 72 65 20 69 73 20 6d  alse, there is m
60b0: 6f 72 65 20 66 6c 65 78 69 62 69 6c 69 74 79 20  ore flexibility 
60c0: 69 6e 20 73 65 6c 65 63 74 69 6e 67 20 6f 66 66  in selecting off
60d0: 73 65 74 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  sets, resulting 
60e0: 69 6e 0a 2a 2a 20 61 20 73 6d 61 6c 6c 65 72 20  in.** a smaller 
60f0: 74 61 62 6c 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  table.  For non-
6100: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
6110: 2c 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  , which are neve
6120: 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 2c  r syntax errors,
6130: 0a 2a 2a 20 6d 61 6b 65 49 74 53 61 66 65 20 63  .** makeItSafe c
6140: 61 6e 20 62 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  an be false..*/.
6150: 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72  int acttab_inser
6160: 74 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74  t(acttab *p, int
6170: 20 6d 61 6b 65 49 74 53 61 66 65 29 7b 0a 20 20   makeItSafe){.  
6180: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 2c 20  int i, j, k, n, 
6190: 65 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  end;.  assert( p
61a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
61b0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
61c0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
61d0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
61e0: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
61f0: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
6200: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
6210: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
6220: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
6230: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
6240: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
6250: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
6260: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
6270: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6e  .  */.  n = p->n
6280: 73 79 6d 62 6f 6c 20 2b 20 31 3b 0a 20 20 69 66  symbol + 1;.  if
6290: 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e  ( p->nAction + n
62a0: 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c   >= p->nActionAl
62b0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
62c0: 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  ldAlloc = p->nAc
62d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  tionAlloc;.    p
62e0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d  ->nActionAlloc =
62f0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20   p->nAction + n 
6300: 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  + p->nActionAllo
6310: 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61  c + 20;.    p->a
6320: 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75 63 74  Action = (struct
6330: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
6340: 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d  n *) realloc( p-
6350: 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20  >aAction,.      
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41      sizeof(p->aA
6380: 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63  ction[0])*p->nAc
6390: 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  tionAlloc);.    
63a0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d  if( p->aAction==
63b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
63c0: 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
63d0: 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
63e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64   }.    for(i=old
6400: 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74  Alloc; i<p->nAct
6410: 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a  ionAlloc; i++){.
6420: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
6430: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  [i].lookahead = 
6440: 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63  -1;.      p->aAc
6450: 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d  tion[i].action =
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   -1;.    }.  }..
6470: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78    /* Scan the ex
6480: 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61  isting action ta
6490: 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ble looking for 
64a0: 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74 20 69  an offset that i
64b0: 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61  s a.  ** duplica
64c0: 74 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  te of the curren
64d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
64e0: 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20  t.  Fall out of 
64f0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66  the loop.  ** if
6500: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75   and when the du
6510: 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64  plicate is found
6520: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73  ..  **.  ** i is
6530: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d   the index in p-
6540: 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65  >aAction[] where
6550: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6560: 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  is inserted..  *
6570: 2f 0a 20 20 65 6e 64 20 3d 20 6d 61 6b 65 49 74  /.  end = makeIt
6580: 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b  Safe ? p->mnLook
6590: 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 66 6f 72  ahead : 0;.  for
65a0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
65b0: 20 69 3e 3d 65 6e 64 3b 20 69 2d 2d 29 7b 0a 20   i>=end; i--){. 
65c0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
65d0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
65e0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
65f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c  {.      /* All l
6600: 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63  ookaheads and ac
6610: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f  tions in the aLo
6620: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
6630: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
6640: 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  ust match agains
6650: 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  t the candidate 
6660: 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79  aAction[i] entry
6670: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
6680: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74  ->aAction[i].act
6690: 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e  ion!=p->mnAction
66a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
66b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
66c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
66e0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
66f0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
6700: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
6710: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
6720: 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e  || k>=p->nAction
6730: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6740: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
6750: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6760: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6770: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61  lookahead ) brea
6780: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
6790: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
67a0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69  action!=p->aActi
67b0: 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62  on[k].action ) b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
67d0: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67e0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67f0: 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  ue;..      /* No
6800: 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68   possible lookah
6810: 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20 69  ead value that i
6820: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f  s not in the aLo
6830: 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20  okahead[].      
6840: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
6850: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  s allowed to mat
6860: 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f  ch aAction[i] */
6870: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
6880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6890: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
68a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
68b0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
68c0: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
68d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
68e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
68f0: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
6900: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
6910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6920: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
6930: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
6940: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78  break;  /* An ex
6950: 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75  act match is fou
6960: 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a  nd at offset i *
6970: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
6980: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
6990: 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73  existing offsets
69a0: 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
69b0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
69c0: 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a  action, find an.
69d0: 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66    ** an empty of
69e0: 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63 74  fset in the aAct
69f0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77  ion[] table in w
6a00: 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64 20  hich we can add 
6a10: 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68  the.  ** aLookah
6a20: 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f  ead[] transactio
6a30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c  n..  */.  if( i<
6a40: 65 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f  end ){.    /* Lo
6a50: 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20  ok for holes in 
6a60: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6a70: 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65  ble that fit the
6a80: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
6a90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
6aa0: 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65  nsaction.  Leave
6ab0: 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66   i set to the of
6ac0: 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65  fset of the hole
6ad0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68  ..    ** If no h
6ae0: 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  oles are found, 
6af0: 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e  i is left at p->
6b00: 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d  nAction, which m
6b10: 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  eans the.    ** 
6b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
6b30: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f   be appended. */
6b40: 0a 20 20 20 20 69 20 3d 20 6d 61 6b 65 49 74 53  .    i = makeItS
6b50: 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  afe ? p->mnLooka
6b60: 68 65 61 64 20 3a 20 30 3b 0a 20 20 20 20 66 6f  head : 0;.    fo
6b70: 72 28 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  r(; i<p->nAction
6b80: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
6b90: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
6ba0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6bb0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6bd0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6be0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6bf0: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6c00: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6c10: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6c20: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6c30: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6c50: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6c60: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
6c70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6c80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6c90: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
6ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6cb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6cc0: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6ce0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6cf0: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6d00: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6d10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6d30: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6d40: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
6d50: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
6d60: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d80: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
6d90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
6da0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 23 69 66   index i. */.#if
6db0: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41 63 74   0.  printf("Act
6dc0: 74 61 62 3a 22 29 3b 0a 20 20 66 6f 72 28 6a 3d  tab:");.  for(j=
6dd0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
6de0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 72  ad; j++){.    pr
6df0: 69 6e 74 66 28 22 20 25 64 22 2c 20 70 2d 3e 61  intf(" %d", p->a
6e00: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6e10: 6b 61 68 65 61 64 29 3b 0a 20 20 7d 0a 20 20 70  kahead);.  }.  p
6e20: 72 69 6e 74 66 28 22 20 69 6e 73 65 72 74 65 64  rintf(" inserted
6e30: 20 61 74 20 25 64 5c 6e 22 2c 20 69 29 3b 0a 23   at %d\n", i);.#
6e40: 65 6e 64 69 66 0a 20 20 66 6f 72 28 6a 3d 30 3b  endif.  for(j=0;
6e50: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
6e60: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
6e70: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6e80: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6e90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6ea0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6eb0: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6ec0: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6ed0: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6ee0: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 61 6b 65 49  .  }.  if( makeI
6f00: 74 53 61 66 65 20 26 26 20 69 2b 70 2d 3e 6e 74  tSafe && i+p->nt
6f10: 65 72 6d 69 6e 61 6c 3e 3d 70 2d 3e 6e 41 63 74  erminal>=p->nAct
6f20: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
6f30: 20 3d 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61   = i+p->ntermina
6f40: 6c 2b 31 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  l+1;.  p->nLooka
6f50: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
6f60: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6f70: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
6f80: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
6f90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
6fa0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
6fb0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
6fc0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
6fd0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
6fe0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
6ff0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7000: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
7010: 69 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 6f 75  ion table withou
7020: 74 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73  t the trailing s
7030: 79 6e 74 61 78 20 65 72 72 6f 72 0a 2a 2a 20 65  yntax error.** e
7040: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 61  ntries..*/.int a
7050: 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73 69 7a  cttab_action_siz
7060: 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20  e(acttab *p){.  
7070: 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 41 63 74 69  int n = p->nActi
7080: 6f 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  on;.  while( n>0
7090: 20 26 26 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6e   && p->aAction[n
70a0: 2d 31 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20  -1].lookahead<0 
70b0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
70c0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  rn n;.}../******
70d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
70e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
70f0: 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  build.c" *******
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7110: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
7120: 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72  utines to constr
7130: 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74  uction the finit
7140: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20  e state machine 
7150: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a  for the LEMON.**
7160: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
7170: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  r..*/../* Find a
7180: 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   precedence symb
7190: 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65  ol of every rule
71a0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   in the grammar.
71b0: 0a 2a 2a 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c  .**.** Those rul
71c0: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 61 20  es which have a 
71d0: 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
71e0: 6c 20 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69  l coded in the i
71f0: 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20  nput.** grammar 
7200: 75 73 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62  using the "[symb
7210: 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77  ol]" construct w
7220: 69 6c 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65  ill already have
7230: 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63   the.** rp->prec
7240: 73 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  sym field filled
7250: 2e 20 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74  .  Other rules t
7260: 61 6b 65 20 61 73 20 74 68 65 69 72 20 70 72 65  ake as their pre
7270: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
7280: 6c 20 74 68 65 20 66 69 72 73 74 20 52 48 53 20  l the first RHS 
7290: 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65  symbol with a de
72a0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
72b0: 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
72c0: 72 65 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f  re not RHS symbo
72d0: 6c 73 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  ls with a define
72e0: 64 20 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68  d precedence, th
72f0: 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  e precedence.** 
7300: 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20  symbol field is 
7310: 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76  left blank..*/.v
7320: 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63  oid FindRulePrec
7330: 65 64 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c  edences(struct l
7340: 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74  emon *xp).{.  st
7350: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
7360: 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65   for(rp=xp->rule
7370: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
7380: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
7390: 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20  precsym==0 ){.  
73a0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
73b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
73c0: 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70  p->nrhs && rp->p
73d0: 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b  recsym==0; i++){
73e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
73f0: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7400: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7410: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
7420: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7430: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7440: 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; j<sp->nsubsym
7450: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7460: 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73      if( sp->subs
7470: 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29  ym[j]->prec>=0 )
7480: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7490: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70  rp->precsym = sp
74a0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20  ->subsym[j];.   
74b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
74c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
74d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
74e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
74f0: 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
7500: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
7510: 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  ym = rp->rhs[i];
7520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7530: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7540: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
7550: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
7560: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
7570: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
7580: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
7590: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
75a0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
75b0: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
75c0: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
75d0: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
75e0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
75f0: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
7600: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
7610: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
7620: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
7630: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
7640: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 73   FindFirstSets(s
7650: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7660: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  p).{.  int i, j;
7670: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7680: 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  rp;.  int progre
7690: 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ss;..  for(i=0; 
76a0: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
76b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
76c0: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d  >symbols[i]->lam
76d0: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
76e0: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c  E;.  }.  for(i=l
76f0: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
7700: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
7710: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
7720: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72  >symbols[i]->fir
7730: 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29  stset = SetNew()
7740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
7750: 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61  t compute all la
7760: 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20  mbdas */.  do{. 
7770: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
7780: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
7790: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
77a0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
77b0: 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d  if( rp->lhs->lam
77c0: 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bda ) continue;.
77d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
77e0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
77f0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
7800: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7810: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7820: 20 61 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70   assert( sp->typ
7830: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e==NONTERMINAL |
7840: 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  | sp->lambda==LE
7850: 4d 4f 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20  MON_FALSE );.   
7860: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
7870: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7890: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
78a0: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
78b0: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
78c0: 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  da = LEMON_TRUE;
78d0: 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73  .        progres
78e0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
78f0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70     }.  }while( p
7900: 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a  rogress );..  /*
7910: 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c   Now compute all
7920: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
7930: 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20   do{.    struct 
7940: 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b  symbol *s1, *s2;
7950: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
7960: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
7970: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
7980: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
7990: 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a    s1 = rp->lhs;.
79a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
79b0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
79c0: 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70  .        s2 = rp
79d0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
79e0: 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d    if( s2->type==
79f0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
7a00: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7a10: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
7a20: 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29  stset,s2->index)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7a40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7a50: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d   if( s2->type==M
7a60: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7a70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7a80: 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d  0; j<s2->nsubsym
7a90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7aa0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
7ab0: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
7ac0: 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a  set,s2->subsym[j
7ad0: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
7ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7b00: 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32  }else if( s1==s2
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7b20: 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s1->lambda==LE
7b30: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
7b40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
7b60: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
7b70: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7b80: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
7b90: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
7ba0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
7bb0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
7bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7bd0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
7be0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
7bf0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
7c00: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
7c10: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
7c20: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
7c30: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
7c40: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
7c50: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
7c60: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
7c70: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
7c80: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
7c90: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
7ca0: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
7cb0: 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f  lemon *);  /* fo
7cc0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
7cd0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74  */.void FindStat
7ce0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
7cf0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
7d00: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
7d10: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7d20: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
7d30: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
7d40: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
7d50: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
7d60: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
7d70: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
7d80: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
7d90: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
7da0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
7db0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
7dc0: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
7dd0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
7de0: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
7df0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
7e00: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
7e10: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
7e20: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
7e30: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
7e40: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
7e50: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7e60: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
7e70: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
7e80: 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65  +;.      sp = le
7e90: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7ea0: 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  hs;.    }.  }els
7eb0: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
7ec0: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
7ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
7ee0: 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20   sure the start 
7ef0: 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f  symbol doesn't o
7f00: 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68  ccur on the righ
7f10: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20  t-hand side of. 
7f20: 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52   ** any rule.  R
7f30: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
7f40: 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43  f it does.  (YAC
7f50: 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  C would generate
7f60: 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72   a new.  ** star
7f70: 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  t symbol in this
7f80: 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72   case.) */.  for
7f90: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
7fa0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
7fb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
7fd0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
7fe0: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
7ff0: 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58  ==sp ){   /* FIX
8000: 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20   ME:  Deal with 
8010: 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a  multiterminals *
8020: 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  /.        ErrorM
8030: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
8040: 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20  e,0,."The start 
8050: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63  symbol \"%s\" oc
8060: 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69  curs on the \.ri
8070: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
8080: 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69   a rule. This wi
8090: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70  ll result in a p
80a0: 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f  arser which \.do
80b0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70  es not work prop
80c0: 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29  erly.",sp->name)
80d0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
80e0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
80f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8100: 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f   /* The basis co
8110: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20  nfiguration set 
8120: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74  for the first st
8130: 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20  ate.  ** is all 
8140: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
8150: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
8160: 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20  l as their.  ** 
8170: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a  left-hand side *
8180: 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72  /.  for(rp=sp->r
8190: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
81a0: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74  nextlhs){.    st
81b0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
81c0: 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73  cfp;.    rp->lhs
81d0: 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e  Start = 1;.    n
81e0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
81f0: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30  st_addbasis(rp,0
8200: 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65  );.    SetAdd(ne
8210: 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20  wcfp->fws,0);.  
8220: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
8230: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
8240: 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74    All other stat
8250: 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  es will be.  ** 
8260: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
8270: 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68  ically during th
8280: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
8290: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a   the first one..
82a0: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65    ** The returne
82b0: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
82c0: 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73 20   first state is 
82d0: 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28  not used. */.  (
82e0: 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c 65  void)getstate(le
82f0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mp);.  return;.}
8300: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
8320: 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72 69   which is descri
8330: 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69  bed by the confi
8340: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  guration.** list
8350: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
8360: 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73  built from calls
8370: 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   to Configlist_a
8380: 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  dd..*/.PRIVATE v
8390: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
83a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
83b0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b  struct state *);
83c0: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
83d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
83e0: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
83f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8400: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
8410: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b  onfig *cfp, *bp;
8420: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
8430: 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  *stp;..  /* Extr
8440: 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62  act the sorted b
8450: 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20  asis of the new 
8460: 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69  state.  The basi
8470: 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  s was constructe
8480: 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20  d.  ** by prior 
8490: 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67  calls to "Config
84a0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22  list_addbasis()"
84b0: 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73  . */.  Configlis
84c0: 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20  t_sortbasis();. 
84d0: 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74   bp = Configlist
84e0: 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20  _basis();..  /* 
84f0: 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68  Get a state with
8500: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
8510: 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65  */.  stp = State
8520: 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28  _find(bp);.  if(
8530: 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41   stp ){.    /* A
8540: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
8550: 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61  same basis alrea
8560: 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79  dy exists!  Copy
8570: 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d   all the follow-
8580: 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61  set.    ** propa
8590: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f  gation links fro
85a0: 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65  m the state unde
85b0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
85c0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  nto the.    ** p
85d0: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
85e0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
85f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8600: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
8610: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63   */.    struct c
8620: 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20  onfig *x, *y;.  
8630: 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74    for(x=bp, y=st
8640: 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78  p->bp; x && y; x
8650: 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29  =x->bp, y=y->bp)
8660: 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f  {.      Plink_co
8670: 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62  py(&y->bplp,x->b
8680: 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  plp);.      Plin
8690: 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70  k_delete(x->fplp
86a0: 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70  );.      x->fplp
86b0: 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   = x->bplp = 0;.
86c0: 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20      }.    cfp = 
86d0: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
86e0: 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c  n();.    Configl
86f0: 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20  ist_eat(cfp);.  
8700: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
8710: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e  is really is a n
8720: 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74  ew state.  Const
8730: 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74  ruct all the det
8740: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  ails */.    Conf
8750: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c  iglist_closure(l
8760: 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70  emp);    /* Comp
8770: 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ute the configur
8780: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
8790: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
87a0: 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20  sort();         
87b0: 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f    /* Sort the co
87c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
87d0: 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d  ure */.    cfp =
87e0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
87f0: 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61  rn();   /* Get a
8800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8810: 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20  config list */. 
8820: 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e     stp = State_n
8830: 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ew();           
8840: 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73  /* A new state s
8850: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8860: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29  MemoryCheck(stp)
8870: 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20  ;.    stp->bp = 
8880: 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bp;             
8890: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
88a0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
88b0: 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74   basis */.    st
88c0: 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20  p->cfp = cfp;   
88d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
88e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
88f0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
8900: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61   */.    stp->sta
8910: 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73  tenum = lemp->ns
8920: 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79  tate++; /* Every
8930: 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65   state gets a se
8940: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f  quence number */
8950: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30  .    stp->ap = 0
8960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8970: 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c    /* No actions,
8980: 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61   yet. */.    Sta
8990: 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74  te_insert(stp,st
89a0: 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64  p->bp);   /* Add
89b0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61   to the state ta
89c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64  ble */.    build
89d0: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
89e0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72  ;       /* Recur
89f0: 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73  sively compute s
8a00: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
8a10: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
8a20: 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  stp;.}../*.** Re
8a30: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f  turn true if two
8a40: 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65   symbols are the
8a50: 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61   same..*/.int sa
8a60: 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74  me_symbol(struct
8a70: 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75   symbol *a, stru
8a80: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a  ct symbol *b).{.
8a90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
8aa0: 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==b ) return 1;.
8ab0: 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d    if( a->type!=M
8ac0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72  ULTITERMINAL ) r
8ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62  eturn 0;.  if( b
8ae0: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
8af0: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
8b00: 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73  ;.  if( a->nsubs
8b10: 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29  ym!=b->nsubsym )
8b20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
8b30: 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73  (i=0; i<a->nsubs
8b40: 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ym; i++){.    if
8b50: 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d  ( a->subsym[i]!=
8b60: 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72  b->subsym[i] ) r
8b70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
8b80: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43  eturn 1;.}../* C
8b90: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63  onstruct all suc
8ba0: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f  cessor states to
8bb0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
8bc0: 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f 72 22  .  A "successor"
8bd0: 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79  .** state is any
8be0: 20 73 74 61 74 65 20 77 68 69 63 68 20 63 61 6e   state which can
8bf0: 20 62 65 20 72 65 61 63 68 65 64 20 62 79 20 61   be reached by a
8c00: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a   shift action..*
8c10: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
8c20: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
8c30: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
8c40: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
8c50: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
8c60: 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f  fig *cfp;  /* Fo
8c70: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74  r looping thru t
8c80: 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  he config closur
8c90: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
8ca0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
8cb0: 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20  cfp; /* For the 
8cc0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f  inner loop on co
8cd0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
8ce0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
8cf0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67  t config *newcfg
8d00: 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63  ;  /* */.  struc
8d10: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
8d20: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
8d30: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
8d40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66  onfiguration "cf
8d50: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
8d60: 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20  ymbol *bsp;  /* 
8d70: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
8d80: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
8d90: 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22  iguration "bcfp"
8da0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
8db0: 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41  te *newstp; /* A
8dc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
8dd0: 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f  ccessor state */
8de0: 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66  ..  /* Each conf
8df0: 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65  iguration become
8e00: 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72  s complete after
8e10: 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74   it contibutes t
8e20: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20  o a successor.  
8e30: 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69  ** state.  Initi
8e40: 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67  ally, all config
8e50: 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63  urations are inc
8e60: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72  omplete */.  for
8e70: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
8e80: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
8e90: 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  t) cfp->status =
8ea0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20   INCOMPLETE;..  
8eb0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
8ec0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8ed0: 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 20  ns of the state 
8ee0: 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63  "stp" */.  for(c
8ef0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8f00: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8f10: 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73  {.    if( cfp->s
8f20: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
8f30: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
8f40: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 62  * Already used b
8f50: 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  y inner loop */.
8f60: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
8f70: 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  >=cfp->rp->nrhs 
8f80: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
8f90: 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73  Can't shift this
8fa0: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43   config */.    C
8fb0: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
8fc0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74          /* Reset
8fe0: 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20   the new config 
8ff0: 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20  set */.    sp = 
9000: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70  cfp->rp->rhs[cfp
9010: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
9020: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66      /* Symbol af
9030: 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a  ter the dot */..
9040: 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79      /* For every
9050: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
9060: 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  n the state "stp
9070: 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65 20  " which has the 
9080: 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20  symbol "sp".    
9090: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73  ** following its
90a0: 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61   dot, add the sa
90b0: 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  me configuration
90c0: 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73 65   to the basis se
90d0: 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63  t under.    ** c
90e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20  onstruction but 
90f0: 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68 69  with the dot shi
9100: 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20  fted one symbol 
9110: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  to the right. */
9120: 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66  .    for(bcfp=cf
9130: 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63  p; bcfp; bcfp=bc
9140: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
9150: 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75   if( bcfp->statu
9160: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
9170: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
9180: 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20  ready used */.  
9190: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f      if( bcfp->do
91a0: 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  t>=bcfp->rp->nrh
91b0: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  s ) continue; /*
91c0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
91d0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62  s one */.      b
91e0: 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72  sp = bcfp->rp->r
91f0: 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  hs[bcfp->dot];  
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20           /* Get 
9210: 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74  symbol after dot
9220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73   */.      if( !s
9230: 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73  ame_symbol(bsp,s
9240: 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  p) ) continue;  
9250: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73      /* Must be s
9260: 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70 22  ame as for "cfp"
9270: 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e   */.      bcfp->
9280: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
9290: 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
92a0: 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73      /* Mark this
92b0: 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20   config as used 
92c0: 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20  */.      newcfg 
92d0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
92e0: 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62  basis(bcfp->rp,b
92f0: 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20  cfp->dot+1);.   
9300: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65     Plink_add(&ne
9310: 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29  wcfg->bplp,bcfp)
9320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9330: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
9340: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
9350: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
9360: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
9370: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
9380: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
9390: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
93a0: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
93b0: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
93c0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
93d0: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
93e0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
93f0: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
9400: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
9410: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
9420: 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sp" */.    if( s
9430: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
9440: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
9450: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
9460: 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62  (i=0; i<sp->nsub
9470: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sym; i++){.     
9480: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
9490: 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d  tp->ap,SHIFT,sp-
94a0: 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72  >subsym[i],(char
94b0: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20  *)newstp);.     
94c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
94d0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
94e0: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
94f0: 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29  ,(char *)newstp)
9500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9510: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
9520: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
9530: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
9540: 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65  dLinks(struct le
9550: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
9560: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
9570: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68  onfig *cfp, *oth
9580: 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  er;.  struct sta
9590: 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
95a0: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20  t plink *plp;.. 
95b0: 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67   /* Housekeeping
95c0: 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64   detail:.  ** Ad
95d0: 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61  d to every propa
95e0: 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e  gate link a poin
95f0: 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ter back to the 
9600: 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68  state to.  ** wh
9610: 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20  ich the link is 
9620: 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66  attached. */.  f
9630: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9640: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9650: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
9660: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
9670: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
9680: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
9690: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
96a0: 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a  tp = stp;.    }.
96b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
96c0: 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20  t all backlinks 
96d0: 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e  into forward lin
96e0: 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f  ks.  Only the fo
96f0: 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73  rward.  ** links
9700: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
9710: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70   follow-set comp
9720: 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  utation. */.  fo
9730: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9740: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9750: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
9760: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
9770: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
9780: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9790: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70  ){.      for(plp
97a0: 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b  =cfp->bplp; plp;
97b0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
97c0: 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d  .        other =
97d0: 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20   plp->cfp;.     
97e0: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74     Plink_add(&ot
97f0: 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a  her->fplp,cfp);.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9810: 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  }.}../* Compute 
9820: 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a  all followsets..
9830: 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65  **.** A followse
9840: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
9850: 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  all symbols whic
9860: 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64  h can come immed
9870: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
9880: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  a configuration.
9890: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  .*/.void FindFol
98a0: 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c  lowSets(struct l
98b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
98c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
98d0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
98e0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
98f0: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
9900: 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a  ;.  int change;.
9910: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
9920: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
9930: 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65  {.    for(cfp=le
9940: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
9950: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
9960: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  ->next){.      c
9970: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
9980: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20  OMPLETE;.    }. 
9990: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72   }..  do{.    pr
99a0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
99b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
99c0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
99d0: 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d       for(cfp=lem
99e0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
99f0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9a00: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
9a10: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
9a20: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
9a30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
9a40: 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b  r(plp=cfp->fplp;
9a50: 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e   plp; plp=plp->n
9a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
9a70: 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f  change = SetUnio
9a80: 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c  n(plp->cfp->fws,
9a90: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20  cfp->fws);.     
9aa0: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20       if( change 
9ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9ac0: 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20  lp->cfp->status 
9ad0: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  = INCOMPLETE;.  
9ae0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
9af0: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ss = 1;.        
9b00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b10: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
9b20: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  s = COMPLETE;.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
9b40: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
9b50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
9b60: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
9b70: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
9b80: 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  ,struct action *
9b90: 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  );../* Compute t
9ba0: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
9bb0: 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63  s, and resolve c
9bc0: 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69  onflicts..*/.voi
9bd0: 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74  d FindActions(st
9be0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
9bf0: 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20  ).{.  int i,j;. 
9c00: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9c10: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74  cfp;.  struct st
9c20: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
9c30: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
9c40: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
9c50: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  ;..  /* Add all 
9c60: 6f 66 20 74 68 65 20 72 65 64 75 63 65 20 61 63  of the reduce ac
9c70: 74 69 6f 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64  tions.  ** A red
9c80: 75 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64  uce action is ad
9c90: 64 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65  ded for each ele
9ca0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ment of the foll
9cb0: 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20  owset of.  ** a 
9cc0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68  configuration wh
9cd0: 69 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20  ich has its dot 
9ce0: 61 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  at the extreme r
9cf0: 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ight..  */.  for
9d00: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9d10: 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a  tate; i++){   /*
9d20: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73   Loop over all s
9d30: 74 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70  tates */.    stp
9d40: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
9d50: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
9d60: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
9d70: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20  fp=cfp->next){  
9d80: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
9d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
9da0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  */.      if( cfp
9db0: 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d  ->rp->nrhs==cfp-
9dc0: 3e 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f  >dot ){        /
9dd0: 2a 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72  * Is dot at extr
9de0: 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20  eme right? */.  
9df0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9e00: 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
9e10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9e20: 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66    if( SetFind(cf
9e30: 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20  p->fws,j) ){.   
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9e50: 61 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  a reduce action 
9e60: 74 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74  to the state "st
9e70: 70 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  p" which will re
9e80: 64 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20  duce by the.    
9e90: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20          ** rule 
9ea0: 22 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65  "cfp->rp" if the
9eb0: 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f   lookahead symbo
9ec0: 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62  l is "lemp->symb
9ed0: 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20  ols[j]" */.     
9ee0: 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64         Action_ad
9ef0: 64 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43  d(&stp->ap,REDUC
9f00: 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  E,lemp->symbols[
9f10: 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e  j],(char *)cfp->
9f20: 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rp);.          }
9f30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9f50: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
9f60: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
9f70: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
9f80: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
9f90: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
9fa0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
9fb0: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
9fc0: 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b  >startRule->lhs;
9fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
9fe0: 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75   = lemp->startRu
9ff0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f  le->lhs;.  }.  /
a000: 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72  * Add to the fir
a010: 73 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20  st state (which 
a020: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74  is always the st
a030: 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20  arting state of 
a040: 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20  the.  ** finite 
a050: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61  state machine) a
a060: 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45  n action to ACCE
a070: 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  PT if the lookah
a080: 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  ead is the.  ** 
a090: 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61  start nontermina
a0a0: 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f  l.  */.  Action_
a0b0: 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  add(&lemp->sorte
a0c0: 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c  d[0]->ap,ACCEPT,
a0d0: 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73  sp,0);..  /* Res
a0e0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a  olve conflicts *
a0f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
a100: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a110: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a120: 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a  tion *ap, *nap;.
a130: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
a140: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f  sorted[i];.    /
a150: 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61  * assert( stp->a
a160: 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d  p ); */.    stp-
a170: 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
a180: 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20  t(stp->ap);.    
a190: 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
a1a0: 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20  ap && ap->next; 
a1b0: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
a1c0: 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e      for(nap=ap->
a1d0: 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70  next; nap && nap
a1e0: 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61  ->sp==ap->sp; na
a1f0: 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=nap->next){.  
a200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
a210: 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61  o actions "ap" a
a220: 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68  nd "nap" have th
a230: 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64  e same lookahead
a240: 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69  ..         ** Fi
a250: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
a260: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ne should be use
a270: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65  d */.         le
a280: 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d  mp->nconflict +=
a290: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
a2a0: 74 28 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20  t(ap,nap);.     
a2b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a2c0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
a2d0: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
a2e0: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
a2f0: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
a300: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
a310: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
a320: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
a330: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
a340: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
a350: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a360: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a370: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
a380: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
a390: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
a3a0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
a3b0: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
a3c0: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
a3d0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
a3e0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
a3f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
a400: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
a410: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
a420: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
a430: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a440: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
a450: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
a460: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
a470: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
a480: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
a490: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
a4a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
a4b0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
a4c0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
a4d0: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
a4e0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
a4f0: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
a500: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
a510: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f  ero..**.** NO LO
a520: 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20  NGER TRUE:.**   
a530: 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e  To resolve a con
a540: 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f  flict, first loo
a550: 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68  k to see if eith
a560: 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69  er action.**   i
a570: 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75  s on an error ru
a580: 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
a590: 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69  e, take the acti
a5a0: 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73  on which.**   is
a5b0: 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20   not associated 
a5c0: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72  with the error r
a5d0: 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72  ule.  If neither
a5e0: 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63   or both.**   ac
a5f0: 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69  tions are associ
a600: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
a610: 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72  or rule, then tr
a620: 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72  y to.**   use pr
a630: 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f  ecedence to reso
a640: 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  lve the conflict
a650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
a660: 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48  r action is a SH
a670: 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  IFT, then it mus
a680: 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a  t be apx.  This.
a690: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27  ** function won'
a6a0: 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74  t work if apx->t
a6b0: 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20  ype==REDUCE and 
a6c0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6e0: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
a6f0: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
a700: 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74  n *apx,.  struct
a710: 20 61 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a   action *apy.){.
a720: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
a730: 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e  *spx, *spy;.  in
a740: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
a750: 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d  assert( apx->sp=
a760: 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20  =apy->sp );  /* 
a770: 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20  Otherwise there 
a780: 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66  would be no conf
a790: 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70  lict */.  if( ap
a7a0: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
a7b0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  & apy->type==SHI
a7c0: 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74  FT ){.    apy->t
a7d0: 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54  ype = SSCONFLICT
a7e0: 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  ;.    errcnt++;.
a7f0: 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74    }.  if( apx->t
a800: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
a810: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
a820: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
a830: 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20  ->sp;.    spy = 
a840: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
a850: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d  ym;.    if( spy=
a860: 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c  =0 || spx->prec<
a870: 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30  0 || spy->prec<0
a880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
a890: 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e   enough preceden
a8a0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ce information. 
a8b0: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
a8c0: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
a8d0: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
a8e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a8f0: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
a900: 65 63 20 29 7b 20 20 20 20 2f 2a 20 68 69 67 68  ec ){    /* high
a910: 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69  er precedence wi
a920: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  ns */.      apy-
a930: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
a940: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
a950: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
a960: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a970: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
a980: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
a990: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
a9a0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
a9b0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54  px->assoc==RIGHT
a9c0: 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61   ){ /* Use opera
a9d0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  tor */.      apy
a9e0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
a9f0: 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20  LVED;           
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69    /* associativi
aa20: 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ty */.    }else 
aa30: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
aa40: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
aa50: 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20  >assoc==LEFT ){ 
aa60: 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65   /* to break tie
aa70: 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   */.      apx->t
aa80: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
aa90: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
aaa0: 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d      assert( spx-
aab0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
aac0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
aad0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70  NONE );.      ap
aae0: 78 2d 3e 74 79 70 65 20 3d 20 45 52 52 4f 52 3b  x->type = ERROR;
aaf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ab00: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  f( apx->type==RE
ab10: 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70  DUCE && apy->typ
ab20: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
ab30: 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70   spx = apx->x.rp
ab40: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73  ->precsym;.    s
ab50: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
ab60: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
ab70: 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d   spx==0 || spy==
ab80: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
ab90: 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65   ||.    spy->pre
aba0: 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  c<0 || spx->prec
abb0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  ==spy->prec ){. 
abc0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
abd0: 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   RRCONFLICT;.   
abe0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
abf0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
ac00: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
ac10: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
ac20: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
ac30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ac40: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
ac50: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
ac60: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
ac70: 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  VED;.    }.  }el
ac80: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0a  se{.    assert(.
ac90: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
aca0: 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =SH_RESOLVED ||.
acb0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
acc0: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =RD_RESOLVED ||.
acd0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
ace0: 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SSCONFLICT ||. 
acf0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
ad00: 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SRCONFLICT ||.  
ad10: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
ad20: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
ad30: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48     apy->type==SH
ad40: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad50: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44     apy->type==RD
ad60: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad70: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53     apy->type==SS
ad80: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
ad90: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43    apy->type==SRC
ada0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
adb0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apy->type==RRCO
adc0: 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  NFLICT.    );.  
add0: 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f    /* The REDUCE/
ade0: 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f  SHIFT case canno
adf0: 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73 65  t happen because
ae00: 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66   SHIFTs come bef
ae10: 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43  ore.    ** REDUC
ae20: 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20  Es on the list. 
ae30: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
ae40: 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20  s point it must 
ae50: 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  be because.    *
ae60: 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * the parser con
ae70: 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61 64  flict had alread
ae80: 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  y been resolved.
ae90: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
aea0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a   errcnt;.}./****
aeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aec0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
aed0: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a  "configlist.c" *
aee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aef0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
af00: 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63  Routines to proc
af10: 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75  essing a configu
af20: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
af30: 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65  building a state
af40: 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
af50: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
af60: 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74  r..*/..static st
af70: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65  ruct config *fre
af80: 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  elist = 0;      
af90: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
afa0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
afb0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
afc0: 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20  config *current 
afd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
afe0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e  p of list of con
aff0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
b000: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
b010: 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64  fig **currentend
b020: 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20   = 0;   /* Last 
b030: 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  on list of confi
b040: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
b050: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69  uct config *basi
b060: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
b070: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
b080: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
b090: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
b0a0: 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e  config **basisen
b0b0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e  d = 0;     /* En
b0c0: 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  d of list of bas
b0d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f  is configs */../
b0e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b0f0: 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66  er to a new conf
b100: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
b110: 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66  VATE struct conf
b120: 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f  ig *newconfig(vo
b130: 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  id){.  struct co
b140: 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20  nfig *newcfg;.  
b150: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
b160: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b170: 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20    int amt = 3;. 
b180: 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73     freelist = (s
b190: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63  truct config *)c
b1a0: 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
b1b0: 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  of(struct config
b1c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  ) );.    if( fre
b1d0: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
b1e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b1f0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
b200: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
b210: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
b220: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
b230: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
b240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
b250: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
b260: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
b270: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
b280: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
b290: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
b2a0: 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74  ewcfg = freelist
b2b0: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
b2c0: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
b2d0: 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a   return newcfg;.
b2e0: 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67  }../* The config
b2f0: 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73  uration "old" is
b300: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20   no longer used 
b310: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
b320: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72  deleteconfig(str
b330: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29  uct config *old)
b340: 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d  .{.  old->next =
b350: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
b360: 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a  elist = old;.}..
b370: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
b380: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
b390: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
b3a0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
b3b0: 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63  _init(void){.  c
b3c0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
b3d0: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
b3e0: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
b3f0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
b400: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
b410: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
b420: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
b430: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
b440: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b450: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
b460: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
b470: 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e  (void){.  curren
b480: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
b490: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
b4a0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
b4b0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
b4c0: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
b4d0: 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75  clear(0);.  retu
b4e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e  rn;.}../* Add an
b4f0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
b500: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
b510: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
b520: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
b530: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a  Configlist_add(.
b540: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
b550: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p,    /* The rul
b560: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20  e */.  int dot  
b570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b580: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
b590: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
b5a0: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
b5b0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63  */.){.  struct c
b5c0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
b5d0: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
b5e0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b5f0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
b600: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
b610: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
b620: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
b630: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
b640: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
b650: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
b660: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
b670: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
b680: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
b690: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
b6a0: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
b6b0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b6c0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b6d0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b6e0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b6f0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b700: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b710: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b720: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
b730: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b750: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
b760: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b770: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
b780: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b790: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
b7a0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
b7b0: 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  is(struct rule *
b7c0: 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20  rp, int dot).{. 
b7d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b7e0: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
b7f0: 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21  ssert( basisend!
b800: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b810: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b820: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b830: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b840: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b850: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b860: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b870: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b880: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b890: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b8a0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b8b0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b8c0: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b8d0: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b8e0: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b8f0: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b900: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b910: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b920: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b930: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b940: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b950: 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73  next;.    *basis
b960: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62  end = cfp;.    b
b970: 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e  asisend = &cfp->
b980: 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  bp;.    Configta
b990: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b9a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b9b0: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  p;.}../* Compute
b9c0: 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20   the closure of 
b9d0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b9e0: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
b9f0: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
ba00: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
ba10: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
ba20: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e   config *cfp, *n
ba30: 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20  ewcfp;.  struct 
ba40: 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70  rule *rp, *newrp
ba50: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
ba60: 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69  l *sp, *xsp;.  i
ba70: 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73  nt i, dot;..  as
ba80: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
ba90: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70  !=0 );.  for(cfp
baa0: 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63  =current; cfp; c
bab0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
bac0: 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b     rp = cfp->rp;
bad0: 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e  .    dot = cfp->
bae0: 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74  dot;.    if( dot
baf0: 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  >=rp->nrhs ) con
bb00: 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20  tinue;.    sp = 
bb10: 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20  rp->rhs[dot];.  
bb20: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
bb30: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
bb40: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c       if( sp->rul
bb50: 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70  e==0 && sp!=lemp
bb60: 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
bb70: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
bb80: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
bb90: 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61  line,"Nontermina
bba0: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20  l \"%s\" has no 
bbb0: 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  rules.",.       
bbc0: 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20     sp->name);.  
bbd0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
bbe0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
bbf0: 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d        for(newrp=
bc00: 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b  sp->rule; newrp;
bc10: 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65   newrp=newrp->ne
bc20: 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20  xtlhs){.        
bc30: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
bc40: 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29  ist_add(newrp,0)
bc50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bc60: 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68  dot+1; i<rp->nrh
bc70: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
bc80: 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73     xsp = rp->rhs
bc90: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
bca0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45  f( xsp->type==TE
bcb0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
bcc0: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
bcd0: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e  cfp->fws,xsp->in
bce0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bd00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70     }else if( xsp
bd10: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
bd20: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
bd30: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bd40: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
bd50: 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b   k<xsp->nsubsym;
bd60: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
bd70: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
bd80: 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75  fp->fws, xsp->su
bd90: 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b  bsym[k]->index);
bda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bdb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bdc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
bdd0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e{.            S
bde0: 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e  etUnion(newcfp->
bdf0: 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65  fws,xsp->firstse
be00: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
be10: 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d  if( xsp->lambda=
be20: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
be30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
be40: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
be50: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
be60: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
be70: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
be80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
be90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
bea0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
beb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
bec0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
bed0: 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b  list_sort(void){
bee0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
bef0: 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f  ruct config*)mso
bf00: 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e  rt((char*)curren
bf10: 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72  t,(char**)&(curr
bf20: 65 6e 74 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20  ent->next),.    
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
bf50: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
bf60: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
bf70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
bf80: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
bf90: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
bfa0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
bfb0: 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29  _sortbasis(void)
bfc0: 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72  {.  basis = (str
bfd0: 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72  uct config*)msor
bfe0: 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74  t((char*)current
bff0: 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65  ,(char**)&(curre
c000: 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20  nt->bp),.       
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63           Configc
c030: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
c040: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
c050: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
c060: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c070: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
c080: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
c090: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
c0a0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
c0b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
c0c0: 65 74 75 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73  eturn(void){.  s
c0d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
c0e0: 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65  d;.  old = curre
c0f0: 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  nt;.  current = 
c100: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
c110: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c  = 0;.  return ol
c120: 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  d;.}../* Return 
c130: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c140: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
c150: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
c160: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
c170: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
c180: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
c190: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 7b 0a  st_basis(void){.
c1a0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
c1b0: 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61  *old;.  old = ba
c1c0: 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  sis;.  basis = 0
c1d0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
c1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
c1f0: 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65  }../* Free all e
c200: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67  lements of the g
c210: 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  iven configurati
c220: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
c230: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73  Configlist_eat(s
c240: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
c250: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
c260: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
c270: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
c280: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
c290: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
c2a0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
c2b0: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
c2c0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
c2d0: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
c2e0: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
c2f0: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
c300: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
c310: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
c320: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
c340: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
c350: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
c380: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
c390: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
c3a0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
c3b0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
c3c0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
c3d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
c3e0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
c3f0: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
c400: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
c410: 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  d: ", filename, 
c420: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74  lineno);.  va_st
c430: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
c440: 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  .  vfprintf(stde
c450: 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  rr,format,ap);. 
c460: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66   va_end(ap);.  f
c470: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
c480: 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  \n");.}./*******
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
c4a0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
c4b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
c4e0: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
c4f0: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
c500: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
c510: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
c520: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
c530: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
c540: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
c550: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
c560: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
c570: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
c580: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
c590: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
c5a0: 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66  void){.  fprintf
c5b0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
c5c0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
c5d0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
c5e0: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
c5f0: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
c600: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c610: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
c620: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
c630: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
c640: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
c650: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c660: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
c670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c680: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
c690: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
c6a0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
c6b0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
c6c0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
c6d0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
c6e0: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
c6f0: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
c700: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
c710: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
c720: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
c730: 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72  azDefine = (char
c740: 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44   **) realloc(azD
c750: 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a  efine, sizeof(az
c760: 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69  Define[0])*nDefi
c770: 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66  ne);.  if( azDef
c780: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ine==0 ){.    fp
c790: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75  rintf(stderr,"ou
c7a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
c7b0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
c7c0: 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66  }.  paz = &azDef
c7d0: 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a  ine[nDefine-1];.
c7e0: 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a    *paz = (char *
c7f0: 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  ) malloc( lemonS
c800: 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20  trlen(z)+1 );.  
c810: 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20  if( *paz==0 ){. 
c820: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
c830: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
c840: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
c850: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
c860: 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a  trcpy(*paz, z);.
c870: 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a    for(z=*paz; *z
c880: 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b   && *z!='='; z++
c890: 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a  ){}.  *z = 0;.}.
c8a0: 0a 2f 2a 20 52 65 6d 62 65 72 20 74 68 65 20 6e  ./* Rember the n
c8b0: 61 6d 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ame of the outpu
c8c0: 74 20 64 69 72 65 63 74 6f 72 79 20 0a 2a 2f 0a  t directory .*/.
c8d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 75 74  static char *out
c8e0: 70 75 74 44 69 72 20 3d 20 4e 55 4c 4c 3b 0a 73  putDir = NULL;.s
c8f0: 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c  tatic void handl
c900: 65 5f 64 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20  e_d_option(char 
c910: 2a 7a 29 7b 0a 20 20 6f 75 74 70 75 74 44 69 72  *z){.  outputDir
c920: 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
c930: 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
c940: 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 6f 75  z)+1 );.  if( ou
c950: 74 70 75 74 44 69 72 3d 3d 30 20 29 7b 0a 20 20  tputDir==0 ){.  
c960: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
c970: 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  ,"out of memory\
c980: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
c990: 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74  ;.  }.  lemon_st
c9a0: 72 63 70 79 28 6f 75 74 70 75 74 44 69 72 2c 20  rcpy(outputDir, 
c9b0: 7a 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  z);.}..static ch
c9c0: 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c 61 74  ar *user_templat
c9d0: 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74  ename = NULL;.st
c9e0: 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65  atic void handle
c9f0: 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a  _T_option(char *
ca00: 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d 70 6c  z){.  user_templ
ca10: 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 20  atename = (char 
ca20: 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  *) malloc( lemon
ca30: 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20  Strlen(z)+1 );. 
ca40: 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70 6c 61   if( user_templa
ca50: 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  tename==0 ){.   
ca60: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
ca70: 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
ca80: 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  cpy(user_templat
ca90: 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a  ename, z);.}../*
caa0: 20 4d 65 72 67 65 20 74 6f 67 65 74 68 65 72 20   Merge together 
cab0: 74 6f 20 6c 69 73 74 73 20 6f 66 20 72 75 6c 65  to lists of rule
cac0: 73 20 6f 72 64 65 72 65 64 20 62 79 20 72 75 6c  s ordered by rul
cad0: 65 2e 69 52 75 6c 65 20 2a 2f 0a 73 74 61 74 69  e.iRule */.stati
cae0: 63 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 52  c struct rule *R
caf0: 75 6c 65 5f 6d 65 72 67 65 28 73 74 72 75 63 74  ule_merge(struct
cb00: 20 72 75 6c 65 20 2a 70 41 2c 20 73 74 72 75 63   rule *pA, struc
cb10: 74 20 72 75 6c 65 20 2a 70 42 29 7b 0a 20 20 73  t rule *pB){.  s
cb20: 74 72 75 63 74 20 72 75 6c 65 20 2a 70 46 69 72  truct rule *pFir
cb30: 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
cb40: 20 72 75 6c 65 20 2a 2a 70 70 50 72 65 76 20 3d   rule **ppPrev =
cb50: 20 26 70 46 69 72 73 74 3b 0a 20 20 77 68 69 6c   &pFirst;.  whil
cb60: 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
cb70: 20 20 20 69 66 28 20 70 41 2d 3e 69 52 75 6c 65     if( pA->iRule
cb80: 3c 70 42 2d 3e 69 52 75 6c 65 20 29 7b 0a 20 20  <pB->iRule ){.  
cb90: 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 41      *ppPrev = pA
cba0: 3b 0a 20 20 20 20 20 20 70 70 50 72 65 76 20 3d  ;.      ppPrev =
cbb0: 20 26 70 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   &pA->next;.    
cbc0: 20 20 70 41 20 3d 20 70 41 2d 3e 6e 65 78 74 3b    pA = pA->next;
cbd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cbe0: 20 20 2a 70 70 50 72 65 76 20 3d 20 70 42 3b 0a    *ppPrev = pB;.
cbf0: 20 20 20 20 20 20 70 70 50 72 65 76 20 3d 20 26        ppPrev = &
cc00: 70 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20  pB->next;.      
cc10: 70 42 20 3d 20 70 42 2d 3e 6e 65 78 74 3b 0a 20  pB = pB->next;. 
cc20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
cc30: 41 20 29 7b 0a 20 20 20 20 2a 70 70 50 72 65 76  A ){.    *ppPrev
cc40: 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = pA;.  }else{.
cc50: 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 42      *ppPrev = pB
cc60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
cc70: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
cc80: 53 6f 72 74 20 61 20 6c 69 73 74 20 6f 66 20 72  Sort a list of r
cc90: 75 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 6f 66  ules in order of
cca0: 20 69 6e 63 72 65 61 73 69 6e 67 20 69 52 75 6c   increasing iRul
ccb0: 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
ccc0: 63 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 52  c struct rule *R
ccd0: 75 6c 65 5f 73 6f 72 74 28 73 74 72 75 63 74 20  ule_sort(struct 
cce0: 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74  rule *rp){.  int
ccf0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c   i;.  struct rul
cd00: 65 20 2a 70 4e 65 78 74 3b 0a 20 20 73 74 72 75  e *pNext;.  stru
cd10: 63 74 20 72 75 6c 65 20 2a 78 5b 33 32 5d 3b 0a  ct rule *x[32];.
cd20: 20 20 6d 65 6d 73 65 74 28 78 2c 20 30 2c 20 73    memset(x, 0, s
cd30: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 77 68 69  izeof(x));.  whi
cd40: 6c 65 28 20 72 70 20 29 7b 0a 20 20 20 20 70 4e  le( rp ){.    pN
cd50: 65 78 74 20 3d 20 72 70 2d 3e 6e 65 78 74 3b 0a  ext = rp->next;.
cd60: 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
cd70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cd80: 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f  <sizeof(x)/sizeo
cd90: 66 28 78 5b 30 5d 29 20 26 26 20 78 5b 69 5d 3b  f(x[0]) && x[i];
cda0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 70 20   i++){.      rp 
cdb0: 3d 20 52 75 6c 65 5f 6d 65 72 67 65 28 78 5b 69  = Rule_merge(x[i
cdc0: 5d 2c 20 72 70 29 3b 0a 20 20 20 20 20 20 78 5b  ], rp);.      x[
cdd0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
cde0: 20 20 78 5b 69 5d 20 3d 20 72 70 3b 0a 20 20 20    x[i] = rp;.   
cdf0: 20 72 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d   rp = pNext;.  }
ce00: 0a 20 20 72 70 20 3d 20 30 3b 0a 20 20 66 6f 72  .  rp = 0;.  for
ce10: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 78  (i=0; i<sizeof(x
ce20: 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 3b 20  )/sizeof(x[0]); 
ce30: 69 2b 2b 29 7b 0a 20 20 20 20 72 70 20 3d 20 52  i++){.    rp = R
ce40: 75 6c 65 5f 6d 65 72 67 65 28 78 5b 69 5d 2c 20  ule_merge(x[i], 
ce50: 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rp);.  }.  retur
ce60: 6e 20 72 70 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72 77  n rp;.}../* forw
ce70: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
ce80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ce90: 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65  ar *minimum_size
cea0: 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69  _type(int lwr, i
ceb0: 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42  nt upr, int *pnB
cec0: 79 74 65 29 3b 0a 0a 2f 2a 20 50 72 69 6e 74 20  yte);../* Print 
ced0: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
cee0: 20 74 68 65 20 22 50 61 72 73 65 72 20 53 74 61   the "Parser Sta
cef0: 74 73 22 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74  ts" output.*/.st
cf00: 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 73 5f  atic void stats_
cf10: 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61 72 20  line(const char 
cf20: 2a 7a 4c 61 62 65 6c 2c 20 69 6e 74 20 69 56 61  *zLabel, int iVa
cf30: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 61 62  lue){.  int nLab
cf40: 65 6c 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  el = lemonStrlen
cf50: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 70 72 69 6e  (zLabel);.  prin
cf60: 74 66 28 22 20 20 25 73 25 2e 2a 73 20 25 35 64  tf("  %s%.*s %5d
cf70: 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 0a 20 20 20  \n", zLabel,.   
cf80: 20 20 20 20 20 20 33 35 2d 6e 4c 61 62 65 6c 2c        35-nLabel,
cf90: 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e   "..............
cfa0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
cfb0: 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 69 56  ..",.         iV
cfc0: 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  alue);.}../* The
cfd0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20   main program.  
cfe0: 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
cff0: 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74  d line and do it
d000: 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ... */.int main(
d010: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
d020: 2a 61 72 67 76 29 0a 7b 0a 20 20 73 74 61 74 69  *argv).{.  stati
d030: 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20  c int version = 
d040: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
d050: 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  rpflag = 0;.  st
d060: 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c  atic int basisfl
d070: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
d080: 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20   int compress = 
d090: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
d0a0: 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61  quiet = 0;.  sta
d0b0: 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69  tic int statisti
d0c0: 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  cs = 0;.  static
d0d0: 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b   int mhflag = 0;
d0e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .  static int no
d0f0: 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 30 3b  linenosflag = 0;
d100: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .  static int no
d110: 52 65 73 6f 72 74 20 3d 20 30 3b 0a 20 20 0a 20  Resort = 0;.  . 
d120: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73   static struct s
d130: 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73  _options options
d140: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f  [] = {.    {OPT_
d150: 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72  FLAG, "b", (char
d160: 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50  *)&basisflag, "P
d170: 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61  rint only the ba
d180: 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d  sis in report."}
d190: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
d1a0: 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f   "c", (char*)&co
d1b0: 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63  mpress, "Don't c
d1c0: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
d1d0: 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20  on table."},.   
d1e0: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 64 22 2c   {OPT_FSTR, "d",
d1f0: 20 28 63 68 61 72 2a 29 26 68 61 6e 64 6c 65 5f   (char*)&handle_
d200: 64 5f 6f 70 74 69 6f 6e 2c 20 22 4f 75 74 70 75  d_option, "Outpu
d210: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 44 65  t directory.  De
d220: 66 61 75 6c 74 20 27 2e 27 22 7d 2c 0a 20 20 20  fault '.'"},.   
d230: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44 22 2c   {OPT_FSTR, "D",
d240: 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44   (char*)handle_D
d250: 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65  _option, "Define
d260: 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63 72 6f   an %ifdef macro
d270: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53  ."},.    {OPT_FS
d280: 54 52 2c 20 22 66 22 2c 20 30 2c 20 22 49 67 6e  TR, "f", 0, "Ign
d290: 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c  ored.  (Placehol
d2a0: 64 65 72 20 66 6f 72 20 2d 66 20 63 6f 6d 70 69  der for -f compi
d2b0: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
d2c0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
d2d0: 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66  "g", (char*)&rpf
d2e0: 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d  lag, "Print gram
d2f0: 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69  mar without acti
d300: 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ons."},.    {OPT
d310: 5f 46 53 54 52 2c 20 22 49 22 2c 20 30 2c 20 22  _FSTR, "I", 0, "
d320: 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65  Ignored.  (Place
d330: 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 49 27 20  holder for '-I' 
d340: 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73  compiler options
d350: 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  .)"},.    {OPT_F
d360: 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72 2a  LAG, "m", (char*
d370: 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70 75  )&mhflag, "Outpu
d380: 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73 20  t a makeheaders 
d390: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 2e  compatible file.
d3a0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d3b0: 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a 29 26  G, "l", (char*)&
d3c0: 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20 22  nolinenosflag, "
d3d0: 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c 69  Do not print #li
d3e0: 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 22 7d  ne statements."}
d3f0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
d400: 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65   "O", 0, "Ignore
d410: 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72  d.  (Placeholder
d420: 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d 70 69 6c   for '-O' compil
d430: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
d440: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
d450: 70 22 2c 20 28 63 68 61 72 2a 29 26 73 68 6f 77  p", (char*)&show
d460: 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69  PrecedenceConfli
d470: 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
d480: 20 20 20 20 20 20 20 20 22 53 68 6f 77 20 63 6f          "Show co
d490: 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c 76 65 64  nflicts resolved
d4a0: 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 20 72   by precedence r
d4b0: 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ules"},.    {OPT
d4c0: 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61  _FLAG, "q", (cha
d4d0: 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75 69  r*)&quiet, "(Qui
d4e0: 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20  et) Don't print 
d4f0: 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e  the report file.
d500: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d510: 47 2c 20 22 72 22 2c 20 28 63 68 61 72 2a 29 26  G, "r", (char*)&
d520: 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f 20 6e 6f  noResort, "Do no
d530: 74 20 73 6f 72 74 20 6f 72 20 72 65 6e 75 6d 62  t sort or renumb
d540: 65 72 20 73 74 61 74 65 73 22 7d 2c 0a 20 20 20  er states"},.   
d550: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c   {OPT_FLAG, "s",
d560: 20 28 63 68 61 72 2a 29 26 73 74 61 74 69 73 74   (char*)&statist
d570: 69 63 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ics,.           
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 20 20 20 22 50 72 69 6e 74 20 70          "Print p
d5a0: 61 72 73 65 72 20 73 74 61 74 73 20 74 6f 20 73  arser stats to s
d5b0: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22  tandard output."
d5c0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
d5d0: 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76  , "x", (char*)&v
d5e0: 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74  ersion, "Print t
d5f0: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
d600: 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  r."},.    {OPT_F
d610: 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61 72 2a  STR, "T", (char*
d620: 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e  )handle_T_option
d630: 2c 20 22 53 70 65 63 69 66 79 20 61 20 74 65 6d  , "Specify a tem
d640: 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a 20  plate file."},. 
d650: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 57     {OPT_FSTR, "W
d660: 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20  ", 0, "Ignored. 
d670: 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f   (Placeholder fo
d680: 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c 65 72 20  r '-W' compiler 
d690: 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20  options.)"},.   
d6a0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30   {OPT_FLAG,0,0,0
d6b0: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
d6c0: 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a    int exitcode;.
d6d0: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c    struct lemon l
d6e0: 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  em;.  struct rul
d6f0: 65 20 2a 72 70 3b 0a 0a 20 20 4f 70 74 49 6e 69  e *rp;..  OptIni
d700: 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73  t(argv,options,s
d710: 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65  tderr);.  if( ve
d720: 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72  rsion ){.     pr
d730: 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73  intf("Lemon vers
d740: 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20  ion 1.0\n");.   
d750: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
d760: 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21   if( OptNArgs()!
d770: 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =1 ){.    fprint
d780: 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c  f(stderr,"Exactl
d790: 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61  y one filename a
d7a0: 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69  rgument is requi
d7b0: 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  red.\n");.    ex
d7c0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  it(1);.  }.  mem
d7d0: 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a  set(&lem, 0, siz
d7e0: 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d  eof(lem));.  lem
d7f0: 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a  .errorcnt = 0;..
d800: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
d810: 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  the machine */. 
d820: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b   Strsafe_init();
d830: 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  .  Symbol_init()
d840: 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29  ;.  State_init()
d850: 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20  ;.  lem.argv0 = 
d860: 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66  argv[0];.  lem.f
d870: 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67  ilename = OptArg
d880: 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73  (0);.  lem.basis
d890: 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67  flag = basisflag
d8a0: 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f  ;.  lem.nolineno
d8b0: 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f  sflag = nolineno
d8c0: 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f  sflag;.  Symbol_
d8d0: 6e 65 77 28 22 24 22 29 3b 0a 0a 20 20 2f 2a 20  new("$");..  /* 
d8e0: 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
d8f0: 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28  file */.  Parse(
d900: 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d  &lem);.  if( lem
d910: 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74  .errorcnt ) exit
d920: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a  (lem.errorcnt);.
d930: 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d    if( lem.nrule=
d940: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
d950: 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20  f(stderr,"Empty 
d960: 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20  grammar.\n");.  
d970: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
d980: 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79   lem.errsym = Sy
d990: 6d 62 6f 6c 5f 66 69 6e 64 28 22 65 72 72 6f 72  mbol_find("error
d9a0: 22 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  ");..  /* Count 
d9b0: 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20 73 79  and index the sy
d9c0: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
d9d0: 6d 6d 61 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c  mmar */.  Symbol
d9e0: 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22  _new("{default}"
d9f0: 29 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  );.  lem.nsymbol
da00: 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28   = Symbol_count(
da10: 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  );.  lem.symbols
da20: 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   = Symbol_arrayo
da30: 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f();.  for(i=0; 
da40: 69 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69  i<lem.nsymbol; i
da50: 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  ++) lem.symbols[
da60: 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20  i]->index = i;. 
da70: 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f   qsort(lem.symbo
da80: 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73  ls,lem.nsymbol,s
da90: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
daa0: 62 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70  bol*), Symbolcmp
dab0: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
dac0: 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  <lem.nsymbol; i+
dad0: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
dae0: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
daf0: 77 68 69 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f  while( lem.symbo
db00: 6c 73 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d  ls[i-1]->type==M
db10: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20  ULTITERMINAL ){ 
db20: 69 2d 2d 3b 20 7d 0a 20 20 61 73 73 65 72 74 28  i--; }.  assert(
db30: 20 73 74 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62   strcmp(lem.symb
db40: 6f 6c 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22  ols[i-1]->name,"
db50: 7b 64 65 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29  {default}")==0 )
db60: 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  ;.  lem.nsymbol 
db70: 3d 20 69 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69  = i - 1;.  for(i
db80: 3d 31 3b 20 49 53 55 50 50 45 52 28 6c 65 6d 2e  =1; ISUPPER(lem.
db90: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
dba0: 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65  [0]); i++);.  le
dbb0: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b  m.nterminal = i;
dbc0: 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 73 65  ..  /* Assign se
dbd0: 71 75 65 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75  quential rule nu
dbe0: 6d 62 65 72 73 2e 20 20 53 74 61 72 74 20 77 69  mbers.  Start wi
dbf0: 74 68 20 30 2e 20 20 50 75 74 20 72 75 6c 65 73  th 0.  Put rules
dc00: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 0a 20 20   that have no.  
dc10: 2a 2a 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  ** reduce action
dc20: 20 43 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74   C-code associat
dc30: 65 64 20 77 69 74 68 20 74 68 65 6d 20 6c 61 73  ed with them las
dc40: 74 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  t, so that the s
dc50: 77 69 74 63 68 28 29 0a 20 20 2a 2a 20 73 74 61  witch().  ** sta
dc60: 74 65 6d 65 6e 74 20 74 68 61 74 20 73 65 6c 65  tement that sele
dc70: 63 74 73 20 72 65 64 75 63 74 69 6f 6e 20 61 63  cts reduction ac
dc80: 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20  tions will have 
dc90: 61 20 73 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74  a smaller jump t
dca0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  able..  */.  for
dcb0: 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c  (i=0, rp=lem.rul
dcc0: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
dcd0: 78 74 29 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75  xt){.    rp->iRu
dce0: 6c 65 20 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20  le = rp->code ? 
dcf0: 69 2b 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20  i++ : -1;.  }.  
dd00: 66 6f 72 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b  for(rp=lem.rule;
dd10: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
dd20: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 69  ){.    if( rp->i
dd30: 52 75 6c 65 3c 30 20 29 20 72 70 2d 3e 69 52 75  Rule<0 ) rp->iRu
dd40: 6c 65 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  le = i++;.  }.  
dd50: 6c 65 6d 2e 73 74 61 72 74 52 75 6c 65 20 3d 20  lem.startRule = 
dd60: 6c 65 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e  lem.rule;.  lem.
dd70: 72 75 6c 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74  rule = Rule_sort
dd80: 28 6c 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f  (lem.rule);..  /
dd90: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
dda0: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
ddb0: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
ddc0: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
ddd0: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
dde0: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
ddf0: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
de00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
de10: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
de20: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
de30: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
de40: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
de50: 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a  .nterminal+1);..
de60: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
de70: 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65  precedence for e
de80: 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20  very production 
de90: 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f  rule (that has o
dea0: 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52  ne) */.    FindR
deb0: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 26  ulePrecedences(&
dec0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
ded0: 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61  mpute the lambda
dee0: 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e  -nonterminals an
def0: 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74 73  d the first-sets
df00: 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a   for every.    *
df10: 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f  * nonterminal */
df20: 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53 65  .    FindFirstSe
df30: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
df40: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
df50: 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73  (0) states.  Als
df60: 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d  o record follow-
df70: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a  set propagation.
df80: 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20      ** links so 
df90: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  that the follow-
dfa0: 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  set can be compu
dfb0: 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20  ted later */.   
dfc0: 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b   lem.nstate = 0;
dfd0: 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73 28  .    FindStates(
dfe0: 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73  &lem);.    lem.s
dff0: 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72  orted = State_ar
e000: 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a  rayof();..    /*
e010: 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e   Tie up loose en
e020: 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67  ds on the propag
e030: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
e040: 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65     FindLinks(&le
e050: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
e060: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73  ute the follow s
e070: 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64 75  et of every redu
e080: 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  cible configurat
e090: 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46  ion */.    FindF
e0a0: 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b  ollowSets(&lem);
e0b0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
e0c0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
e0d0: 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63  es */.    FindAc
e0e0: 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tions(&lem);..  
e0f0: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68    /* Compress th
e100: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
e110: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72  */.    if( compr
e120: 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73  ess==0 ) Compres
e130: 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a  sTables(&lem);..
e140: 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61      /* Reorder a
e150: 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20  nd renumber the 
e160: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
e170: 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
e180: 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20   choices.    ** 
e190: 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
e1a0: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
e1b0: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
e1c0: 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20  helps make the. 
e1d0: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
e1e0: 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d  parser tables sm
e1f0: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66  aller. */.    if
e200: 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20  ( noResort==0 ) 
e210: 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65  ResortStates(&le
e220: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
e230: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
e240: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
e250: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
e260: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
e270: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
e280: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
e290: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
e2a0: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
e2b0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
e2c0: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
e2d0: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
e2e0: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
e2f0: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
e300: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
e310: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
e320: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
e330: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
e340: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
e350: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
e360: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
e370: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
e380: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
e390: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
e3a0: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
e3b0: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
e3c0: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
e3d0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
e3e0: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
e3f0: 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73  :\n");.    stats
e400: 5f 6c 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20  _line("terminal 
e410: 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74  symbols", lem.nt
e420: 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74  erminal);.    st
e430: 61 74 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65  ats_line("non-te
e440: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c  rminal symbols",
e450: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c   lem.nsymbol - l
e460: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20  em.nterminal);. 
e470: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74     stats_line("t
e480: 6f 74 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  otal symbols", l
e490: 65 6d 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20  em.nsymbol);.   
e4a0: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c   stats_line("rul
e4b0: 65 73 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  es", lem.nrule);
e4c0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e4d0: 22 73 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78  "states", lem.nx
e4e0: 73 74 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74  state);.    stat
e4f0: 73 5f 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74  s_line("conflict
e500: 73 22 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  s", lem.nconflic
e510: 74 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  t);.    stats_li
e520: 6e 65 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65  ne("action table
e530: 20 65 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e   entries", lem.n
e540: 61 63 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20  actiontab);.    
e550: 73 74 61 74 73 5f 6c 69 6e 65 28 22 6c 6f 6f 6b  stats_line("look
e560: 61 68 65 61 64 20 74 61 62 6c 65 20 65 6e 74 72  ahead table entr
e570: 69 65 73 22 2c 20 6c 65 6d 2e 6e 6c 6f 6f 6b 61  ies", lem.nlooka
e580: 68 65 61 64 74 61 62 29 3b 0a 20 20 20 20 73 74  headtab);.    st
e590: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
e5a0: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
e5b0: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
e5c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
e5d0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
e5e0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
e5f0: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
e600: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
e610: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
e620: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
e630: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
e640: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
e650: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
e660: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
e670: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
e680: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
e690: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
e6a0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
e6b0: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
e6e0: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
e710: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
e720: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
e730: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
e740: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
e750: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
e760: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
e770: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
e780: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
e790: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
e7a0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
e7b0: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
e7c0: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
e7d0: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
e7e0: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
e7f0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
e800: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
e810: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
e820: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
e830: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
e840: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
e850: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
e860: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
e870: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
e880: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
e890: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
e8a0: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
e8b0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
e8c0: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
e8d0: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
e8e0: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
e8f0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
e900: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
e910: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
e920: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
e930: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
e940: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
e950: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
e960: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
e970: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
e980: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
e990: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e9a0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
e9b0: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
e9c0: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
e9d0: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
e9e0: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
e9f0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
ea00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
ea10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ea20: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
ea30: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
ea40: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
ea50: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
ea60: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
ea70: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
ea80: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
ea90: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
eaa0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
eab0: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
eac0: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
ead0: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
eae0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
eaf0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
eb00: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
eb10: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
eb20: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
eb30: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
eb40: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
eb50: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
eb60: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
eb70: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
eb80: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
eb90: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
eba0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
ebb0: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
ebc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
ebd0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
ebe0: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
ebf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
ec00: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
ec10: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
ec20: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
ec30: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
ec40: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
ec50: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
ec60: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
ec70: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
ec80: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
ec90: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
eca0: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
ecb0: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
ecc0: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
ecd0: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
ece0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
ecf0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
ed00: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
ed10: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
ed20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
ed30: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
ed40: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
ed50: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
ed60: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
ed70: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
ed80: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
ed90: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
eda0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
edb0: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
edc0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
edd0: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
ede0: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
edf0: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
ee00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
ee10: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
ee20: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
ee30: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
ee40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ee50: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
ee60: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
ee70: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
ee80: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
ee90: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
eea0: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
eeb0: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
eec0: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
eed0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
eee0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
eef0: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
ef00: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
ef10: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
ef20: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
ef30: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
ef40: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
ef50: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
ef60: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
ef70: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
ef80: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
ef90: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
efa0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
efb0: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
efc0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
efd0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
efe0: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
eff0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
f000: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
f010: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
f020: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
f030: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
f040: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
f050: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
f060: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
f070: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
f080: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
f090: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
f0a0: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
f0b0: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
f0c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
f0d0: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
f0e0: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
f0f0: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
f100: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
f110: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
f120: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
f130: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
f140: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
f150: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
f160: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
f170: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
f180: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
f190: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
f1a0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
f1b0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
f1c0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
f1d0: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
f1e0: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
f1f0: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
f200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
f210: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
f220: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
f230: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
f240: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
f250: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
f260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f270: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
f280: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
f290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2a0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
f2b0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
f2c0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
f2d0: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
f2e0: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
f2f0: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
f300: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
f310: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
f320: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
f330: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
f340: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
f350: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
f360: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
f370: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
f380: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
f390: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
f3a0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
f3b0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
f3c0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
f3d0: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
f3e0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
f3f0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
f400: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
f410: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
f420: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
f430: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
f440: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
f450: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
f460: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
f470: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
f480: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
f490: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
f4a0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
f4b0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
f4c0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
f4d0: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
f4e0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
f4f0: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
f500: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
f510: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
f520: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
f530: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
f540: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
f550: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
f560: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
f570: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
f580: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
f590: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
f5a0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
f5b0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
f5c0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
f5d0: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
f5e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
f5f0: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
f600: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
f610: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
f620: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
f630: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
f640: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f650: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
f660: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
f670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f680: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
f690: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
f6a0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
f6b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
f6c0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
f6d0: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
f6e0: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
f6f0: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
f700: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
f710: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
f720: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f730: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
f740: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
f750: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
f760: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
f770: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
f780: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
f790: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
f7a0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
f7b0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
f7c0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
f7d0: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
f7e0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
f7f0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
f800: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
f810: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
f820: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
f830: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f840: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
f850: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
f860: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f870: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
f880: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
f890: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
f8a0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
f8b0: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
f8c0: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
f8d0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f8e0: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
f8f0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
f900: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
f910: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f920: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
f930: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
f940: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
f950: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f960: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
f970: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
f980: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
f990: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
f9a0: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
f9b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f9c0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
f9d0: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
f9e0: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
f9f0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
fa00: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
fa10: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
fa20: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
fa30: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
fa40: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
fa50: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
fa60: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
fa70: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
fa80: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
fa90: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
faa0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
fab0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
fac0: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
fad0: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
fae0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
faf0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
fb00: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
fb10: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
fb20: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
fb30: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
fb40: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
fb50: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
fb60: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
fb70: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
fb80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
fb90: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
fba0: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
fbb0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
fbc0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
fbd0: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
fbe0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
fbf0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
fc00: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
fc10: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
fc20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
fc30: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
fc40: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
fc50: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
fc60: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
fc70: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
fc80: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
fc90: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
fca0: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
fcb0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
fcc0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
fcd0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
fce0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
fcf0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
fd00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
fd10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
fd20: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
fd30: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
fd40: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
fd50: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
fd60: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
fd70: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
fd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
fd90: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
fda0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
fdb0: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
fdc0: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
fdd0: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
fde0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
fdf0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
fe00: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
fe10: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
fe20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
fe30: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
fe40: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
fe50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fe60: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
fe70: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fe80: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
fe90: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
fea0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
feb0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
fec0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
fed0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
fee0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
fef0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
ff00: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
ff10: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
ff20: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
ff30: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
ff40: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
ff50: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
ff60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
ff70: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
ff80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ff90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
ffa0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
ffb0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
ffc0: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
ffd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ffe0: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
fff0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
10000 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
10010 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
10020 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
10030 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
10040 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
10050 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
10060 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
10070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10080 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
10090 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
100a0 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
100b0 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
100c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
100d0 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
100e0 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
100f0 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
10100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10110 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
10120 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
10130 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
10140 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
10150 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10160 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10170 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
10180 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
10190 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
101a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
101b0 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
101c0 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
101d0 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
101e0 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
101f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10200 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
10210 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
10220 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
10230 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
10240 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
10250 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
10260 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
10270 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
10280 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
10290 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
102a0 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
102b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
102c0 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
102d0 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
102e0 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
102f0 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
10300 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
10310 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
10320 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
10330 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
10340 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
10350 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
10360 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
10370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10380 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
10390 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
103a0 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
103b0 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
103c0 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
103d0 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
103e0 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
103f0 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
10400 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
10410 74 4e 41 72 67 73 28 76 6f 69 64 29 7b 0a 20 20  tNArgs(void){.  
10420 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
10430 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
10440 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10450 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b  argv!=0 && argv[
10460 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  0]!=0 ){.    for
10470 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
10480 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
10490 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
104a0 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74  T(argv[i]) ) cnt
104b0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
104c0 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
104d0 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
104e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
104f0 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a    return cnt;.}.
10500 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69 6e  .char *OptArg(in
10510 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
10520 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
10530 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30  );.  return i>=0
10540 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a   ? argv[i] : 0;.
10550 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 69  }..void OptErr(i
10560 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
10570 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
10580 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  n);.  if( i>=0 )
10590 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
105a0 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64  stream);.}..void
105b0 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 7b   OptPrint(void){
105c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
105d0 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
105e0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
105f0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
10600 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  ){.    len = lem
10610 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
10620 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73  abel) + 1;.    s
10630 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
10640 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
10650 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
10660 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
10670 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10680 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
10690 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
106a0 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
106b0 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20  len += 9;       
106c0 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69  /* length of "<i
106d0 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20  nteger>" */.    
106e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
106f0 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
10700 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
10710 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  BL:.        len 
10720 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 6;       /* l
10730 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e  ength of "<real>
10740 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
10750 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10760 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
10770 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
10780 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20       len += 8;  
10790 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
107a0 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a  f "<string>" */.
107b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
107c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e     }.    if( len
107d0 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e  >max ) max = len
107e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
107f0 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
10800 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
10810 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
10820 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
10830 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
10840 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
10850 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
10860 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c  am,"  -%-*s  %s\
10870 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62  n",max,op[i].lab
10880 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  el,op[i].message
10890 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
108a0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
108b0 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
108c0 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
108d0 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
108e0 72 65 61 6d 2c 22 20 20 2d 25 73 3c 69 6e 74 65  ream,"  -%s<inte
108f0 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ger>%*s  %s\n",o
10900 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10910 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10920 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10930 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f  ].label)-9),"",o
10940 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
10950 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10960 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
10970 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10980 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66  _FDBL:.        f
10990 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
109a0 2c 22 20 20 2d 25 73 3c 72 65 61 6c 3e 25 2a 73  ,"  -%s<real>%*s
109b0 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
109c0 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
109d0 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
109e0 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
109f0 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-6),"",op[i].me
10a00 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
10a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10a20 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
10a30 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
10a40 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
10a50 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
10a60 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
10a70 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
10a80 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
10a90 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
10aa0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
10ab0 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
10ac0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10af0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
10b00 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
10b30 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
10b40 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
10b50 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10b60 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
10b70 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10b80 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74  ser */.enum e_st
10b90 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49  ate {.  INITIALI
10ba0 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ZE,.  WAITING_FO
10bb0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
10bc0 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
10bd0 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41  CL_KEYWORD,.  WA
10be0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10bf0 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RG,.  WAITING_FO
10c00 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
10c10 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
10c20 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52  OR_ARROW,.  IN_R
10c30 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  HS,.  LHS_ALIAS_
10c40 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  1,.  LHS_ALIAS_2
10c50 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c  ,.  LHS_ALIAS_3,
10c60 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  RHS_ALIAS_1,.
10c70 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    RHS_ALIAS_2,. 
10c80 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
10c90 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _1,.  PRECEDENCE
10ca0 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e  _MARK_2,.  RESYN
10cb0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10cc0 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  OR,.  RESYNC_AFT
10cd0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20  ER_DECL_ERROR,. 
10ce0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
10cf0 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
10d00 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
10d10 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
10d20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
10d30 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54  LBACK_ID,.  WAIT
10d40 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
10d50 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10d60 4f 52 5f 43 4c 41 53 53 5f 49 44 2c 0a 20 20 57  OR_CLASS_ID,.  W
10d70 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
10d80 5f 54 4f 4b 45 4e 2c 0a 20 20 57 41 49 54 49 4e  _TOKEN,.  WAITIN
10d90 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45  G_FOR_TOKEN_NAME
10da0 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74  .};.struct pstat
10db0 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e {.  char *file
10dc0 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  name;       /* N
10dd0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
10de0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74   file */.  int t
10df0 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  okenlineno;     
10e00 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61   /* Linenumber a
10e10 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20  t which current 
10e20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a  token starts */.
10e30 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
10e40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10e50 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66  r of errors so f
10e60 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  ar */.  char *to
10e70 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a  kenstart;     /*
10e80 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74   Text of current
10e90 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
10ea0 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20  ct lemon *gp;   
10eb0 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74    /* Global stat
10ec0 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e  e vector */.  en
10ed0 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65  um e_state state
10ee0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
10ef0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10f00 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ser */.  struct 
10f10 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
10f20 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62  ;   /* The fallb
10f30 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ack token */.  s
10f40 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b  truct symbol *tk
10f50 63 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b  class;    /* Tok
10f60 65 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20  en class symbol 
10f70 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
10f80 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20  ol *lhs;        
10f90 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
10fa0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c  e of current rul
10fb0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10fc0 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
10fd0 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
10fe0 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he LHS */.  int 
10ff0 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
11000 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11010 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73   of right-hand s
11020 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e  ide symbols seen
11030 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
11040 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d  bol *rhs[MAXRHS]
11050 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c  ;  /* RHS symbol
11060 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
11070 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
11080 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72  ; /* Aliases for
11090 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c   each RHS symbol
110a0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
110b0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65  struct rule *pre
110c0 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72  vrule;     /* Pr
110d0 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73  evious rule pars
110e0 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
110f0 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
11100 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66     /* Keyword of
11110 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
11120 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61  /.  char **decla
11130 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f  rgslot;        /
11140 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
11150 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  aration argument
11160 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a   should be put *
11170 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69  /.  int insertLi
11180 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f  neMacro;       /
11190 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f  * Add #line befo
111a0 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69  re declaration i
111b0 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  nsert */.  int *
111c0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20  decllinenoslot; 
111d0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
111e0 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74  o write declarat
111f0 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ion line number 
11200 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
11210 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
11220 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
11230 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
11240 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
11250 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
11260 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
11270 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
11280 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
11290 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
112a0 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
112b0 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
112c0 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
112d0 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
112e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
112f0 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
11300 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
11310 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
11320 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
11330 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
11340 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
11350 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
11360 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20  onetoken(struct 
11370 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20  pstate *psp).{. 
11380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a   const char *x;.
11390 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
113a0 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
113b0 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
113c0 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
113d0 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
113e0 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
113f0 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
11400 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
11410 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11420 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
11430 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
11440 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
11450 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
11460 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
11470 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
11480 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
11490 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
114a0 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
114b0 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
114c0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
114d0 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
114e0 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
114f0 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
11500 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
11510 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11520 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
11530 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
11540 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11550 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11560 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
11570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49       }else if( I
11580 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SLOWER(x[0]) ){.
11590 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
115a0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
115b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
115c0 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
115d0 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
115e0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
115f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
11600 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
11610 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
11620 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
11630 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
11640 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
11650 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11660 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11670 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
11680 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72  re is no prior r
11690 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74  ule upon which t
116a0 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
116b0 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
116c0 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
116d0 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
116e0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
116f0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
11700 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
11710 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29  vrule->code!=0 )
11720 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11730 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11740 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11750 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d  eno,."Code fragm
11760 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e  ent beginning on
11770 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
11780 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
11790 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
117a0 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
117b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
117c0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
117d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
117e0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
117f0 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  >line = psp->tok
11800 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
11810 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
11820 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b  e->code = &x[1];
11830 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11840 70 72 65 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65  prevrule->noCode
11850 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
11860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11870 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  x[0]=='[' ){.   
11880 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11890 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
118a0 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  K_1;.      }else
118b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
118c0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
118d0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
118e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f  o,.          "To
118f0 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ken \"%s\" shoul
11900 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25  d be either \"%%
11910 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69  \" or a nontermi
11920 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20  nal name.",.    
11930 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
11940 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11950 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11960 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11970 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
11980 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  _1:.      if( !I
11990 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SUPPER(x[0]) ){.
119a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
119b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
119c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
119d0 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20  .          "The 
119e0 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
119f0 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d  l must be a term
11a00 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  inal.");.       
11a10 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11a30 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
11a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
11a50 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11a60 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11a70 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11a80 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72   "There is no pr
11a90 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69  ior rule to assi
11aa0 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22  gn precedence \"
11ab0 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  [%s]\".",x);.   
11ac0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11ad0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
11ae0 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
11af0 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20  ule->precsym!=0 
11b00 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
11b10 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11b20 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11b30 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20  no,."Precedence 
11b40 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e  mark on this lin
11b50 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
11b60 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
11b70 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
11b80 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
11b90 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bb0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
11bc0 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62  ->precsym = Symb
11bd0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11be0 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
11bf0 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
11c00 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62  _MARK_2;.      b
11c10 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
11c20 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
11c30 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11c40 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
11c50 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11c60 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11c70 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11c80 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d      "Missing \"]
11c90 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65  \" on precedence
11ca0 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20   mark.");.      
11cb0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11cc0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11cd0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11ce0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
11cf0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72  R_RULE;.      br
11d00 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11d10 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a  ITING_FOR_ARROW:
11d20 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11d30 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
11d40 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
11d50 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11d60 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
11d70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
11d80 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20  [0]=='(' ){.    
11d90 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11da0 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   LHS_ALIAS_1;.  
11db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11dc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11dd0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11de0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11df0 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20        "Expected 
11e00 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66  to see a \":\" f
11e10 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53  ollowing the LHS
11e20 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22   symbol \"%s\"."
11e30 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ,.          psp-
11e40 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11e50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11e60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11e70 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11e80 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11e90 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11eb0 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e LHS_ALIAS_1:. 
11ec0 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
11ed0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11ee0 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
11ef0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
11f00 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
11f10 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
11f20 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
11f30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11f40 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11f50 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11f60 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
11f70 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
11f80 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e  the LHS \"%s\"\n
11f90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
11fa0 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
11fb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11fc0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11fd0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11fe0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11ff0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
12000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12010 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32  case LHS_ALIAS_2
12020 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
12030 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
12040 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
12050 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20  S_ALIAS_3;.     
12060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12070 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12080 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12090 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
120a0 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
120b0 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
120c0 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
120d0 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
120e0 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
120f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12100 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12110 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
12120 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
12130 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12140 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
12150 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_3:.      if( 
12160 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
12170 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
12180 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
12190 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
121a0 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
121b0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
121c0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
121d0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
121e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
121f0 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c  sing \"->\" foll
12200 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c  owing: \"%s(%s)\
12210 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
12220 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70  psp->lhs->name,p
12230 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
12240 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12250 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12260 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
12270 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
12280 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
12290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
122a0 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20  ase IN_RHS:.    
122b0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
122c0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
122d0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20  t rule *rp;.    
122e0 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74      rp = (struct
122f0 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20   rule *)calloc( 
12300 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75  sizeof(struct ru
12310 6c 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  le) +.          
12320 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
12330 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
12340 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
12350 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31  r*)*psp->nrhs, 1
12360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12370 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
12380 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12390 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
123a0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
123b0 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c         "Can't al
123c0 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
123d0 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75  mory for this ru
123e0 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
123f0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12410 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
12420 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12430 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
12440 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c           rp->rul
12450 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  eline = psp->tok
12460 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
12470 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73      rp->rhs = (s
12480 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26  truct symbol**)&
12490 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rp[1];.         
124a0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20   rp->rhsalias = 
124b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28  (const char**)&(
124c0 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
124d0 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
124e0 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
124f0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
12500 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
12510 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
12520 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
12530 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
12540 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20  sp->alias[i];.  
12550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12560 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
12570 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
12580 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
12590 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
125a0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
125b0 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
125c0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
125d0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
125e0 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31    rp->noCode = 1
125f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
12600 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
12610 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
12620 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
12630 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
12640 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
12650 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
12660 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
12670 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
12680 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
12690 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
126a0 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
126b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
126c0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
126d0 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
126e0 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
126f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12700 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
12710 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20  ->next = rp;.   
12720 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
12730 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
12740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12750 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
12760 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d   = rp;.        }
12770 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12780 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12790 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
127a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
127b0 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b  ISALPHA(x[0]) ){
127c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
127d0 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
127e0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
127f0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12800 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12810 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12820 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
12830 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
12840 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
12850 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
12860 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
12870 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12880 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
12890 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
128a0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
128b0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
128c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
128d0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
128e0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
128f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12900 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
12910 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
12920 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20   psp->nrhs++;.  
12930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12940 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27  lse if( (x[0]=='
12950 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29  |' || x[0]=='/')
12960 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12970 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
12980 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
12990 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
129a0 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs-1];.        i
129b0 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55  f( msp->type!=MU
129c0 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
129d0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
129e0 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d  symbol *origsp =
129f0 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20   msp;.          
12a00 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79  msp = (struct sy
12a10 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31  mbol *) calloc(1
12a20 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
12a30 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
12a40 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
12a50 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
12a60 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
12a70 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
12a80 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
12a90 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
12aa0 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
12ab0 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
12ac0 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  **) calloc(1,siz
12ad0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
12ae0 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
12af0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
12b00 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
12b10 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
12b20 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
12b30 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
12b40 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
12b50 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
12b60 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
12b70 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
12b80 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
12b90 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
12ba0 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
12bb0 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
12bc0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
12bd0 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
12be0 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
12bf0 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
12c00 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
12c10 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
12c20 20 20 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52       if( ISLOWER
12c30 28 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45  (x[1]) || ISLOWE
12c40 52 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  R(msp->subsym[0]
12c50 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
12c60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12c70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12c80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
12ca0 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
12cb0 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
12cc0 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
12cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12ce0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12d00 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
12d10 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12d20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12d30 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
12d40 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
12d50 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12d60 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12d70 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12d80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
12d90 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
12da0 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
12db0 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
12dc0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12dd0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
12de0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12df0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12e00 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12e20 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
12e30 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
12e40 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12e50 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
12e60 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
12e70 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12e80 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
12e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12ea0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12eb0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12ec0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12ed0 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
12ee0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
12ef0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
12f00 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
12f10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
12f20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
12f30 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
12f40 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12f50 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12f60 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12f70 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
12f80 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12fa0 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
12fb0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12fc0 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
12fd0 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
12fe0 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
12ff0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13000 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13010 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13020 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
13030 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
13040 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
13050 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
13060 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
13070 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13080 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
13090 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
130a0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
130b0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
130c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
130d0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
130e0 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
130f0 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
13100 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
13110 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
13120 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
13130 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13140 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
13150 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
13160 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
13170 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13180 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
13190 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
131a0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
131b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
131c0 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
131d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
131e0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
131f0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
13200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13210 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13220 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13230 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13240 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
13250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13260 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13270 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
13280 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
13290 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
132a0 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
132b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
132c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
132d0 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
132e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
132f0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
13300 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
13310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13320 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13330 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
13340 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
13350 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13360 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
13370 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
13380 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13390 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
133a0 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
133b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
133c0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
133d0 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
133e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
133f0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
13400 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
13410 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
13420 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
13430 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13440 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13450 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
13460 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
13470 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13480 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13490 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
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 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
134c0 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
134d0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
134e0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
134f0 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
13500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13510 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61  rcmp(x,"parse_fa
13520 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ilure")==0 ){.  
13530 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13540 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
13550 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a  ->gp->failure);.
13560 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13570 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
13580 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
13590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
135a0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
135b0 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
135c0 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
135d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
135e0 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
135f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
13600 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
13610 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
13620 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
13630 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
13640 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
13650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13660 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
13670 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13680 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13690 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
136a0 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
136b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
136c0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
136d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
136e0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
136f0 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
13700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13710 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13720 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
13730 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
13740 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
13750 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13760 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13770 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
13780 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13790 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
137a0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
137b0 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
137c0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
137d0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
137e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
137f0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
13800 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
13810 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13820 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
13830 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
13840 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13850 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13870 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13880 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
13890 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
138a0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
138b0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
138c0 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
138d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
138e0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
138f0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13900 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13910 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
13920 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
13930 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
13940 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
13950 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
13960 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
13970 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13980 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13990 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
139a0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
139b0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
139c0 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
139d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
139e0 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
139f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13a00 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
13a10 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13a20 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13a30 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13a40 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13a50 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13a60 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
13a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13a80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13a90 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
13aa0 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
13ab0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13ac0 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
13ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13ae0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13af0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13b00 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13b10 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13b20 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
13b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13b40 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
13b50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13b60 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13b70 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
13b80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13b90 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
13ba0 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
13bb0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13bc0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f  = WAITING_FOR_TO
13bd0 4b 45 4e 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20  KEN_NAME;.      
13be0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13bf0 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29  mp(x,"wildcard")
13c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13c10 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13c20 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
13c30 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  RD_ID;.        }
13c40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13c50 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29  x,"token_class")
13c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13c70 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13c80 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
13c90 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
13ca0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
13cb0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13cc0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
13cd0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13ce0 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
13cf0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13d00 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
13d10 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13d20 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13d30 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13d40 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13d50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13d60 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13d70 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13d80 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13d90 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13da0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
13db0 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
13dc0 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
13dd0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
13de0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13df0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13e00 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13e10 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13e20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13e30 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
13e40 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
13e50 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
13e60 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b   if( !ISALPHA(x[
13e70 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13e80 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13e90 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
13ea0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
13eb0 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
13ec0 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 64  issing after %%d
13ed0 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
13ee0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
13ef0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13f00 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13f10 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
13f20 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
13f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13f40 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13f50 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
13f60 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13f70 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
13f80 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
13f90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13fa0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73  llinenoslot = &s
13fb0 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20  p->destLineno;. 
13fc0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
13fd0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b  rtLineMacro = 1;
13fe0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
13ff0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
14000 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
14010 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14020 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
14030 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
14040 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
14050 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
14060 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
14070 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14080 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
14090 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
140a0 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
140b0 6e 67 20 61 66 74 65 72 20 25 25 74 79 70 65 20  ng after %%type 
140c0 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
140d0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
140e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
140f0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
14100 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
14110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14120 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
14130 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
14140 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 20 20 20  l_find(x);.     
14150 20 20 20 69 66 28 28 73 70 29 20 26 26 20 28 73     if((sp) && (s
14160 70 2d 3e 64 61 74 61 74 79 70 65 29 29 7b 0a 20  p->datatype)){. 
14170 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
14180 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14190 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
141a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
141b0 79 6d 62 6f 6c 20 25 25 74 79 70 65 20 5c 22 25  ymbol %%type \"%
141c0 73 5c 22 20 61 6c 72 65 61 64 79 20 64 65 66 69  s\" already defi
141d0 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ned", x);.      
141e0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
141f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
14200 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
14210 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
14220 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
14230 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
14240 20 28 21 73 70 29 7b 0a 20 20 20 20 20 20 20 20   (!sp){.        
14250 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
14260 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
14280 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
14290 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
142a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
142b0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
142c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
142d0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
142e0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
142f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14300 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14310 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
14320 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
14330 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
14340 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
14350 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14360 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14370 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14380 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
14390 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  UPPER(x[0]) ){. 
143a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
143b0 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
143c0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
143d0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
143e0 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
143f0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
14400 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14410 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
14420 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14430 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
14440 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
14450 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
14460 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
14470 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14480 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14490 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
144a0 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
144b0 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
144c0 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
144d0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20  p->declassoc;.  
144e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
144f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
14500 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14510 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
14520 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14530 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
14540 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
14550 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
14560 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14570 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14590 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
145a0 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
145b0 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78  ( x[0]=='{' || x
145c0 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41  [0]=='\"' || ISA
145d0 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LNUM(x[0]) ){.  
145e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
145f0 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20   *zOld, *zNew;. 
14600 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75         char *zBu
14610 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  f, *z;.        i
14620 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e  nt nOld, n, nLin
14630 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61  e = 0, nNew, nBa
14640 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
14650 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
14660 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
14670 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
14680 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
14690 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
146a0 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
146b0 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
146c0 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
146d0 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
146e0 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
146f0 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
14700 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
14710 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
14720 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14730 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
14740 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
14750 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
14760 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
14770 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
14780 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
14790 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
147a0 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
147b0 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
147c0 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
147d0 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
14800 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
14810 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
14820 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
14830 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
14840 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
14850 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
14860 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
14870 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
14880 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
14890 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
148a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
148b0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
148c0 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
148d0 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
148e0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
148f0 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
14900 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
14910 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
14920 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
14930 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
14940 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
14950 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
14960 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
14970 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
14980 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
14990 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
149a0 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
149b0 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
149c0 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
149d0 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
149e0 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
149f0 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
14a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
14a10 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
14a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14a30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14a40 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
14a50 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
14a60 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
14a70 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14a80 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
14a90 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
14aa0 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
14ab0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
14ac0 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
14ad0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
14ae0 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
14af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14b00 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14b10 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
14b20 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14b30 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
14b40 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14b50 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
14b60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
14b70 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14b80 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
14b90 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
14ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
14bb0 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
14bc0 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
14bd0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
14be0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14bf0 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
14c00 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
14c10 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
14c20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
14c30 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14c40 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14c50 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14c70 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14c80 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14c90 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14ca0 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
14cb0 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
14cc0 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
14cd0 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
14ce0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14cf0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14d00 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14d10 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14d20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14d30 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
14d40 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
14d50 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
14d60 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14d70 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14d80 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14d90 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14da0 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50   }else if( !ISUP
14db0 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
14dc0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14dd0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14de0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14df0 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
14e00 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
14e10 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14e20 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14e30 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14e40 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
14e50 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
14e60 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
14e70 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
14e80 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
14e90 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
14ea0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
14eb0 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
14ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
14ed0 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
14ee0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
14ef0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
14f00 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
14f20 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
14f30 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
14f40 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
14f50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14f60 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f80 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
14f90 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
14fa0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
14fb0 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
14fc0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
14fd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14fe0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14ff0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
15000 4e 5f 4e 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a  N_NAME:.      /*
15010 20 54 6f 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68   Tokens do not h
15020 61 76 65 20 74 6f 20 62 65 20 64 65 63 6c 61 72  ave to be declar
15030 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
15040 42 75 74 20 74 68 65 79 20 63 61 6e 20 62 65 0a  But they can be.
15050 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
15060 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  r to control the
15070 69 72 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  ir assigned inte
15080 67 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ger number.  The
15090 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 20 20   number for.    
150a0 20 20 2a 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20    ** each token 
150b0 69 73 20 61 73 73 69 67 6e 65 64 20 77 68 65 6e  is assigned when
150c0 20 69 74 20 69 73 20 66 69 72 73 74 20 73 65 65   it is first see
150d0 6e 2e 20 20 53 6f 20 62 79 20 69 6e 63 6c 75 64  n.  So by includ
150e0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ing.      **.   
150f0 20 20 20 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e     **     %token
15100 20 4f 4e 45 20 54 57 4f 20 54 48 52 45 45 0a 20   ONE TWO THREE. 
15110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15120 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 67 72   early in the gr
15130 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 61 74  ammar file, that
15140 20 61 73 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63   assigns small c
15150 6f 6e 73 65 63 75 74 69 76 65 20 76 61 6c 75 65  onsecutive value
15160 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 61  s.      ** to ea
15170 63 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73  ch of the tokens
15180 20 4f 4e 45 20 54 57 4f 20 61 6e 64 20 54 48 52   ONE TWO and THR
15190 45 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  EE..      */.   
151a0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
151b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
151c0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
151d0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
151e0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
151f0 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
15200 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
15210 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
15220 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
15230 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
15240 20 22 25 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65   "%%token argume
15250 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
15260 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
15270 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
15280 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
15290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
152a0 28 76 6f 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77  (void)Symbol_new
152b0 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
152c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
152d0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
152e0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
152f0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
15300 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
15310 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
15320 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
15330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15340 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
15350 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
15360 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
15370 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
15380 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
15390 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
153a0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
153b0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
153c0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
153d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
153e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
153f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
15400 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
15410 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
15420 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
15430 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
15440 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
15450 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
15460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15470 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
15480 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
15490 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
154a0 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
154b0 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
154c0 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
154d0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
154e0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
154f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15500 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
15510 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
15520 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
15530 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
15540 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
15550 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
15560 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
15570 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
15580 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
15590 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
155a0 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
155b0 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
155c0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
155d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
155e0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
155f0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
15600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
15610 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
15620 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
15630 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
15640 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
15650 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
15660 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
15670 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
15680 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
15690 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
156a0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
156b0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
156c0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
156d0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
156e0 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
156f0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
15700 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
15710 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
15720 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
15730 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
15740 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
15750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15760 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
15770 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
15780 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
15790 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
157a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
157b0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
157c0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
157d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
157e0 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
157f0 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
15800 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
15810 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
15820 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
15830 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
15840 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
15850 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
15860 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15870 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
15880 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
15890 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
158a0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
158b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
158c0 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
158d0 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
158e0 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
158f0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15900 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
15910 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
15920 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
15930 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
15940 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15950 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15960 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
15970 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
15980 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
15990 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
159a0 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
159b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
159c0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
159d0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
159e0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
159f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15a00 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
15a10 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
15a20 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
15a30 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
15a40 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15a50 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15a60 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
15a70 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
15a80 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
15a90 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
15aa0 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
15ab0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
15ac0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
15ad0 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
15ae0 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
15af0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15b00 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
15b10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15b20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
15b30 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
15b40 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
15b50 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
15b60 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
15b70 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
15b80 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
15b90 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
15ba0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
15bb0 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
15bc0 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
15bd0 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
15be0 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
15bf0 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
15c00 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
15c10 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
15c20 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
15c30 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
15c40 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
15c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15c60 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
15c70 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
15c80 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
15c90 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
15ca0 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
15cb0 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
15cc0 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
15cd0 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15ce0 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
15cf0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
15d00 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15d10 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
15d20 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
15d30 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
15d40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15d50 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
15d60 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
15d70 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
15d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15d90 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
15da0 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
15db0 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
15dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15dd0 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
15de0 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
15df0 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
15e00 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
15e10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15e20 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
15e30 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
15e40 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
15e50 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
15e60 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
15e70 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
15e80 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
15e90 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
15ea0 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
15eb0 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
15ec0 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
15ed0 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
15ee0 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
15ef0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
15f00 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
15f10 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
15f20 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
15f30 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
15f40 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
15f50 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
15f60 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
15f70 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
15f80 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
15f90 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
15fa0 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
15fb0 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
15fc0 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
15fd0 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
15fe0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
15ff0 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
16000 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
16010 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16030 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
16040 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
16050 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
16060 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
16070 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
16080 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
16090 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
160a0 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
160b0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
160c0 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
160d0 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
160e0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
160f0 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
16100 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
16110 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
16120 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
16130 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
16140 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
16150 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
16160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
16170 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
16180 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16190 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
161a0 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
161b0 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
161c0 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
161d0 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
161e0 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
161f0 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
16200 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
16210 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
16220 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
16230 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
16240 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
16250 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
16260 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
16270 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
16280 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
16290 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
162a0 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
162b0 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
162c0 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
162d0 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
162e0 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
162f0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
16300 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
16310 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
16320 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
16330 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
16340 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
16350 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
16360 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
16370 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
16380 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
16390 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
163a0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
163b0 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
163c0 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
163d0 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
163e0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
163f0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
16400 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
16410 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
16420 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
16430 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
16440 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
16450 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
16460 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
16470 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
16480 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
16490 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
164a0 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
164b0 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
164c0 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
164d0 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
164e0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
164f0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
16500 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
16510 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
16520 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
16530 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
16540 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16550 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
16560 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
16570 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
16580 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
16590 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
165a0 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
165b0 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
165c0 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
165d0 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
165e0 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
165f0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
16600 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
16610 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
16620 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
16630 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
16640 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
16650 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
16660 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
16670 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
16680 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
16690 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
166a0 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
166b0 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
166c0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
166d0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
166e0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
166f0 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
16700 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
16710 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
16720 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
16730 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
16740 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
16750 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
16760 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20 63   ISSPACE(c) ){ c
16770 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
16780 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
16790 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
167a0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
167b0 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
167c0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
167d0 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
167e0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
167f0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
16800 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
16810 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
16820 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
16830 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
16840 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
16850 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
16860 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
16870 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
16880 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
16890 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
168a0 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
168b0 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
168c0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
168d0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
168e0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
168f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
16900 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
16910 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
16920 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
16930 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
16940 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
16950 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16960 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
16970 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
16980 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
16990 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
169a0 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
169b0 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
169c0 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169e0 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
169f0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
16a00 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16a10 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
16a20 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
16a30 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16a40 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
16a50 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
16a60 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
16a70 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
16a80 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
16a90 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
16aa0 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
16ab0 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
16ac0 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
16ad0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
16ae0 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
16af0 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
16b00 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
16b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16b20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
16b30 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
16b40 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
16b50 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
16b60 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
16b70 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
16b80 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
16b90 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
16ba0 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
16bb0 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
16bc0 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
16bd0 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
16be0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16bf0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
16c00 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
16c10 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
16c20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
16c30 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
16c40 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16c50 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16c60 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
16c70 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16c80 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
16c90 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
16ca0 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
16cb0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
16cc0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16cd0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
16ce0 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
16cf0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
16d00 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16d10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16d20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
16d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
16d40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16d50 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16d60 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16d70 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
16d80 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
16d90 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
16da0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
16db0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
16dc0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
16dd0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
16de0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
16df0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
16e00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16e10 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
16e20 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
16e30 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
16e40 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
16e50 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
16e60 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
16e70 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
16e80 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
16e90 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
16ea0 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
16eb0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
16ec0 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
16ed0 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
16ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16ef0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16f00 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
16f10 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
16f20 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
16f30 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
16f50 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
16f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16f80 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
16f90 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
16fa0 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
16fb0 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
16fc0 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
16fd0 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
16fe0 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
16ff0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
17000 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
17010 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
17020 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
17030 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17040 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
17050 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
17060 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c 4e   }else if( ISALN
17070 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  UM(c) ){        
17080 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
17090 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
170a0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
170b0 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
170c0 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
170d0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
170e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
170f0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
17100 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
17110 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
17120 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
17130 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
17140 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
17150 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
17160 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
17170 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70 5b  ) && ISALPHA(cp[
17180 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
17190 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
171a0 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
171b0 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
171c0 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
171d0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
171e0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
17210 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
17220 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
17230 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
17240 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
17250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
17260 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
17270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17280 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
17290 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
172a0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
172b0 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
172c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
172d0 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
172e0 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
172f0 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
17300 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
17310 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
17320 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
17330 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
17340 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
17350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
17360 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
17370 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
17380 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
17390 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
173a0 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
173b0 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
173c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173d0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
173e0 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
173f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17400 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
17410 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
17420 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
17430 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
17440 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
17450 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
17460 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
17470 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
17480 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
17490 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
174a0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
174b0 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
174c0 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69  k *Plink_new(voi
174d0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  d){.  struct pli
174e0 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20  nk *newlink;..  
174f0 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
17500 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
17510 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
17520 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
17530 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
17540 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c  uct plink *)call
17550 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
17560 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b  struct plink) );
17570 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66  .    if( plink_f
17580 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
17590 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
175a0 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c  rr,.      "Unabl
175b0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
175c0 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66  mory for a new f
175d0 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
175e0 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b  ation link.\n");
175f0 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
17600 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
17610 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
17620 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
17630 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b  i].next = &plink
17640 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  _freelist[i+1];.
17650 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
17660 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
17670 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e   0;.  }.  newlin
17680 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  k = plink_freeli
17690 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
176a0 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
176b0 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
176c0 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d  eturn newlink;.}
176d0 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b  ../* Add a plink
176e0 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74   to a plink list
176f0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61   */.void Plink_a
17700 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  dd(struct plink 
17710 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63  **plpp, struct c
17720 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
17730 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
17740 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b  wlink;.  newlink
17750 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a   = Plink_new();.
17760 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20    newlink->next 
17770 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
17780 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65   = newlink;.  ne
17790 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70  wlink->cfp = cfp
177a0 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
177b0 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
177c0 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
177d0 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
177e0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
177f0 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
17800 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c   **to, struct pl
17810 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73  ink *from).{.  s
17820 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
17830 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72  tpl;.  while( fr
17840 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  om ){.    nextpl
17850 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20   = from->next;. 
17860 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20     from->next = 
17870 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66  *to;.    *to = f
17880 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20  rom;.    from = 
17890 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nextpl;.  }.}../
178a0 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70  * Delete every p
178b0 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
178c0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64   */.void Plink_d
178d0 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
178e0 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72  nk *plp).{.  str
178f0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
17900 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
17910 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
17920 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
17930 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
17940 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
17950 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
17960 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
17970 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
179a0 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
179d0 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
179e0 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
179f0 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
17a00 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
17a10 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
17a20 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
17a30 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
17a40 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
17a50 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
17a60 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
17a70 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
17a80 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
17a90 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
17aa0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
17ab0 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
17ac0 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75  le_makename(stru
17ad0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
17ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
17af0 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61  ix).{.  char *na
17b00 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
17b10 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
17b20 20 3d 20 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d   = lemp->filenam
17b30 65 3b 0a 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20  e;.  int sz;..  
17b40 69 66 28 20 6f 75 74 70 75 74 44 69 72 20 29 7b  if( outputDir ){
17b50 0a 20 20 20 20 63 70 20 3d 20 73 74 72 72 63 68  .    cp = strrch
17b60 72 28 66 69 6c 65 6e 61 6d 65 2c 20 27 2f 27 29  r(filename, '/')
17b70 3b 0a 20 20 20 20 69 66 28 20 63 70 20 29 20 66  ;.    if( cp ) f
17b80 69 6c 65 6e 61 6d 65 20 3d 20 63 70 20 2b 20 31  ilename = cp + 1
17b90 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 6c 65 6d  ;.  }.  sz = lem
17ba0 6f 6e 53 74 72 6c 65 6e 28 66 69 6c 65 6e 61 6d  onStrlen(filenam
17bb0 65 29 3b 0a 20 20 73 7a 20 2b 3d 20 6c 65 6d 6f  e);.  sz += lemo
17bc0 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29 3b  nStrlen(suffix);
17bd0 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72  .  if( outputDir
17be0 20 29 20 73 7a 20 2b 3d 20 6c 65 6d 6f 6e 53 74   ) sz += lemonSt
17bf0 72 6c 65 6e 28 6f 75 74 70 75 74 44 69 72 29 20  rlen(outputDir) 
17c00 2b 20 31 3b 0a 20 20 73 7a 20 2b 3d 20 35 3b 0a  + 1;.  sz += 5;.
17c10 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29    name = (char*)
17c20 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b 0a 20 20  malloc( sz );.  
17c30 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
17c40 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17c50 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
17c60 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
17c70 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
17c80 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
17c90 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 69  name[0] = 0;.  i
17ca0 66 28 20 6f 75 74 70 75 74 44 69 72 20 29 7b 0a  f( outputDir ){.
17cb0 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
17cc0 28 6e 61 6d 65 2c 20 6f 75 74 70 75 74 44 69 72  (name, outputDir
17cd0 29 3b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  );.    lemon_str
17ce0 63 61 74 28 6e 61 6d 65 2c 20 22 2f 22 29 3b 0a  cat(name, "/");.
17cf0 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63    }.  lemon_strc
17d00 61 74 28 6e 61 6d 65 2c 66 69 6c 65 6e 61 6d 65  at(name,filename
17d10 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  );.  cp = strrch
17d20 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  r(name,'.');.  i
17d30 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b  f( cp ) *cp = 0;
17d40 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  .  lemon_strcat(
17d50 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20  name,suffix);.  
17d60 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a  return name;.}..
17d70 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77  /* Open a file w
17d80 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64  ith a name based
17d90 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   on the name of 
17da0 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a  the input file,.
17db0 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64 69  ** but with a di
17dc0 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66 69  fferent (specifi
17dd0 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ed) suffix, and 
17de0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
17df0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61  .** to the strea
17e00 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  m */.PRIVATE FIL
17e10 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20  E *file_open(.  
17e20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17e30 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp,.  const char
17e40 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73   *suffix,.  cons
17e50 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a  t char *mode.){.
17e60 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
17e70 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
17e80 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
17e90 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
17ea0 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
17eb0 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
17ec0 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
17ed0 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
17ee0 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
17ef0 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
17f00 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
17f10 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
17f20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
17f30 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
17f40 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
17f50 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
17f60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
17f70 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
17f80 50 72 69 6e 74 20 74 68 65 20 74 65 78 74 20 6f  Print the text o
17f90 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76 6f 69 64  f a rule.*/.void
17fa0 20 72 75 6c 65 5f 70 72 69 6e 74 28 46 49 4c 45   rule_print(FILE
17fb0 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
17fc0 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 69  le *rp){.  int i
17fd0 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  , j;.  fprintf(o
17fe0 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e 6c 68 73  ut, "%s",rp->lhs
17ff0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a 20 20 20  ->name);.  /*   
18000 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
18010 73 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  s ) fprintf(out,
18020 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c  "(%s)",rp->lhsal
18030 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70 72 69 6e  ias); */.  fprin
18040 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22 29 3b 0a  tf(out," ::=");.
18050 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
18060 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
18070 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
18080 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
18090 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
180a0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
180b0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
180c0 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
180d0 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
180e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  );.      for(j=1
180f0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
18100 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
18110 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22  printf(out,"|%s"
18120 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  , sp->subsym[j]-
18130 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
18140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18150 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
18160 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
18170 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 28 20     }.    /* if( 
18180 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18190 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28  ) fprintf(out,"(
181a0 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61  %s)",rp->rhsalia
181b0 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d 0a 7d 0a  s[i]); */.  }.}.
181c0 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
181d0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
181e0 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
181f0 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
18200 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f  s.** on rules */
18210 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74  .void Reprint(st
18220 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18230 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
18240 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
18250 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
18260 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
18270 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
18280 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
18290 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
182a0 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
182b0 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
182c0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
182d0 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
182e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
182f0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
18300 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
18310 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
18320 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
18330 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
18340 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
18350 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
18360 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
18370 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
18380 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
18390 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
183a0 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
183b0 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
183c0 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
183d0 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
183e0 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
183f0 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
18400 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
18410 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
18420 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
18430 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
18440 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
18450 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
18460 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
18470 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
18480 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
18490 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
184a0 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
184b0 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
184c0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
184d0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72  rp->next){.    r
184e0 75 6c 65 5f 70 72 69 6e 74 28 73 74 64 6f 75 74  ule_print(stdout
184f0 2c 20 72 70 29 3b 0a 20 20 20 20 70 72 69 6e 74  , rp);.    print
18500 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
18510 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
18520 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
18530 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
18540 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e  .    /* if( rp->
18550 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c  code ) printf("\
18560 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64  n    %s",rp->cod
18570 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  e); */.    print
18580 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f("\n");.  }.}..
18590 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  /* Print a singl
185a0 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e rule..*/.void 
185b0 52 75 6c 65 50 72 69 6e 74 28 46 49 4c 45 20 2a  RulePrint(FILE *
185c0 66 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  fp, struct rule 
185d0 2a 72 70 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  *rp, int iCursor
185e0 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  ){.  struct symb
185f0 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c  ol *sp;.  int i,
18600 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70   j;.  fprintf(fp
18610 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68  ,"%s ::=",rp->lh
18620 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
18630 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73  i=0; i<=rp->nrhs
18640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18650 69 3d 3d 69 43 75 72 73 6f 72 20 29 20 66 70 72  i==iCursor ) fpr
18660 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20  intf(fp," *");. 
18670 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
18680 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  hs ) break;.    
18690 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
186a0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
186b0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
186c0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
186d0 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e  f(fp," %s", sp->
186e0 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29  subsym[0]->name)
186f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ;.      for(j=1;
18700 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
18710 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  j++){.        fp
18720 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73  rintf(fp,"|%s",s
18730 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61  p->subsym[j]->na
18740 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
18750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
18760 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20  rintf(fp," %s", 
18770 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
18780 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
18790 20 74 68 65 20 72 75 6c 65 20 66 6f 72 20 61 20   the rule for a 
187a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
187b0 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69  /.void ConfigPri
187c0 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72  nt(FILE *fp, str
187d0 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29  uct config *cfp)
187e0 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70  {.  RulePrint(fp
187f0 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66 70 2d 3e  , cfp->rp, cfp->
18800 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64 65 66  dot);.}../* #def
18810 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20  ine TEST */.#if 
18820 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74  0./* Print a set
18830 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
18840 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65   SetPrint(out,se
18850 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75  t,lemp).FILE *ou
18860 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74  t;.char *set;.st
18870 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18880 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ;.{.  int i;.  c
18890 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73  har *spacer;.  s
188a0 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70  pacer = "";.  fp
188b0 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b  rintf(out,"%12s[
188c0 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ","");.  for(i=0
188d0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
188e0 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nal; i++){.    i
188f0 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69  f( SetFind(set,i
18900 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
18910 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70  tf(out,"%s%s",sp
18920 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  acer,lemp->symbo
18930 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
18940 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22      spacer = " "
18950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
18960 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29  rintf(out,"]\n")
18970 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
18980 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50  plink chain */.P
18990 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e  RIVATE void Plin
189a0 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74  kPrint(out,plp,t
189b0 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  ag).FILE *out;.s
189c0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
189d0 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20  ;.char *tag;.{. 
189e0 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
189f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
18a00 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32  %12s%s (state %2
18a10 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d  d) ","",tag,plp-
18a20 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65  >cfp->stp->state
18a30 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  num);.    Config
18a40 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63  Print(out,plp->c
18a50 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fp);.    fprintf
18a60 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  (out,"\n");.    
18a70 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b  plp = plp->next;
18a80 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
18a90 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f  * Print an actio
18aa0 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  n to the given f
18ab0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
18ac0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
18ad0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20  .** nothing was 
18ae0 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64  actually printed
18af0 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63  ..*/.int PrintAc
18b00 74 69 6f 6e 28 0a 20 20 73 74 72 75 63 74 20 61  tion(.  struct a
18b10 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20 20 20  ction *ap,      
18b20 20 20 20 20 2f 2a 20 54 68 65 20 61 63 74 69 6f      /* The actio
18b30 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20  n to print */.  
18b40 46 49 4c 45 20 2a 66 70 2c 20 20 20 20 20 20 20  FILE *fp,       
18b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
18b60 72 69 6e 74 20 74 68 65 20 61 63 74 69 6f 6e 20  rint the action 
18b70 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  here */.  int in
18b80 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  dent            
18b90 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e 74 20        /* Indent 
18ba0 62 79 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 2a  by this amount *
18bb0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  /.){.  int resul
18bc0 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
18bd0 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
18be0 20 63 61 73 65 20 53 48 49 46 54 3a 20 7b 0a 20   case SHIFT: {. 
18bf0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
18c00 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78 2e 73  e *stp = ap->x.s
18c10 74 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  tp;.      fprint
18c20 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
18c30 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e 64         %-7d",ind
18c40 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
18c50 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  ,stp->statenum);
18c60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18c70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44    }.    case RED
18c80 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 74 72  UCE: {.      str
18c90 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d 20 61  uct rule *rp = a
18ca0 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 66  p->x.rp;.      f
18cb0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
18cc0 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64  educe       %-7d
18cd0 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
18ce0 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65 29  >name,rp->iRule)
18cf0 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72 69 6e  ;.      RulePrin
18d00 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a 20  t(fp, rp, -1);. 
18d10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18d20 7d 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  }.    case SHIFT
18d30 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20  REDUCE: {.      
18d40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20  struct rule *rp 
18d50 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
18d60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18d70 73 20 73 68 69 66 74 2d 72 65 64 75 63 65 20 25  s shift-reduce %
18d80 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
18d90 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75  sp->name,rp->iRu
18da0 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50  le);.      RuleP
18db0 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29  rint(fp, rp, -1)
18dc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18dd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 41 43     }.    case AC
18de0 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69  CEPT:.      fpri
18df0 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65  ntf(fp,"%*s acce
18e00 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  pt",indent,ap->s
18e10 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
18e20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18e30 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72  ERROR:.      fpr
18e40 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72  intf(fp,"%*s err
18e50 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  or",indent,ap->s
18e60 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
18e70 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18e80 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  SRCONFLICT:.    
18e90 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a  case RRCONFLICT:
18ea0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
18eb0 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20  p,"%*s reduce   
18ec0 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72 73      %-7d ** Pars
18ed0 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
18ee0 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74  ,.        indent
18ef0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
18f00 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ->x.rp->iRule);.
18f10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18f20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43 54   case SSCONFLICT
18f30 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
18f40 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20  fp,"%*s shift   
18f50 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72       %-7d ** Par
18f60 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
18f70 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  ",.        inden
18f80 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
18f90 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
18fa0 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
18fb0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
18fc0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66  SOLVED:.      if
18fd0 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  ( showPrecedence
18fe0 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  Conflict ){.    
18ff0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
19000 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20 20  %*s shift       
19010 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-7d -- dropped
19020 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
19030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19040 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
19050 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
19060 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
19070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19080 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
19090 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
190a0 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
190b0 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
190c0 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
190d0 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
190e0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
190f0 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64 20 2d  *s reduce %-7d -
19100 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
19110 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
19120 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
19130 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
19140 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ->x.rp->iRule);.
19150 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19160 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
19170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
19180 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
19190 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
191a0 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
191b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
191c0 28 20 72 65 73 75 6c 74 20 26 26 20 61 70 2d 3e  ( result && ap->
191d0 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66 70 72  spOpt ){.    fpr
191e0 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20 62 65  intf(fp,"  /* be
191f0 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a 2f 22  cause %s==%s */"
19200 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 20  , ap->sp->name, 
19210 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d 65 29  ap->spOpt->name)
19220 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19230 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
19240 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74  erate the "*.out
19250 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
19260 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
19270 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
19280 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
19290 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
192a0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  tp;.  struct con
192b0 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
192c0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
192d0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
192e0 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  ;.  FILE *fp;.. 
192f0 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   fp = file_open(
19300 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22  lemp,".out","wb"
19310 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29  );.  if( fp==0 )
19320 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
19330 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74  =0; i<lemp->nxst
19340 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
19350 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
19360 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74  d[i];.    fprint
19370 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c  f(fp,"State %d:\
19380 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  n",stp->statenum
19390 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  );.    if( lemp-
193a0 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
193b0 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c  =stp->bp;.    el
193c0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
193d0 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70      cfp=stp->cfp
193e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70  ;.    while( cfp
193f0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62   ){.      char b
19400 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66  uf[20];.      if
19410 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d  ( cfp->dot==cfp-
19420 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20  >rp->nrhs ){.   
19430 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
19440 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66  tf(buf,"(%d)",cf
19450 70 2d 3e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20  p->rp->iRule);. 
19460 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
19470 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66  p,"    %5s ",buf
19480 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19490 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
194a0 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29  fp,"          ")
194b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
194c0 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63  ConfigPrint(fp,c
194d0 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  fp);.      fprin
194e0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66  tf(fp,"\n");.#if
194f0 20 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e   0.      SetPrin
19500 74 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65  t(fp,cfp->fws,le
19510 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  mp);.      Plink
19520 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70  Print(fp,cfp->fp
19530 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20  lp,"To  ");.    
19540 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
19550 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22  cfp->bplp,"From"
19560 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
19570 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
19580 6c 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62  lag ) cfp=cfp->b
19590 70 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20  p;.      else   
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
195b0 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  fp=cfp->next;.  
195c0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
195d0 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  fp,"\n");.    fo
195e0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
195f0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
19600 20 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41        if( PrintA
19610 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20  ction(ap,fp,30) 
19620 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e  ) fprintf(fp,"\n
19630 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ");.    }.    fp
19640 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
19650 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70    }.  fprintf(fp
19660 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  , "-------------
19670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19690 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66  -------\n");.  f
196a0 70 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62  printf(fp, "Symb
196b0 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28  ols:\n");.  for(
196c0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
196d0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
196e0 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63  int j;.    struc
196f0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20  t symbol *sp;.. 
19700 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
19710 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70  mbols[i];.    fp
19720 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64  rintf(fp, "  %3d
19730 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61  : %s", i, sp->na
19740 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  me);.    if( sp-
19750 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e  >type==NONTERMIN
19760 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  AL ){.      fpri
19770 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20  ntf(fp, ":");.  
19780 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62      if( sp->lamb
19790 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  da ){.        fp
197a0 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d  rintf(fp, " <lam
197b0 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  bda>");.      }.
197c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
197d0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
197e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
197f0 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74  if( sp->firstset
19800 20 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e   && SetFind(sp->
19810 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a  firstset, j) ){.
19820 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
19830 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d  f(fp, " %s", lem
19840 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e  p->symbols[j]->n
19850 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
19860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19870 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d    if( sp->prec>=
19880 30 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  0 ) fprintf(fp,"
19890 20 28 70 72 65 63 65 64 65 6e 63 65 3d 25 64 29   (precedence=%d)
198a0 22 2c 20 73 70 2d 3e 70 72 65 63 29 3b 0a 20 20  ", sp->prec);.  
198b0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c    fprintf(fp, "\
198c0 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n");.  }.  fprin
198d0 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  tf(fp, "--------
198e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
198f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
19910 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  ;.  fprintf(fp, 
19920 22 52 75 6c 65 73 3a 5c 6e 22 29 3b 0a 20 20 66  "Rules:\n");.  f
19930 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
19940 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
19950 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t){.    fprintf(
19960 66 70 2c 20 22 25 34 64 3a 20 22 2c 20 72 70 2d  fp, "%4d: ", rp-
19970 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 72 75 6c  >iRule);.    rul
19980 65 5f 70 72 69 6e 74 28 66 70 2c 20 72 70 29 3b  e_print(fp, rp);
19990 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
199a0 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70  ".");.    if( rp
199b0 2d 3e 70 72 65 63 73 79 6d 20 29 7b 0a 20 20 20  ->precsym ){.   
199c0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
199d0 5b 25 73 20 70 72 65 63 65 64 65 6e 63 65 3d 25  [%s precedence=%
199e0 64 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d]",.           
199f0 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e     rp->precsym->
19a00 6e 61 6d 65 2c 20 72 70 2d 3e 70 72 65 63 73 79  name, rp->precsy
19a10 6d 2d 3e 70 72 65 63 29 3b 0a 20 20 20 20 7d 0a  m->prec);.    }.
19a20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
19a30 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  \n");.  }.  fclo
19a40 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e  se(fp);.  return
19a50 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66  ;.}../* Search f
19a60 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d  or the file "nam
19a70 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20 74  e" which is in t
19a80 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
19a90 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63  y as.** the exac
19aa0 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54  utable */.PRIVAT
19ab0 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61 72  E char *pathsear
19ac0 63 68 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20  ch(char *argv0, 
19ad0 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20  char *name, int 
19ae0 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f  modemask).{.  co
19af0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69  nst char *pathli
19b00 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  st;.  char *path
19b10 62 75 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a  bufptr;.  char *
19b20 70 61 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20  pathbuf;.  char 
19b30 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61  *path,*cp;.  cha
19b40 72 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57  r c;..#ifdef __W
19b50 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74  IN32__.  cp = st
19b60 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27  rrchr(argv0,'\\'
19b70 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20  );.#else.  cp = 
19b80 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f  strrchr(argv0,'/
19b90 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ');.#endif.  if(
19ba0 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a   cp ){.    c = *
19bb0 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b  cp;.    *cp = 0;
19bc0 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
19bd0 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
19be0 6e 53 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b  nStrlen(argv0) +
19bf0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d   lemonStrlen(nam
19c00 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66  e) + 2 );.    if
19c10 28 20 70 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73  ( path ) lemon_s
19c20 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
19c30 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
19c40 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
19c50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
19c60 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
19c70 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
19c80 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
19c90 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
19ca0 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
19cb0 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
19cc0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
19cd0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
19ce0 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
19cf0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
19d00 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
19d10 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
19d20 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
19d30 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
19d40 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
19d50 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
19d60 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
19d70 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
19d80 63 70 79 28 70 61 74 68 62 75 66 2c 20 70 61 74  cpy(pathbuf, pat
19d90 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  hlist);.      wh
19da0 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b  ile( *pathbuf ){
19db0 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74  .        cp = st
19dc0 72 63 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27  rchr(pathbuf,':'
19dd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
19de0 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74  p==0 ) cp = &pat
19df0 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e  hbuf[lemonStrlen
19e00 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20  (pathbuf)];.    
19e10 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
19e20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20       *cp = 0;.  
19e30 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
19e40 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
19e50 2c 70 61 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a  ,pathbuf,name);.
19e60 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b          *cp = c;
19e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
19e80 30 20 29 20 70 61 74 68 62 75 66 5b 30 5d 20 3d  0 ) pathbuf[0] =
19e90 20 30 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65   0;.        else
19ea0 20 70 61 74 68 62 75 66 20 3d 20 26 63 70 5b 31   pathbuf = &cp[1
19eb0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
19ec0 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d  ccess(path,modem
19ed0 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ask)==0 ) break;
19ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
19ef0 72 65 65 28 70 61 74 68 62 75 66 70 74 72 29 3b  ree(pathbufptr);
19f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19f10 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
19f20 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
19f30 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
19f40 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
19f50 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
19f60 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
19f70 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
19f80 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
19f90 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
19fa0 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
19fb0 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
19fc0 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
19fd0 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
19fe0 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
19ff0 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  n(struct lemon *
1a000 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 61 63 74  lemp, struct act
1a010 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74  ion *ap).{.  int
1a020 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20   act;.  switch( 
1a030 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
1a040 63 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74  case SHIFT:  act
1a050 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74   = ap->x.stp->st
1a060 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a080 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1a090 48 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20  HIFTREDUCE: {.  
1a0a0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 61 20 53      /* Since a S
1a0b0 48 49 46 54 20 69 73 20 69 6e 68 65 72 69 65 6e  HIFT is inherien
1a0c0 74 20 61 66 74 65 72 20 61 20 70 72 69 6f 72 20  t after a prior 
1a0d0 52 45 44 55 43 45 2c 20 63 6f 6e 76 65 72 74 20  REDUCE, convert 
1a0e0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 53 48 49  any.      ** SHI
1a0f0 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  FTREDUCE action 
1a100 77 69 74 68 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  with a nontermin
1a110 61 6c 20 6f 6e 20 74 68 65 20 4c 48 53 20 69 6e  al on the LHS in
1a120 74 6f 20 61 20 73 69 6d 70 6c 65 0a 20 20 20 20  to a simple.    
1a130 20 20 2a 2a 20 52 45 44 55 43 45 20 61 63 74 69    ** REDUCE acti
1a140 6f 6e 3a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  on: */.      if(
1a150 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d   ap->sp->index>=
1a160 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1a170 29 7b 0a 20 20 20 20 20 20 20 20 61 63 74 20 3d  ){.        act =
1a180 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65   lemp->minReduce
1a190 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75   + ap->x.rp->iRu
1a1a0 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  le;.      }else{
1a1b0 0a 20 20 20 20 20 20 20 20 61 63 74 20 3d 20 6c  .        act = l
1a1c0 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64  emp->minShiftRed
1a1d0 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e  uce + ap->x.rp->
1a1e0 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  iRule;.      }. 
1a1f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a200 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  }.    case REDUC
1a210 45 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6d  E: act = lemp->m
1a220 69 6e 52 65 64 75 63 65 20 2b 20 61 70 2d 3e 78  inReduce + ap->x
1a230 2e 72 70 2d 3e 69 52 75 6c 65 3b 20 20 20 20 20  .rp->iRule;     
1a240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a250 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74  case ERROR:  act
1a260 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69   = lemp->errActi
1a270 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a290 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
1a2a0 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d  CCEPT: act = lem
1a2b0 70 2d 3e 61 63 63 41 63 74 69 6f 6e 3b 20 20 20  p->accAction;   
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a2e0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
1a2f0 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b   act = -1; break
1a300 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1a310 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c  ct;.}..#define L
1a320 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20  INESIZE 1000./* 
1a330 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72  The next cluster
1a340 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
1a350 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65   for reading the
1a360 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a   template file.*
1a370 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68  * and writing th
1a380 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1a390 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
1a3a0 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73  r */./* The firs
1a3b0 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73  t function trans
1a3c0 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22  fers data from "
1a3d0 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74  in" to "out" unt
1a3e0 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20  il.** a line is 
1a3f0 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e  seen which begin
1a400 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68  s with "%%".  Th
1a410 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  e line number is
1a420 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a  .** tracked..**.
1a430 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74  ** if name!=0, t
1a440 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61  hen any word tha
1a450 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61  t begin with "Pa
1a460 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20  rse" is changed 
1a470 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68  to.** begin with
1a480 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a   *name instead..
1a490 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
1a4a0 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a  tplt_xfer(char *
1a4b0 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20  name, FILE *in, 
1a4c0 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a  FILE *out, int *
1a4d0 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20  lineno).{.  int 
1a4e0 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
1a4f0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1a500 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
1a510 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
1a520 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
1a530 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
1a540 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
1a550 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
1a560 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
1a570 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
1a580 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
1a590 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1a5a0 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
1a5b0 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
1a5c0 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
1a5d0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
1a5e0 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c 50 48 41  i==0 || !ISALPHA
1a5f0 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
1a600 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a610 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
1a620 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
1a630 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
1a640 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
1a650 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1a660 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
1a670 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
1a680 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
1a690 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
1a6a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a6b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a6c0 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
1a6d0 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
1a6e0 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
1a6f0 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
1a700 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
1a710 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
1a720 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
1a730 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1a740 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
1a750 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74  LE *tplt_open(st
1a760 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1a770 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ).{.  static cha
1a780 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
1a790 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
1a7a0 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
1a7b0 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
1a7c0 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
1a7d0 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a   char *cp;..  /*
1a7e0 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20 75   first, see if u
1a7f0 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ser specified a 
1a800 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d  template filenam
1a810 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
1a820 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28   line. */.  if (
1a830 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
1a840 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66  e != 0) {.    if
1a850 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74 65  ( access(user_te
1a860 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
1a870 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  =-1 ){.      fpr
1a880 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
1a890 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73  't find the pars
1a8a0 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61  er driver templa
1a8b0 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
1a8c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72  n",.        user
1a8d0 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
1a8e0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1a8f0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
1a900 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a910 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65    in = fopen(use
1a920 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22  r_templatename,"
1a930 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
1a940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
1a950 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
1a960 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
1a970 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
1a980 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
1a990 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74      user_templat
1a9a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  ename);.      le
1a9b0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1a9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a9d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1a9e0 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d   in;.  }..  cp =
1a9f0 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66   strrchr(lemp->f
1aa00 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  ilename,'.');.  
1aa10 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 6c 65  if( cp ){.    le
1aa20 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
1aa30 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28  "%.*s.lt",(int)(
1aa40 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  cp-lemp->filenam
1aa50 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  e),lemp->filenam
1aa60 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1aa70 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
1aa80 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d  uf,"%s.lt",lemp-
1aa90 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  >filename);.  }.
1aaa0 20 20 69 66 28 20 61 63 63 65 73 73 28 62 75 66    if( access(buf
1aab0 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,004)==0 ){.    
1aac0 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a  tpltname = buf;.
1aad0 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65    }else if( acce
1aae0 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  ss(templatename,
1aaf0 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  004)==0 ){.    t
1ab00 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61  pltname = templa
1ab10 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  tename;.  }else{
1ab20 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
1ab30 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d  pathsearch(lemp-
1ab40 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e  >argv0,templaten
1ab50 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ame,0);.  }.  if
1ab60 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b  ( tpltname==0 ){
1ab70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1ab80 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20  err,"Can't find 
1ab90 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65  the parser drive
1aba0 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  r template file 
1abb0 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
1abc0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20  templatename);. 
1abd0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1abe0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
1abf0 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  0;.  }.  in = fo
1ac00 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62  pen(tpltname,"rb
1ac10 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
1ac20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1ac30 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
1ac40 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
1ac50 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74  ile \"%s\".\n",t
1ac60 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
1ac70 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1ac80 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
1ac90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1aca0 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  n;.}../* Print a
1acb0 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65   #line directive
1acc0 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f 75 74   line to the out
1acd0 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  put file. */.PRI
1ace0 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c  VATE void tplt_l
1acf0 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f 75 74  inedir(FILE *out
1ad00 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68  , int lineno, ch
1ad10 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a  ar *filename).{.
1ad20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ad30 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65  line %d \"",line
1ad40 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66  no);.  while( *f
1ad50 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ilename ){.    i
1ad60 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20  f( *filename == 
1ad70 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27  '\\' ) putc('\\'
1ad80 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28  ,out);.    putc(
1ad90 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a  *filename,out);.
1ada0 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a      filename++;.
1adb0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1adc0 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  t,"\"\n");.}../*
1add0 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20   Print a string 
1ade0 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  to the file and 
1adf0 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d  keep the linenum
1ae00 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a  ber up to date *
1ae10 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
1ae20 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  plt_print(FILE *
1ae30 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f  out, struct lemo
1ae40 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73  n *lemp, char *s
1ae50 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29  tr, int *lineno)
1ae60 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20  .{.  if( str==0 
1ae70 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
1ae80 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 70  e( *str ){.    p
1ae90 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20  utc(*str,out);. 
1aea0 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e     if( *str=='\n
1aeb0 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1aec0 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a  .    str++;.  }.
1aed0 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27    if( str[-1]!='
1aee0 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63 28  \n' ){.    putc(
1aef0 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28  '\n',out);.    (
1af00 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a  *lineno)++;.  }.
1af10 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c    if (!lemp->nol
1af20 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20  inenosflag) {.  
1af30 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
1af40 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1af50 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
1af60 74 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  tname);.  }.  re
1af70 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
1af80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1af90 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20  tine emits code 
1afa0 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63 74  for the destruct
1afb0 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79  or for the.** sy
1afc0 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20  mbol sp.*/.void 
1afd0 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1afe0 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75  code(.  FILE *ou
1aff0 74 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  t,.  struct symb
1b000 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74  ol *sp,.  struct
1b010 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
1b020 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20  int *lineno.){. 
1b030 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20  char *cp = 0;.. 
1b040 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45  if( sp->type==TE
1b050 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20  RMINAL ){.   cp 
1b060 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
1b070 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20  t;.   if( cp==0 
1b080 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72  ) return;.   fpr
1b090 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
1b0a0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d   (*lineno)++;. }
1b0b0 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73  else if( sp->des
1b0c0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70  tructor ){.   cp
1b0d0 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f   = sp->destructo
1b0e0 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  r;.   fprintf(ou
1b0f0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
1b100 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c  no)++;.   if( !l
1b110 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
1b120 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e  ag ){.     (*lin
1b130 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c  eno)++;.     tpl
1b140 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 73 70  t_linedir(out,sp
1b150 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d  ->destLineno,lem
1b160 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
1b170 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c 65   }. }else if( le
1b180 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
1b190 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72    cp = lemp->var
1b1a0 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
1b1b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1b1c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
1b1d0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1b1e0 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65  . }else{.   asse
1b1f0 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e  rt( 0 );  /* Can
1b200 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d  not happen */. }
1b210 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b  . for(; *cp; cp+
1b220 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d  +){.   if( *cp==
1b230 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24  '$' && cp[1]=='$
1b240 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74  ' ){.     fprint
1b250 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72  f(out,"(yypminor
1b260 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e  ->yy%d)",sp->dtn
1b270 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a  um);.     cp++;.
1b280 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b290 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d    }.   if( *cp==
1b2a0 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
1b2b0 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63 70  ++;.   fputc(*cp
1b2c0 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69 6e  ,out);. }. fprin
1b2d0 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28 2a  tf(out,"\n"); (*
1b2e0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20 28  lineno)++;. if (
1b2f0 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
1b300 66 6c 61 67 29 20 7b 0a 20 20 20 28 2a 6c 69 6e  flag) {.   (*lin
1b310 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
1b320 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
1b330 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
1b340 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74  . }. fprintf(out
1b350 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"}\n"); (*linen
1b360 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d  o)++;. return;.}
1b370 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1b380 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  RUE (non-zero) i
1b390 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62  f the given symb
1b3a0 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63  ol has a destruc
1b3b0 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f  tor..*/.int has_
1b3c0 64 65 73 74 72 75 63 74 6f 72 28 73 74 72 75 63  destructor(struc
1b3d0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 73 74  t symbol *sp, st
1b3e0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1b3f0 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  ).{.  int ret;. 
1b400 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54   if( sp->type==T
1b410 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72  ERMINAL ){.    r
1b420 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  et = lemp->token
1b430 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  dest!=0;.  }else
1b440 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70  {.    ret = lemp
1b450 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20  ->vardest!=0 || 
1b460 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
1b470 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b480 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ret;.}../*.** Ap
1b490 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64  pend text to a d
1b4a0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1b4b0 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20 49 66  ated string.  If
1b4c0 20 7a 54 65 78 74 20 69 73 20 30 20 74 68 65 6e   zText is 0 then
1b4d0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 73 74  .** reset the st
1b4e0 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70 74 79  ring to be empty
1b4f0 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79 73 20   again.  Always 
1b500 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c  return the compl
1b510 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74  ete text.** of t
1b520 68 65 20 73 74 72 69 6e 67 20 28 77 68 69 63 68  he string (which
1b530 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
1b540 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 29 2e  with each call).
1b550 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f  .**.** n bytes o
1b560 66 20 7a 54 65 78 74 20 61 72 65 20 73 74 6f 72  f zText are stor
1b570 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74 68 65  ed.  If n==0 the
1b580 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75  n all of zText u
1b590 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  p to the first.*
1b5a0 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 6f  * \000 terminato
1b5b0 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20 7a 54  r is stored.  zT
1b5c0 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  ext can contain 
1b5d0 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e  up to two instan
1b5e0 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54  ces of.** %d.  T
1b5f0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 31 20  he values of p1 
1b600 61 6e 64 20 70 32 20 61 72 65 20 77 72 69 74 74  and p2 are writt
1b610 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  en into the firs
1b620 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20  t and second.** 
1b630 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  %d..**.** If n==
1b640 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70 72 65  -1, then the pre
1b650 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20  vious character 
1b660 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  is overwritten..
1b670 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
1b680 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 6f 6e 73  *append_str(cons
1b690 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
1b6a0 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e  nt n, int p1, in
1b6b0 74 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63 20  t p2){.  static 
1b6c0 63 68 61 72 20 65 6d 70 74 79 5b 31 5d 20 3d 20  char empty[1] = 
1b6d0 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  { 0 };.  static 
1b6e0 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73  char *z = 0;.  s
1b6f0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65  tatic int alloce
1b700 64 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  d = 0;.  static 
1b710 69 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20 20  int used = 0;.  
1b720 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 7a 49  int c;.  char zI
1b730 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28 20 7a 54  nt[40];.  if( zT
1b740 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ext==0 ){.    if
1b750 28 20 75 73 65 64 3d 3d 30 20 26 26 20 7a 21 3d  ( used==0 && z!=
1b760 30 20 29 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20  0 ) z[0] = 0;.  
1b770 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20    used = 0;.    
1b780 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20  return z;.  }.  
1b790 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  if( n<=0 ){.    
1b7a0 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
1b7b0 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20   used += n;.    
1b7c0 20 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d    assert( used>=
1b7d0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  0 );.    }.    n
1b7e0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
1b7f0 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Text);.  }.  if(
1b800 20 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66   (int) (n+sizeof
1b810 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e  (zInt)*2+used) >
1b820 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  = alloced ){.   
1b830 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73   alloced = n + s
1b840 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20  izeof(zInt)*2 + 
1b850 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20  used + 200;.    
1b860 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61  z = (char *) rea
1b870 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64  lloc(z,  alloced
1b880 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d  );.  }.  if( z==
1b890 30 20 29 20 72 65 74 75 72 6e 20 65 6d 70 74 79  0 ) return empty
1b8a0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
1b8b0 20 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28   0 ){.    c = *(
1b8c0 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66  zText++);.    if
1b8d0 28 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20  ( c=='%' && n>0 
1b8e0 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27  && zText[0]=='d'
1b8f0 20 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f   ){.      lemon_
1b900 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25  sprintf(zInt, "%
1b910 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70  d", p1);.      p
1b920 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 6c 65  1 = p2;.      le
1b930 6d 6f 6e 5f 73 74 72 63 70 79 28 26 7a 5b 75 73  mon_strcpy(&z[us
1b940 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20  ed], zInt);.    
1b950 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53    used += lemonS
1b960 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b  trlen(&z[used]);
1b970 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a  .      zText++;.
1b980 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
1b990 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73  else{.      z[us
1b9a0 65 64 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  ed++] = (char)c;
1b9b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75  .    }.  }.  z[u
1b9c0 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  sed] = 0;.  retu
1b9d0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn z;.}../*.** W
1b9e0 72 69 74 65 20 61 6e 64 20 74 72 61 6e 73 66 6f  rite and transfo
1b9f0 72 6d 20 74 68 65 20 72 70 2d 3e 63 6f 64 65 20  rm the rp->code 
1ba00 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 73  string so that s
1ba10 79 6d 62 6f 6c 73 20 61 72 65 20 65 78 70 61 6e  ymbols are expan
1ba20 64 65 64 2e 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ded..** Populate
1ba30 20 74 68 65 20 72 70 2d 3e 63 6f 64 65 50 72 65   the rp->codePre
1ba40 66 69 78 20 61 6e 64 20 72 70 2d 3e 63 6f 64 65  fix and rp->code
1ba50 53 75 66 66 69 78 20 73 74 72 69 6e 67 73 2c 20  Suffix strings, 
1ba60 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
1ba70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1ba80 66 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 63  f the expanded c
1ba90 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ode requires tha
1baa0 74 20 22 79 79 6c 68 73 6d 69 6e 6f 72 22 20 6c  t "yylhsminor" l
1bab0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ocal variable.**
1bac0 20 74 6f 20 62 65 20 64 65 66 69 6e 65 64 2e 0a   to be defined..
1bad0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 74  */.PRIVATE int t
1bae0 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74  ranslate_code(st
1baf0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1bb00 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
1bb10 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20  p){.  char *cp, 
1bb20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *xp;.  int i;.  
1bb30 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1bb40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1bb50 66 20 79 79 6c 68 73 6d 69 6e 6f 72 20 69 73 20  f yylhsminor is 
1bb60 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  used */.  int do
1bb70 6e 74 55 73 65 52 68 73 30 20 3d 20 30 3b 20 20  ntUseRhs0 = 0;  
1bb80 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 75 73 65   /* If true, use
1bb90 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48   of left-most RH
1bba0 53 20 6c 61 62 65 6c 20 69 73 20 69 6c 6c 65 67  S label is illeg
1bbb0 61 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  al */.  const ch
1bbc0 61 72 20 2a 7a 53 6b 69 70 20 3d 20 30 3b 20 2f  ar *zSkip = 0; /
1bbd0 2a 20 54 68 65 20 7a 4f 76 77 72 74 20 63 6f 6d  * The zOvwrt com
1bbe0 6d 65 6e 74 20 77 69 74 68 69 6e 20 72 70 2d 3e  ment within rp->
1bbf0 63 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  code, or NULL */
1bc00 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65 64 20  .  char lhsused 
1bc10 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  = 0;      /* Tru
1bc20 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
1bc30 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
1bc40 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  ed */.  char lhs
1bc50 64 69 72 65 63 74 3b 20 20 20 20 20 20 20 20 2f  direct;        /
1bc60 2a 20 54 72 75 65 20 69 66 20 4c 48 53 20 77 72  * True if LHS wr
1bc70 69 74 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ites directly in
1bc80 74 6f 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  to stack */.  ch
1bc90 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b  ar used[MAXRHS];
1bca0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1bcb0 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
1bcc0 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
1bcd0 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 68 73 5b 35  */.  char zLhs[5
1bce0 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  0];         /* C
1bcf0 6f 6e 76 65 72 74 20 74 68 65 20 4c 48 53 20 73  onvert the LHS s
1bd00 79 6d 62 6f 6c 20 69 6e 74 6f 20 74 68 69 73 20  ymbol into this 
1bd10 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
1bd20 20 7a 4f 76 77 72 74 5b 39 30 30 5d 3b 20 20 20   zOvwrt[900];   
1bd30 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 74 68     /* Comment th
1bd40 61 74 20 74 6f 20 61 6c 6c 6f 77 20 4c 48 53 20  at to allow LHS 
1bd50 74 6f 20 6f 76 65 72 77 72 69 74 65 20 52 48 53  to overwrite RHS
1bd60 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
1bd70 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1bd80 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
1bd90 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
1bda0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1bdb0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
1bdc0 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
1bdd0 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
1bde0 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
1bdf0 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
1be00 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
1be10 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 20 20 72  >ruleline;.    r
1be20 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20  p->noCode = 1;. 
1be30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 70 2d 3e   }else{.    rp->
1be40 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a  noCode = 0;.  }.
1be50 0a 0a 20 20 69 66 28 20 72 70 2d 3e 6e 72 68 73  ..  if( rp->nrhs
1be60 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
1be70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 52 48   there are no RH
1be80 53 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65 6e 20  S symbols, then 
1be90 77 72 69 74 69 6e 67 20 64 69 72 65 63 74 6c 79  writing directly
1bea0 20 74 6f 20 74 68 65 20 4c 48 53 20 69 73 20 6f   to the LHS is o
1beb0 6b 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65  k */.    lhsdire
1bec0 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ct = 1;.  }else 
1bed0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1bee0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [0]==0 ){.    /*
1bef0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52   The left-most R
1bf00 48 53 20 73 79 6d 62 6f 6c 20 68 61 73 20 6e 6f  HS symbol has no
1bf10 20 76 61 6c 75 65 2e 20 20 4c 48 53 20 64 69 72   value.  LHS dir
1bf20 65 63 74 20 69 73 20 6f 6b 2e 20 20 42 75 74 0a  ect is ok.  But.
1bf30 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
1bf40 6f 20 63 61 6c 6c 20 74 68 65 20 64 69 73 74 72  o call the distr
1bf50 75 63 74 6f 72 20 6f 6e 20 74 68 65 20 52 48 53  uctor on the RHS
1bf60 20 73 79 6d 62 6f 6c 20 66 69 72 73 74 2e 20 2a   symbol first. *
1bf70 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1bf80 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 68 61 73  = 1;.    if( has
1bf90 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1bfa0 72 68 73 5b 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[0],lemp) ){.
1bfb0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1bfc0 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  (0,0,0,0);.     
1bfd0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
1bfe0 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70  y_destructor(yyp
1bff0 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70  Parser,%d,&yymsp
1c000 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c  [%d].minor);\n",
1c010 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1c020 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 30 5d 2d       rp->rhs[0]-
1c030 3e 69 6e 64 65 78 2c 31 2d 72 70 2d 3e 6e 72 68  >index,1-rp->nrh
1c040 73 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 63 6f  s);.      rp->co
1c050 64 65 50 72 65 66 69 78 20 3d 20 53 74 72 73 61  dePrefix = Strsa
1c060 66 65 28 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  fe(append_str(0,
1c070 30 2c 30 2c 30 29 29 3b 0a 20 20 20 20 20 20 72  0,0,0));.      r
1c080 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20  p->noCode = 0;. 
1c090 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1c0a0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 3d 3d 30   rp->lhsalias==0
1c0b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1c0c0 20 69 73 20 6e 6f 20 4c 48 53 20 76 61 6c 75 65   is no LHS value
1c0d0 20 73 79 6d 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20   symbol. */.    
1c0e0 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20  lhsdirect = 1;. 
1c0f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1c100 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72  p(rp->lhsalias,r
1c110 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3d  p->rhsalias[0])=
1c120 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1c130 20 4c 48 53 20 73 79 6d 62 6f 6c 20 61 6e 64 20   LHS symbol and 
1c140 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48  the left-most RH
1c150 53 20 73 79 6d 62 6f 6c 20 61 72 65 20 74 68 65  S symbol are the
1c160 20 73 61 6d 65 2c 20 73 6f 0a 20 20 20 20 2a 2a   same, so.    **
1c170 20 64 69 72 65 63 74 20 77 72 69 74 69 6e 67 20   direct writing 
1c180 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  is allowed */.  
1c190 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1c1a0 0a 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31  .    lhsused = 1
1c1b0 3b 0a 20 20 20 20 75 73 65 64 5b 30 5d 20 3d 20  ;.    used[0] = 
1c1c0 31 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  1;.    if( rp->l
1c1d0 68 73 2d 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e 72  hs->dtnum!=rp->r
1c1e0 68 73 5b 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a  hs[0]->dtnum ){.
1c1f0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1c200 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1c210 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1c220 20 20 20 20 22 25 73 28 25 73 29 20 61 6e 64 20      "%s(%s) and 
1c230 25 73 28 25 73 29 20 73 68 61 72 65 20 74 68 65  %s(%s) share the
1c240 20 73 61 6d 65 20 6c 61 62 65 6c 20 62 75 74 20   same label but 
1c250 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 22  have ".        "
1c260 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 74 79  different dataty
1c270 70 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  pes.",.        r
1c280 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72 70  p->lhs->name, rp
1c290 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e  ->lhsalias, rp->
1c2a0 72 68 73 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70  rhs[0]->name, rp
1c2b0 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a  ->rhsalias[0]);.
1c2c0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1c2d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rcnt++;.    }.  
1c2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e  }else{.    lemon
1c2f0 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77 72 74 2c  _sprintf(zOvwrt,
1c300 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72 69 74 65   "/*%s-overwrite
1c310 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20 20 20 20  s-%s*/",.       
1c320 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c             rp->l
1c330 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73  hsalias, rp->rhs
1c340 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20 7a  alias[0]);.    z
1c350 53 6b 69 70 20 3d 20 73 74 72 73 74 72 28 72 70  Skip = strstr(rp
1c360 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72 74 29 3b  ->code, zOvwrt);
1c370 0a 20 20 20 20 69 66 28 20 7a 53 6b 69 70 21 3d  .    if( zSkip!=
1c380 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1c390 65 20 63 6f 64 65 20 63 6f 6e 74 61 69 6e 73 20  e code contains 
1c3a0 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e  a special commen
1c3b0 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  t that indicates
1c3c0 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
1c3d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
1c3e0 65 20 4c 48 53 20 6c 61 62 65 6c 20 74 6f 20 6f  e LHS label to o
1c3f0 76 65 72 77 72 69 74 65 20 6c 65 66 74 2d 6d 6f  verwrite left-mo
1c400 73 74 20 52 48 53 20 6c 61 62 65 6c 2e 20 2a 2f  st RHS label. */
1c410 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63 74  .      lhsdirect
1c420 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1c430 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63 74  .      lhsdirect
1c440 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1c450 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74 20    if( lhsdirect 
1c460 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
1c470 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25 64 5d 2e  Lhs, "yymsp[%d].
1c480 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31 2d 72 70  minor.yy%d",1-rp
1c490 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68 73 2d 3e  ->nrhs,rp->lhs->
1c4a0 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  dtnum);.  }else{
1c4b0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
1c4c0 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22   sprintf(zLhs, "
1c4d0 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79 25 64 22  yylhsminor.yy%d"
1c4e0 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29  ,rp->lhs->dtnum)
1c4f0 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f  ;.  }..  append_
1c500 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20  str(0,0,0,0);.. 
1c510 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 20 63   /* This const c
1c520 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62 75 74  ast is wrong but
1c530 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20 77 65   harmless, if we
1c540 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a 2f 0a  're careful. */.
1c550 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72 20 2a    for(cp=(char *
1c560 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  )rp->code; *cp; 
1c570 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63  cp++){.    if( c
1c580 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20 20 20 20  p==zSkip ){.    
1c590 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4f 76    append_str(zOv
1c5a0 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  wrt,0,0,0);.    
1c5b0 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72    cp += lemonStr
1c5c0 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31 3b 0a 20  len(zOvwrt)-1;. 
1c5d0 20 20 20 20 20 64 6f 6e 74 55 73 65 52 68 73 30       dontUseRhs0
1c5e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
1c5f0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1c600 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63 70 29  if( ISALPHA(*cp)
1c610 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
1c620 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d 28 63  e || (!ISALNUM(c
1c630 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
1c640 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
1c650 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
1c660 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31     for(xp= &cp[1
1c670 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70 29 20  ]; ISALNUM(*xp) 
1c680 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b  || *xp=='_'; xp+
1c690 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20  +);.      saved 
1c6a0 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70  = *xp;.      *xp
1c6b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1c6c0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
1c6d0 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
1c6e0 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
1c6f0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c700 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a 20 20  (zLhs,0,0,0);.  
1c710 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
1c720 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d         lhsused =
1c730 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1c740 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1c750 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
1c760 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1c770 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1c780 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  ] && strcmp(cp,r
1c790 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d  p->rhsalias[i])=
1c7a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c7b0 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 64 6f    if( i==0 && do
1c7c0 6e 74 55 73 65 52 68 73 30 20 29 7b 0a 20 20 20  ntUseRhs0 ){.   
1c7d0 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72             Error
1c7e0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1c7f0 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1c800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c810 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73 65 64    "Label %s used
1c820 20 61 66 74 65 72 20 27 25 73 27 2e 22 2c 0a 20   after '%s'.",. 
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 2c  rp->rhsalias[0],
1c850 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20 20 20   zOvwrt);.      
1c860 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
1c870 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1c880 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c890 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20  cp!=rp->code && 
1c8a0 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20  cp[-1]=='@' ){. 
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8c0 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
1c8d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40  is of the form @
1c8e0 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75 74  X then substitut
1c8f0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
1c900 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75   ** the token nu
1c910 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74  mber of X, not t
1c920 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f  he value of X */
1c930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1c940 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70  ppend_str("yymsp
1c950 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69  [%d].major",-1,i
1c960 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a  -rp->nrhs+1,0);.
1c970 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1c980 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1c990 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c9a0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
1c9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c9c0 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  nt dtnum;.      
1c9d0 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
1c9e0 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
1c9f0 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
1ca00 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73         dtnum = s
1ca10 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74  p->subsym[0]->dt
1ca20 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  num;.           
1ca30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca40 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
1ca50 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20  = sp->dtnum;.   
1ca60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ca70 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
1ca80 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
1ca90 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69  .minor.yy%d",0,i
1caa0 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e  -rp->nrhs+1, dtn
1cab0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  um);.           
1cac0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
1cad0 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
1cae0 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b      used[i] = 1;
1caf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1cb00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1cb10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61  }.      *xp = sa
1cb30 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ved;.    }.    a
1cb40 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c  ppend_str(cp, 1,
1cb50 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45   0, 0);.  } /* E
1cb60 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a  nd loop */..  /*
1cb70 20 4d 61 69 6e 20 63 6f 64 65 20 67 65 6e 65 72   Main code gener
1cb80 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20  ation completed 
1cb90 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64  */.  cp = append
1cba0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
1cbb0 20 69 66 28 20 63 70 20 26 26 20 63 70 5b 30 5d   if( cp && cp[0]
1cbc0 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74   ) rp->code = St
1cbd0 72 73 61 66 65 28 63 70 29 3b 0a 20 20 61 70 70  rsafe(cp);.  app
1cbe0 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
1cbf0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1cc00 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c   make sure the L
1cc10 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  HS has been used
1cc20 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68   */.  if( rp->lh
1cc30 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73  salias && !lhsus
1cc40 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  ed ){.    ErrorM
1cc50 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
1cc60 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
1cc70 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25        "Label \"%
1cc80 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29  s\" for \"%s(%s)
1cc90 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
1cca0 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
1ccb0 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73  lhsalias,rp->lhs
1ccc0 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c  ->name,rp->lhsal
1ccd0 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ias);.    lemp->
1cce0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
1ccf0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64  .  /* Generate d
1cd00 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66  estructor code f
1cd10 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20 76 61 6c  or RHS minor val
1cd20 75 65 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f  ues which are no
1cd30 74 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 20 20  t referenced..  
1cd40 2a 2a 20 47 65 6e 65 72 61 74 65 20 65 72 72 6f  ** Generate erro
1cd50 72 20 6d 65 73 73 61 67 65 73 20 66 6f 72 20 75  r messages for u
1cd60 6e 75 73 65 64 20 6c 61 62 65 6c 73 20 61 6e 64  nused labels and
1cd70 20 64 75 70 6c 69 63 61 74 65 20 6c 61 62 65 6c   duplicate label
1cd80 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
1cd90 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
1cda0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  ++){.    if( rp-
1cdb0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 7b 0a  >rhsalias[i] ){.
1cdc0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
1cdd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
1cde0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
1cdf0 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63  lhsalias && strc
1ce00 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c  mp(rp->lhsalias,
1ce10 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1ce20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1ce30 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1ce40 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1ce50 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  eline,.         
1ce60 20 20 20 22 25 73 28 25 73 29 20 68 61 73 20 74     "%s(%s) has t
1ce70 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 61 73  he same label as
1ce80 20 74 68 65 20 4c 48 53 20 62 75 74 20 69 73 20   the LHS but is 
1ce90 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  not the left-mos
1cea0 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ".            
1ceb0 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68 65 20 52  "symbol on the R
1cec0 48 53 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  HS.",.          
1ced0 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61    rp->rhs[i]->na
1cee0 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  me, rp->rhsalias
1cef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6d  );.          lem
1cf00 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1cf10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cf20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
1cf30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1cf40 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
1cf50 6a 5d 20 26 26 20 73 74 72 63 6d 70 28 72 70 2d  j] && strcmp(rp-
1cf60 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 2c 72 70 2d  >rhsalias[j],rp-
1cf70 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
1cf80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cf90 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
1cfa0 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
1cfb0 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  line,.          
1cfc0 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73      "Label %s us
1cfd0 65 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  ed for multiple 
1cfe0 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20 52  symbols on the R
1cff0 48 53 20 6f 66 20 61 20 72 75 6c 65 2e 22 2c 0a  HS of a rule.",.
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
1d010 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
1d020 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70              lemp
1d030 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1d040 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d050 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d070 20 20 20 20 20 69 66 28 20 21 75 73 65 64 5b 69       if( !used[i
1d080 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ] ){.        Err
1d090 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1d0a0 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1d0b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4c 61  e,.          "La
1d0c0 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28  bel %s for \"%s(
1d0d0 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
1d0e0 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  sed.",.         
1d0f0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
1d100 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
1d110 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  e,rp->rhsalias[i
1d120 5d 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  ]);.        lemp
1d130 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1d140 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1d150 69 66 28 20 69 3e 30 20 26 26 20 68 61 73 5f 64  if( i>0 && has_d
1d160 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
1d170 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
1d180 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1d190 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28    yy_destructor(
1d1a0 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79  yypParser,%d,&yy
1d1b0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
1d1c0 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n", 0,.         
1d1d0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65  rp->rhs[i]->inde
1d1e0 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b  x,i-rp->nrhs+1);
1d1f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1d200 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 77 72   If unable to wr
1d210 69 74 65 20 4c 48 53 20 76 61 6c 75 65 73 20 64  ite LHS values d
1d220 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1d230 20 73 74 61 63 6b 2c 20 77 72 69 74 65 20 74 68   stack, write th
1d240 65 0a 20 20 2a 2a 20 73 61 76 65 64 20 4c 48 53  e.  ** saved LHS
1d250 20 76 61 6c 75 65 20 6e 6f 77 2e 20 2a 2f 0a 20   value now. */. 
1d260 20 69 66 28 20 6c 68 73 64 69 72 65 63 74 3d 3d   if( lhsdirect==
1d270 30 20 29 7b 0a 20 20 20 20 61 70 70 65 6e 64 5f  0 ){.    append_
1d280 73 74 72 28 22 20 20 79 79 6d 73 70 5b 25 64 5d  str("  yymsp[%d]
1d290 2e 6d 69 6e 6f 72 2e 79 79 25 64 20 3d 20 22 2c  .minor.yy%d = ",
1d2a0 20 30 2c 20 31 2d 72 70 2d 3e 6e 72 68 73 2c 20   0, 1-rp->nrhs, 
1d2b0 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b  rp->lhs->dtnum);
1d2c0 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28  .    append_str(
1d2d0 7a 4c 68 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zLhs, 0, 0, 0);.
1d2e0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1d2f0 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ;\n", 0, 0, 0);.
1d300 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 66 66 69 78    }..  /* Suffix
1d310 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1d320 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 63   complete */.  c
1d330 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
1d340 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 63  ,0,0,0);.  if( c
1d350 70 20 26 26 20 63 70 5b 30 5d 20 29 7b 0a 20 20  p && cp[0] ){.  
1d360 20 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78    rp->codeSuffix
1d370 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a   = Strsafe(cp);.
1d380 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1d390 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
1d3a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1d3b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1d3c0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1d3d0 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69   the rule "rp" i
1d3e0 73 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74  s reduced.  Writ
1d3f0 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f  e.** the code to
1d400 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75   "out".  Make su
1d410 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20  re lineno stays 
1d420 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50  up-to-date..*/.P
1d430 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74  RIVATE void emit
1d440 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f  _code(.  FILE *o
1d450 75 74 2c 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ut,.  struct rul
1d460 65 20 2a 72 70 2c 0a 20 20 73 74 72 75 63 74 20  e *rp,.  struct 
1d470 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69  lemon *lemp,.  i
1d480 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63  nt *lineno.){. c
1d490 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a  onst char *cp;..
1d4a0 20 2f 2a 20 53 65 74 75 70 20 63 6f 64 65 20 70   /* Setup code p
1d4b0 72 69 6f 72 20 74 6f 20 74 68 65 20 23 6c 69 6e  rior to the #lin
1d4c0 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a 20  e directive */. 
1d4d0 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  if( rp->codePref
1d4e0 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 50 72  ix && rp->codePr
1d4f0 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70  efix[0] ){.   fp
1d500 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b 25 73 22  rintf(out, "{%s"
1d510 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  , rp->codePrefix
1d520 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1d530 3e 63 6f 64 65 50 72 65 66 69 78 3b 20 2a 63 70  >codePrefix; *cp
1d540 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70  ; cp++){ if( *cp
1d550 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1d560 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f 2a 20  o)++; }. }.. /* 
1d570 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d580 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61   do the reduce a
1d590 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70  ction */. if( rp
1d5a0 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 28  ->code ){.   if(
1d5b0 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1d5c0 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1d5d0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1d5e0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1d5f0 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e  ,rp->line,lemp->
1d600 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a  filename);.   }.
1d610 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d620 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a  {%s",rp->code);.
1d630 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
1d640 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20  de; *cp; cp++){ 
1d650 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1d660 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20  (*lineno)++; }. 
1d670 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
1d680 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1d690 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d  +;.   if( !lemp-
1d6a0 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29  >nolinenosflag )
1d6b0 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  {.     (*lineno)
1d6c0 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69  ++;.     tplt_li
1d6d0 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
1d6e0 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
1d6f0 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47  ;.   }. }.. /* G
1d700 65 6e 65 72 61 74 65 20 62 72 65 61 6b 64 6f 77  enerate breakdow
1d710 6e 20 63 6f 64 65 20 74 68 61 74 20 6f 63 63 75  n code that occu
1d720 72 73 20 61 66 74 65 72 20 74 68 65 20 23 6c 69  rs after the #li
1d730 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a  ne directive */.
1d740 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 53 75 66   if( rp->codeSuf
1d750 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 53  fix && rp->codeS
1d760 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66  uffix[0] ){.   f
1d770 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
1d780 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  , rp->codeSuffix
1d790 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1d7a0 3e 63 6f 64 65 53 75 66 66 69 78 3b 20 2a 63 70  >codeSuffix; *cp
1d7b0 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70  ; cp++){ if( *cp
1d7c0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1d7d0 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 69 66 28  o)++; }. }.. if(
1d7e0 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1d7f0 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ){.   fprintf(ou
1d800 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e  t, "}\n"); (*lin
1d810 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20 72 65 74  eno)++;. }.. ret
1d820 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  urn;.}../*.** Pr
1d830 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  int the definiti
1d840 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20  on of the union 
1d850 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72  used for the par
1d860 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b  ser's data stack
1d870 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20  ..** This union 
1d880 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20  contains fields 
1d890 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
1d8a0 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72  le data type for
1d8b0 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e   tokens.** and n
1d8c0 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e  onterminals.  In
1d8d0 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
1d8e0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72  computing and pr
1d8f0 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75  inting this.** u
1d900 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74  nion, also set t
1d910 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
1d920 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69  d of every termi
1d930 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
1d940 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a  nal.** symbol..*
1d950 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61  /.void print_sta
1d960 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45  ck_union(.  FILE
1d970 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20   *out,          
1d980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d990 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  utput stream */.
1d9a0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
1d9b0 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  lemp,         /*
1d9c0 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73   The main info s
1d9d0 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69  tructure for thi
1d9e0 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e  s parser */.  in
1d9f0 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20  t *plineno,     
1da00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1da10 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65  nter to the line
1da20 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1da30 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20 20   mhflag         
1da40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1da50 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d   if generating m
1da60 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75  akeheaders outpu
1da70 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69  t */.){.  int li
1da80 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
1da90 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20      /* The line 
1daa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75  number of the ou
1dab0 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tput */.  char *
1dac0 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20  *types;         
1dad0 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61      /* A hash ta
1dae0 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
1daf0 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73   */.  int arrays
1db00 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1db10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22  /* Size of the "
1db20 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a  types" array */.
1db30 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74    int maxdtlengt
1db40 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  h;          /* M
1db50 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
1db60 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22   any ".datatype"
1db70 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61   field. */.  cha
1db80 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20  r *stddt;       
1db90 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61         /* Standa
1dba0 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20  rdized name for 
1dbb0 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20  a datatype */.  
1dbc0 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20  int i,j;        
1dbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1dbe0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1dbf0 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b 20 20  unsigned hash;  
1dc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1dc10 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d   hashing the nam
1dc20 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20  e of a type */. 
1dc30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dc40 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  e;         /* Na
1dc50 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  me of the parser
1dc60 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
1dc70 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1dc80 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c  e types[] and al
1dc90 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a  locate stddt[] *
1dca0 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20  /.  arraysize = 
1dcb0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20  lemp->nsymbol * 
1dcc0 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68  2;.  types = (ch
1dcd0 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72  ar**)calloc( arr
1dce0 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63  aysize, sizeof(c
1dcf0 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20 74  har*) );.  if( t
1dd00 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ypes==0 ){.    f
1dd10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1dd20 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1dd30 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1dd40 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1dd50 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29  <arraysize; i++)
1dd60 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20   types[i] = 0;. 
1dd70 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 30   maxdtlength = 0
1dd80 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  ;.  if( lemp->va
1dd90 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61 78  rtype ){.    max
1dda0 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e  dtlength = lemon
1ddb0 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72  Strlen(lemp->var
1ddc0 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  type);.  }.  for
1ddd0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1dde0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1ddf0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74   int len;.    st
1de00 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1de10 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1de20 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
1de30 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f  datatype==0 ) co
1de40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20  ntinue;.    len 
1de50 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70  = lemonStrlen(sp
1de60 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20  ->datatype);.   
1de70 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65   if( len>maxdtle
1de80 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67  ngth ) maxdtleng
1de90 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  th = len;.  }.  
1dea0 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d  stddt = (char*)m
1deb0 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67  alloc( maxdtleng
1dec0 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66  th*2 + 1 );.  if
1ded0 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20  ( stddt==0 ){.  
1dee0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1def0 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
1df00 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1df10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69  );.  }..  /* Bui
1df20 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  ld a hash table 
1df30 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54 68  of datatypes. Th
1df40 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
1df50 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a   of each symbol.
1df60 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 69    ** is filled i
1df70 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68 20  n with the hash 
1df80 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20 41  index plus 1.  A
1df90 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65 20   ".dtnum" value 
1dfa0 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73 65  of 0 is.  ** use
1dfb0 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73  d for terminal s
1dfc0 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65 72  ymbols.  If ther
1dfd0 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c 74  e is no %default
1dfe0 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20 74 68  _type defined th
1dff0 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c 73  en.  ** 0 is als
1e000 6f 20 75 73 65 64 20 61 73 20 74 68 65 20 2e 64  o used as the .d
1e010 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e  tnum value for n
1e020 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63  onterminals whic
1e030 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66 79  h do not specify
1e040 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65  .  ** a datatype
1e050 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65   using the %type
1e060 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f   directive..  */
1e070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1e080 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1e090 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1e0a0 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1e0b0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1e0c0 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69   char *cp;.    i
1e0d0 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72  f( sp==lemp->err
1e0e0 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  sym ){.      sp-
1e0f0 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69  >dtnum = arraysi
1e100 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ze+1;.      cont
1e110 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1e120 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f  if( sp->type!=NO
1e130 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70  NTERMINAL || (sp
1e140 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26 26  ->datatype==0 &&
1e150 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d   lemp->vartype==
1e160 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  0) ){.      sp->
1e170 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
1e180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1e190 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 61  .    cp = sp->da
1e1a0 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  tatype;.    if( 
1e1b0 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d  cp==0 ) cp = lem
1e1c0 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20 20  p->vartype;.    
1e1d0 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  j = 0;.    while
1e1e0 28 20 49 53 53 50 41 43 45 28 2a 63 70 29 20 29  ( ISSPACE(*cp) )
1e1f0 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65   cp++;.    while
1e200 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a 2b  ( *cp ) stddt[j+
1e210 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20  +] = *cp++;.    
1e220 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 53  while( j>0 && IS
1e230 53 50 41 43 45 28 73 74 64 64 74 5b 6a 2d 31 5d  SPACE(stddt[j-1]
1e240 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64  ) ) j--;.    std
1e250 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  dt[j] = 0;.    i
1e260 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  f( lemp->tokenty
1e270 70 65 20 26 26 20 73 74 72 63 6d 70 28 73 74 64  pe && strcmp(std
1e280 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  dt, lemp->tokent
1e290 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ype)==0 ){.     
1e2a0 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
1e2b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e2c0 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d      }.    hash =
1e2d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
1e2e0 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b   stddt[j]; j++){
1e2f0 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61  .      hash = ha
1e300 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d  sh*53 + stddt[j]
1e310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
1e320 20 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66   = (hash & 0x7ff
1e330 66 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65  fffff)%arraysize
1e340 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70  ;.    while( typ
1e350 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20  es[hash] ){.    
1e360 20 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70    if( strcmp(typ
1e370 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d  es[hash],stddt)=
1e380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  =0 ){.        sp
1e390 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
1e3a0 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
1e3b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1e3c0 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69   hash++;.      i
1e3d0 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e  f( hash>=(unsign
1e3e0 65 64 29 61 72 72 61 79 73 69 7a 65 20 29 20 68  ed)arraysize ) h
1e3f0 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ash = 0;.    }. 
1e400 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
1e410 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h]==0 ){.      s
1e420 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
1e430 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73  + 1;.      types
1e440 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29  [hash] = (char*)
1e450 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
1e460 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a  len(stddt)+1 );.
1e470 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b        if( types[
1e480 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
1e490 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e4a0 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1e4b0 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  y.\n");.        
1e4c0 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d  exit(1);.      }
1e4d0 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
1e4e0 63 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d 2c  cpy(types[hash],
1e4f0 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20  stddt);.    }.  
1e500 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75  }..  /* Print ou
1e510 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
1e520 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45 20   of YYTOKENTYPE 
1e530 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45 20  and YYMINORTYPE 
1e540 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70  */.  name = lemp
1e550 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
1e560 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
1e570 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
1e580 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  no;.  if( mhflag
1e590 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1e5a0 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1e5b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1e5c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e5d0 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59  define %sTOKENTY
1e5e0 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20  PE %s\n",name,. 
1e5f0 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79     lemp->tokenty
1e600 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  pe?lemp->tokenty
1e610 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69  pe:"void*");  li
1e620 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68  neno++;.  if( mh
1e630 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
1e640 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1e650 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
1e660 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70 65  printf(out,"type
1e670 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b  def union {\n");
1e680 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1e690 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20  intf(out,"  int 
1e6a0 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e  yyinit;\n"); lin
1e6b0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1e6c0 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54  (out,"  %sTOKENT
1e6d0 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65  YPE yy0;\n",name
1e6e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1e6f0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73  or(i=0; i<arrays
1e700 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ize; i++){.    i
1e710 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29  f( types[i]==0 )
1e720 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
1e730 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
1e740 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b   yy%d;\n",types[
1e750 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b  i],i+1); lineno+
1e760 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65  +;.    free(type
1e770 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s[i]);.  }.  if(
1e780 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 26 26   lemp->errsym &&
1e790 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75   lemp->errsym->u
1e7a0 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72  seCnt ){.    fpr
1e7b0 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20  intf(out,"  int 
1e7c0 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  yy%d;\n",lemp->e
1e7d0 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c  rrsym->dtnum); l
1e7e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1e7f0 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66 72  ree(stddt);.  fr
1e800 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70 72  ee(types);.  fpr
1e810 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49  intf(out,"} YYMI
1e820 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69  NORTYPE;\n"); li
1e830 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65  neno++;.  *pline
1e840 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a  no = lineno;.}..
1e850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e860 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61 74   name of a C dat
1e870 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72 65  atype able to re
1e880 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20 62  present values b
1e890 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e  etween.** lwr an
1e8a0 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76 65  d upr, inclusive
1e8b0 2e 20 20 49 66 20 70 6e 42 79 74 65 21 3d 4e 55  .  If pnByte!=NU
1e8c0 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  LL then also wri
1e8d0 74 65 20 74 68 65 20 73 69 7a 65 6f 66 0a 2a 2a  te the sizeof.**
1e8e0 20 66 6f 72 20 74 68 61 74 20 74 79 70 65 20 28   for that type (
1e8f0 31 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e 74 6f  1, 2, or 4) into
1e900 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74 61   *pnByte..*/.sta
1e910 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1e920 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1e930 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75  e(int lwr, int u
1e940 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29  pr, int *pnByte)
1e950 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e960 7a 54 79 70 65 20 3d 20 22 69 6e 74 22 3b 0a 20  zType = "int";. 
1e970 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 34 3b 0a   int nByte = 4;.
1e980 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
1e990 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
1e9a0 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
1e9b0 3d 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = "unsigned char
1e9c0 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ";.      nByte =
1e9d0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1e9e0 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20  ( upr<65535 ){. 
1e9f0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1ea00 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
1ea10 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ";.      nByte =
1ea20 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
1ea30 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1ea40 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20  signed int";.   
1ea50 20 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20     nByte = 4;.  
1ea60 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1ea70 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72  lwr>=-127 && upr
1ea80 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a 54 79  <=127 ){.    zTy
1ea90 70 65 20 3d 20 22 73 69 67 6e 65 64 20 63 68 61  pe = "signed cha
1eaa0 72 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  r";.    nByte = 
1eab0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  1;.  }else if( l
1eac0 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70  wr>=-32767 && up
1ead0 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 7a  r<32767 ){.    z
1eae0 54 79 70 65 20 3d 20 22 73 68 6f 72 74 22 3b 0a  Type = "short";.
1eaf0 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20      nByte = 2;. 
1eb00 20 7d 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20   }.  if( pnByte 
1eb10 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42 79 74  ) *pnByte = nByt
1eb20 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  e;.  return zTyp
1eb30 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  e;.}../*.** Each
1eb40 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73 20   state contains 
1eb50 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74  a set of token t
1eb60 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1eb70 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65   set of.** nonte
1eb80 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69  rminal transacti
1eb90 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74 68  ons.  Each of th
1eba0 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20 61  ese sets makes a
1ebb0 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  n instance.** of
1ebc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1ebd0 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61 72  tructure.  An ar
1ebe0 72 61 79 20 6f 66 20 74 68 65 73 65 20 73 74 72  ray of these str
1ebf0 75 63 74 75 72 65 73 20 69 73 20 75 73 65 64 0a  uctures is used.
1ec00 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20  ** to order the 
1ec10 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72  creation of entr
1ec20 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
1ec30 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f  tion[] table..*/
1ec40 0a 73 74 72 75 63 74 20 61 78 73 65 74 20 7b 0a  .struct axset {.
1ec50 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1ec60 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e  stp;   /* A poin
1ec70 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 2a  ter to a state *
1ec80 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20  /.  int isTkn;  
1ec90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1eca0 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20   to use tokens. 
1ecb0 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74   False for non-t
1ecc0 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
1ecd0 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20  t nAction;      
1ece0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ecf0 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  actions */.  int
1ed00 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20   iOrder;        
1ed10 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72    /* Original or
1ed20 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73 65  der of action se
1ed30 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
1ed40 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74  Compare to axset
1ed50 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
1ed60 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
1ed70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1ed80 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e  xset_compare(con
1ed90 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
1eda0 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74  t void *b){.  st
1edb0 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d  ruct axset *p1 =
1edc0 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29   (struct axset*)
1edd0 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  a;.  struct axse
1ede0 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20  t *p2 = (struct 
1edf0 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20  axset*)b;.  int 
1ee00 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63  c;.  c = p2->nAc
1ee10 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69  tion - p1->nActi
1ee20 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  on;.  if( c==0 )
1ee30 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d 3e 69 4f  {.    c = p1->iO
1ee40 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f 72 64 65  rder - p2->iOrde
1ee50 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
1ee60 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20   c!=0 || p1==p2 
1ee70 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
1ee80 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65  ../*.** Write te
1ee90 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61 74  xt on "out" that
1eea0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
1eeb0 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61  ule "rp"..*/.sta
1eec0 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 52 75  tic void writeRu
1eed0 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75 74  leText(FILE *out
1eee0 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
1eef0 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66  p){.  int j;.  f
1ef00 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a  printf(out,"%s :
1ef10 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61  :=", rp->lhs->na
1ef20 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  me);.  for(j=0; 
1ef30 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29  j<rp->nrhs; j++)
1ef40 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1ef50 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
1ef60 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[j];.    if( sp
1ef70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
1ef80 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66  MINAL ){.      f
1ef90 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1efa0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1efb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1efc0 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t k;.      fprin
1efd0 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
1efe0 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
1eff0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  e);.      for(k=
1f000 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; k<sp->nsubsym
1f010 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1f020 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
1f030 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d  ",sp->subsym[k]-
1f040 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
1f050 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1f060 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72   Generate C sour
1f070 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
1f080 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
1f090 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73 74  eportTable(.  st
1f0a0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1f0b0 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20  ,.  int mhflag  
1f0c0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20     /* Output in 
1f0d0 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d  makeheaders form
1f0e0 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  at if true */.){
1f0f0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
1f100 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  n;.  char line[L
1f110 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
1f120 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63   lineno;.  struc
1f130 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
1f140 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
1f150 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
1f160 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61   *rp;.  struct a
1f170 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a  cttab *pActtab;.
1f180 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 73    int i, j, n, s
1f190 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74 69 6f  z;.  int szActio
1f1a0 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 73 69  nType;     /* si
1f1b0 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e 54 59 50  zeof(YYACTIONTYP
1f1c0 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 6f  E) */.  int szCo
1f1d0 64 65 54 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  deType;       /*
1f1e0 20 73 69 7a 65 6f 66 28 59 59 43 4f 44 45 54 59   sizeof(YYCODETY
1f1f0 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  PE)   */.  const
1f200 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69   char *name;.  i
1f210 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78  nt mnTknOfst, mx
1f220 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d  TknOfst;.  int m
1f230 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73  nNtOfst, mxNtOfs
1f240 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  t;.  struct axse
1f250 74 20 2a 61 78 3b 0a 0a 20 20 6c 65 6d 70 2d 3e  t *ax;..  lemp->
1f260 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65 20 3d  minShiftReduce =
1f270 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1f280 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e   lemp->errAction
1f290 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66   = lemp->minShif
1f2a0 74 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e  tReduce + lemp->
1f2b0 6e 72 75 6c 65 3b 0a 20 20 6c 65 6d 70 2d 3e 61  nrule;.  lemp->a
1f2c0 63 63 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ccAction = lemp-
1f2d0 3e 65 72 72 41 63 74 69 6f 6e 20 2b 20 31 3b 0a  >errAction + 1;.
1f2e0 20 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e    lemp->noAction
1f2f0 20 3d 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69   = lemp->accActi
1f300 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e  on + 1;.  lemp->
1f310 6d 69 6e 52 65 64 75 63 65 20 3d 20 6c 65 6d 70  minReduce = lemp
1f320 2d 3e 6e 6f 41 63 74 69 6f 6e 20 2b 20 31 3b 0a  ->noAction + 1;.
1f330 20 20 6c 65 6d 70 2d 3e 6d 61 78 41 63 74 69 6f    lemp->maxActio
1f340 6e 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  n = lemp->minRed
1f350 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  uce + lemp->nrul
1f360 65 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f  e;..  in = tplt_
1f370 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66  open(lemp);.  if
1f380 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
1f390 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  ;.  out = file_o
1f3a0 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77  pen(lemp,".c","w
1f3b0 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
1f3c0 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28  0 ){.    fclose(
1f3d0 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  in);.    return;
1f3e0 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  .  }.  lineno = 
1f3f0 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  1;.  tplt_xfer(l
1f400 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1f410 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1f420 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e   Generate the in
1f430 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61  clude code, if a
1f440 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ny */.  tplt_pri
1f450 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1f460 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e  ->include,&linen
1f470 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  o);.  if( mhflag
1f480 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e   ){.    char *in
1f490 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  cName = file_mak
1f4a0 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1f4b0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1f4c0 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1f4d0 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29  s\"\n", incName)
1f4e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f4f0 66 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20  free(incName);. 
1f500 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1f510 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1f520 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1f530 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
1f540 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
1f550 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
1f560 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  g ){.    const c
1f570 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
1f580 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1f590 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1f5a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
1f5b0 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1f5c0 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1f5d0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1f5e0 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f600 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1f610 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1f620 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1f630 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1f640 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1f650 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1f660 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1f670 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1f680 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1f690 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1f6a0 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1f6b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1f6c0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1f6d0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1f6e0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1f6f0 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
1f700 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
1f710 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
1f720 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
1f730 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1f740 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
1f750 6d 62 6f 6c 2c 20 26 73 7a 43 6f 64 65 54 79 70  mbol, &szCodeTyp
1f760 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e)); lineno++;. 
1f770 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1f780 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
1f790 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
1f7a0 6f 6c 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ol);  lineno++;.
1f7b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f7c0 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54  define YYACTIONT
1f7d0 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
1f7e0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1f7f0 28 30 2c 6c 65 6d 70 2d 3e 6d 61 78 41 63 74 69  (0,lemp->maxActi
1f800 6f 6e 2c 26 73 7a 41 63 74 69 6f 6e 54 79 70 65  on,&szActionType
1f810 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1f820 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1f830 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1f840 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1f850 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1f860 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1f870 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1f880 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1f890 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1f8a0 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1f8b0 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1f8c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1f8d0 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1f8e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1f8f0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1f900 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1f910 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f920 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1f930 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1f940 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1f950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1f960 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1f970 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1f980 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1f990 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1f9a0 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1f9b0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1f9c0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1f9d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f9e0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1f9f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1fa00 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1fa10 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1fa20 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1fa30 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1fa40 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1fa50 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72      i = lemonStr
1fa60 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
1fa70 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
1fa80 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d 70 2d  && ISSPACE(lemp-
1fa90 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
1faa0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1fab0 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c 65  1 && (ISALNUM(le
1fac0 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
1fad0 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
1fae0 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
1faf0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1fb00 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43  efine %sARG_SDEC
1fb10 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
1fb20 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1fb30 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1fb40 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1fb50 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22  ARG_PDECL ,%s\n"
1fb60 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1fb70 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1fb80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1fb90 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1fba0 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72  H %s = yypParser
1fbb0 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1fbc0 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
1fbd0 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
1fbe0 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
1fbf0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1fc00 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1fc10 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
1fc20 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a  er->%s = %s\n",.
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
1fc50 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
1fc60 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1fc70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
1fc80 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fc90 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
1fca0 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1fcb0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1fcc0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1fcd0 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _PDECL\n",name);
1fce0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1fcf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1fd00 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1fd10 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1fd20 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1fd30 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1fd40 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d  ARG_STORE\n",nam
1fd50 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1fd60 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
1fd70 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1fd80 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1fd90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1fda0 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20  f( lemp->errsym 
1fdb0 26 26 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  && lemp->errsym-
1fdc0 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1fdd0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fde0 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f  ine YYERRORSYMBO
1fdf0 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  L %d\n",lemp->er
1fe00 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  rsym->index); li
1fe10 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1fe20 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fe30 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1fe40 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1fe50 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1fe60 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1fe70 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1fe80 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1fe90 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
1fea0 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
1feb0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20  lineno++;.  }.. 
1fec0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1fed0 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62 75  action table, bu
1fee0 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20  t do not output 
1fef0 69 74 20 79 65 74 2e 20 20 54 68 65 20 61 63 74  it yet.  The act
1ff00 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6d  ion.  ** table m
1ff10 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64 20  ust be computed 
1ff20 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69 6e  before generatin
1ff30 67 20 74 68 65 20 59 59 4e 53 54 41 54 45 20 6d  g the YYNSTATE m
1ff40 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20 2a  acro because.  *
1ff50 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  * we need to kno
1ff60 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74 65  w how many state
1ff70 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e 61  s can be elimina
1ff80 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20 3d  ted..  */.  ax =
1ff90 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20 2a   (struct axset *
1ffa0 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e  ) calloc(lemp->n
1ffb0 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  xstate*2, sizeof
1ffc0 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  (ax[0]));.  if( 
1ffd0 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ax==0 ){.    fpr
1ffe0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
1fff0 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
20000 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
20010 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
20020 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b  mp->nxstate; i++
20030 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
20040 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
20050 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20    ax[i*2].stp = 
20060 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  stp;.    ax[i*2]
20070 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20  .isTkn = 1;.    
20080 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20  ax[i*2].nAction 
20090 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a  = stp->nTknAct;.
200a0 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74      ax[i*2+1].st
200b0 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
200c0 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30  i*2+1].isTkn = 0
200d0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
200e0 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
200f0 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54  NtAct;.  }.  mxT
20100 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  knOfst = mnTknOf
20110 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66  st = 0;.  mxNtOf
20120 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st = mnNtOfst = 
20130 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65 66  0;.  /* In an ef
20140 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  fort to minimize
20150 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
20160 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65 20  e size, use the 
20170 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20 6f  heuristic.  ** o
20180 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
20190 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65 74  rgest action set
201a0 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f 72  s first */.  for
201b0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78  (i=0; i<lemp->nx
201c0 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78  state*2; i++) ax
201d0 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a  [i].iOrder = i;.
201e0 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70    qsort(ax, lemp
201f0 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a  ->nxstate*2, siz
20200 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65  eof(ax[0]), axse
20210 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41  t_compare);.  pA
20220 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61  cttab = acttab_a
20230 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62  lloc(lemp->nsymb
20240 6f 6c 2c 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ol, lemp->ntermi
20250 6e 61 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nal);.  for(i=0;
20260 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
20270 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74  *2 && ax[i].nAct
20280 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ion>0; i++){.   
20290 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70   stp = ax[i].stp
202a0 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e  ;.    if( ax[i].
202b0 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66  isTkn ){.      f
202c0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
202d0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
202e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74  .        int act
202f0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
20300 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d   ap->sp->index>=
20310 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
20320 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20330 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d      action = com
20340 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
20350 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  , ap);.        i
20360 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f  f( action<0 ) co
20370 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20380 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41  acttab_action(pA
20390 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69  cttab, ap->sp->i
203a0 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  ndex, action);. 
203b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70       }.      stp
203c0 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74  ->iTknOfst = act
203d0 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74  tab_insert(pActt
203e0 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ab, 1);.      if
203f0 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c  ( stp->iTknOfst<
20400 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b  mnTknOfst ) mnTk
20410 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
20420 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nOfst;.      if(
20430 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d   stp->iTknOfst>m
20440 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e  xTknOfst ) mxTkn
20450 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
20460 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ofst;.    }else{
20470 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
20480 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
20490 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
204a0 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
204b0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
204c0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
204d0 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
204e0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
204f0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
20500 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f  mp->nsymbol ) co
20510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20520 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
20530 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
20540 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
20550 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
20560 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
20570 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
20580 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
20590 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
205a0 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e   }.      stp->iN
205b0 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  tOfst = acttab_i
205c0 6e 73 65 72 74 28 70 41 63 74 74 61 62 2c 20 30  nsert(pActtab, 0
205d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
205e0 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
205f0 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
20600 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
20610 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
20620 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
20630 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
20640 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23  iNtOfst;.    }.#
20650 69 66 20 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65  if 0  /* Uncomme
20660 6e 74 20 66 6f 72 20 61 20 74 72 61 63 65 20 6f  nt for a trace o
20670 66 20 68 6f 77 20 74 68 65 20 79 79 5f 61 63 74  f how the yy_act
20680 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c  ion[] table fill
20690 73 20 6f 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69  s out */.    { i
206a0 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20  nt jj, nn;.     
206b0 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a   for(jj=nn=0; jj
206c0 3c 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f  <pActtab->nActio
206d0 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  n; jj++){.      
206e0 20 20 69 66 28 20 70 41 63 74 74 61 62 2d 3e 61    if( pActtab->a
206f0 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f  Action[jj].actio
20700 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20  n<0 ) nn++;.    
20710 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
20720 28 22 25 34 64 3a 20 53 74 61 74 65 20 25 33 64  ("%4d: State %3d
20730 20 25 73 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a   %s n: %2d size:
20740 20 25 35 64 20 66 72 65 65 73 70 61 63 65 3a 20   %5d freespace: 
20750 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
20760 20 20 20 20 69 2c 20 73 74 70 2d 3e 73 74 61 74      i, stp->stat
20770 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b  enum, ax[i].isTk
20780 6e 20 3f 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56  n ? "Token" : "V
20790 61 72 20 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ar  ",.         
207a0 20 20 20 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f      ax[i].nActio
207b0 6e 2c 20 70 41 63 74 74 61 62 2d 3e 6e 41 63 74  n, pActtab->nAct
207c0 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a  ion, nn);.    }.
207d0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
207e0 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  e(ax);..  /* Mar
207f0 6b 20 72 75 6c 65 73 20 74 68 61 74 20 61 72 65  k rules that are
20800 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 66   actually used f
20810 6f 72 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  or reduce action
20820 73 20 61 66 74 65 72 20 61 6c 6c 0a 20 20 2a 2a  s after all.  **
20830 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 68   optimizations h
20840 61 76 65 20 62 65 65 6e 20 61 70 70 6c 69 65 64  ave been applied
20850 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .  */.  for(rp=l
20860 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
20870 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e  p=rp->next) rp->
20880 64 6f 65 73 52 65 64 75 63 65 20 3d 20 4c 45 4d  doesReduce = LEM
20890 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28  ON_FALSE;.  for(
208a0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
208b0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
208c0 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72  for(ap=lemp->sor
208d0 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20  ted[i]->ap; ap; 
208e0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
208f0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
20900 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 2d 3e  ==REDUCE || ap->
20910 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
20920 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 2d  E ){.        ap-
20930 3e 78 2e 72 70 2d 3e 64 6f 65 73 52 65 64 75 63  >x.rp->doesReduc
20940 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
20950 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20960 69 6e 69 73 68 20 72 65 6e 64 65 72 69 6e 67 20  inish rendering 
20970 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 6e 6f  the constants no
20980 77 20 74 68 61 74 20 74 68 65 20 61 63 74 69 6f  w that the actio
20990 6e 20 74 61 62 6c 65 20 68 61 73 0a 20 20 2a 2a  n table has.  **
209a0 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a   been computed *
209b0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
209c0 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54  "#define YYNSTAT
209d0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64  E             %d
209e0 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  \n",lemp->nxstat
209f0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
20a00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
20a10 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 20 20  efine YYNRULE   
20a20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
20a30 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20  ,lemp->nrule);  
20a40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
20a50 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20a60 20 59 59 4e 54 4f 4b 45 4e 20 20 20 20 20 20 20   YYNTOKEN       
20a70 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70        %d\n",lemp
20a80 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29 3b 20 6c 69  ->nterminal); li
20a90 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
20aa0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
20ab0 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20  Y_MAX_SHIFT     
20ac0 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e      %d\n",lemp->
20ad0 6e 78 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65  nxstate-1); line
20ae0 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70  no++;.  i = lemp
20af0 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65  ->minShiftReduce
20b00 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
20b10 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f  "#define YY_MIN_
20b20 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64  SHIFTREDUCE   %d
20b30 5c 6e 22 2c 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  \n",i); lineno++
20b40 3b 0a 20 20 69 20 2b 3d 20 6c 65 6d 70 2d 3e 6e  ;.  i += lemp->n
20b50 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  rule;.  fprintf(
20b60 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
20b70 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45 20  MAX_SHIFTREDUCE 
20b80 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c    %d\n", i-1); l
20b90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20ba0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20bb0 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20  YY_ERROR_ACTION 
20bc0 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70       %d\n", lemp
20bd0 2d 3e 65 72 72 41 63 74 69 6f 6e 29 3b 20 6c 69  ->errAction); li
20be0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
20bf0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
20c00 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e 20  Y_ACCEPT_ACTION 
20c10 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d      %d\n", lemp-
20c20 3e 61 63 63 41 63 74 69 6f 6e 29 3b 20 6c 69 6e  >accAction); lin
20c30 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
20c40 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
20c50 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  _NO_ACTION      
20c60 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e     %d\n", lemp->
20c70 6e 6f 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e  noAction); linen
20c80 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
20c90 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
20ca0 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20  IN_REDUCE       
20cb0 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6d 69   %d\n", lemp->mi
20cc0 6e 52 65 64 75 63 65 29 3b 20 6c 69 6e 65 6e 6f  nReduce); lineno
20cd0 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e  ++;.  i = lemp->
20ce0 6d 69 6e 52 65 64 75 63 65 20 2b 20 6c 65 6d 70  minReduce + lemp
20cf0 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e  ->nrule;.  fprin
20d00 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20d10 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20 20  YY_MAX_REDUCE   
20d20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29       %d\n", i-1)
20d30 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70  ; lineno++;.  tp
20d40 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
20d50 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
20d60 6f 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75  o);..  /* Now ou
20d70 74 70 75 74 20 74 68 65 20 61 63 74 69 6f 6e 20  tput the action 
20d80 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73  table and its as
20d90 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20  sociates:.  **. 
20da0 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   **  yy_action[]
20db0 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65          A single
20dc0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
20dd0 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20  g all actions.. 
20de0 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   **  yy_lookahea
20df0 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20  d[]     A table 
20e00 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
20e10 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63  ookahead for eac
20e20 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  h entry in.  ** 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20      yy_action.  
20e50 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68  Used to detect h
20e60 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a  ash collisions..
20e70 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f    **  yy_shift_o
20e80 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63  fst[]    For eac
20e90 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
20ea0 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
20eb0 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61  shifting termina
20ee0 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64  ls..  **  yy_red
20ef0 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72  uce_ofst[]   For
20f00 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
20f10 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
20f20 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e      shifting non
20f50 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72  -terminals after
20f60 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20   a reduce..  ** 
20f70 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20   yy_default[]   
20f80 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69      Default acti
20f90 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74  on for each stat
20fa0 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  e..  */..  /* Ou
20fb0 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69  tput the yy_acti
20fc0 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65  on table */.  le
20fd0 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d  mp->nactiontab =
20fe0 20 6e 20 3d 20 61 63 74 74 61 62 5f 61 63 74 69   n = acttab_acti
20ff0 6f 6e 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29  on_size(pActtab)
21000 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
21010 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
21020 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  nType;.  fprintf
21030 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
21040 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
21050 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
21060 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
21070 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
21080 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
21090 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
210a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
210b0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
210c0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
210d0 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
210e0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
210f0 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
21100 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
21110 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 3b 0a 20  emp->noAction;. 
21120 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
21130 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
21140 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
21150 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
21160 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
21170 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
21180 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
21190 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
211a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
211b0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
211c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
211d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
211e0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
211f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
21200 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
21210 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
21220 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 6c 6f 6f   */.  lemp->nloo
21230 6b 61 68 65 61 64 74 61 62 20 3d 20 6e 20 3d 20  kaheadtab = n = 
21240 61 63 74 74 61 62 5f 6c 6f 6f 6b 61 68 65 61 64  acttab_lookahead
21250 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a  _size(pActtab);.
21260 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
21270 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70  e += n*szCodeTyp
21280 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
21290 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
212a0 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
212b0 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
212c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
212d0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
212e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
212f0 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
21300 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
21310 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
21320 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
21330 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
21340 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
21350 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
21360 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
21370 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
21380 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
21390 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
213a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
213b0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
213c0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
213d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
213e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
213f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
21400 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
21410 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
21420 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
21430 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65  able */.  n = le
21440 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77  mp->nxstate;.  w
21450 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
21460 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
21470 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  iTknOfst==NO_OFF
21480 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72  SET ) n--;.  fpr
21490 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
214a0 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e  ne YY_SHIFT_COUN
214b0 54 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6e 2d  T    (%d)\n", n-
214c0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
214d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
214e0 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d  efine YY_SHIFT_M
214f0 49 4e 20 20 20 20 20 20 28 25 64 29 5c 6e 22 2c  IN      (%d)\n",
21500 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e   mnTknOfst); lin
21510 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
21520 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
21530 59 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 20 20  Y_SHIFT_MAX     
21540 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f   (%d)\n", mxTknO
21550 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
21560 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21570 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
21580 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
21590 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6d  = {\n",.       m
215a0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
215b0 28 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70  (mnTknOfst, lemp
215c0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70  ->nterminal+lemp
215d0 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 2c 20 26 73  ->nactiontab, &s
215e0 7a 29 29 3b 0a 20 20 20 20 20 20 20 6c 69 6e 65  z));.       line
215f0 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  no++;.  lemp->ta
21600 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b  blesize += n*sz;
21610 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
21620 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
21630 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
21640 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
21650 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
21660 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
21670 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
21680 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6c 65 6d  SET ) ofst = lem
21690 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 3b 0a 20  p->nactiontab;. 
216a0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
216b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
216c0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
216d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
216e0 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20  %4d,", ofst);.  
216f0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
21700 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
21710 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
21720 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
21730 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
21740 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
21750 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
21760 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
21770 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
21780 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72   Output the yy_r
21790 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62  educe_ofst[] tab
217a0 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70  le */.  n = lemp
217b0 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69  ->nxstate;.  whi
217c0 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
217d0 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e  >sorted[n-1]->iN
217e0 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  tOfst==NO_OFFSET
217f0 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
21800 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
21810 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20  YY_REDUCE_COUNT 
21820 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
21830 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
21840 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
21850 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20   YY_REDUCE_MIN  
21860 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
21870 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  st); lineno++;. 
21880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
21890 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
218a0 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
218b0 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mxNtOfst); linen
218c0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
218d0 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
218e0 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f  t %s yy_reduce_o
218f0 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20  fst[] = {\n",.  
21900 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
21910 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66  size_type(mnNtOf
21920 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c 20  st-1, mxNtOfst, 
21930 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  &sz)); lineno++;
21940 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
21950 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f  ze += n*sz;.  fo
21960 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
21970 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
21980 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
21990 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
219a0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74   ofst = stp->iNt
219b0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
219c0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
219d0 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  ofst = mnNtOfst 
219e0 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
219f0 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
21a00 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
21a10 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
21a20 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
21a30 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
21a40 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
21a50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21a60 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
21a70 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
21a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a90 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
21aa0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
21ab0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
21ac0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
21ad0 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
21ae0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
21af0 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
21b00 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
21b10 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  YPE yy_default[]
21b20 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
21b30 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
21b40 6e 78 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d  nxstate;.  lemp-
21b50 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
21b60 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20  szActionType;.  
21b70 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
21b80 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
21b90 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
21ba0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
21bb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
21bc0 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
21bd0 20 20 20 69 66 28 20 73 74 70 2d 3e 69 44 66 6c     if( stp->iDfl
21be0 74 52 65 64 75 63 65 3c 30 20 29 7b 0a 20 20 20  tReduce<0 ){.   
21bf0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21c00 22 20 25 34 64 2c 22 2c 20 6c 65 6d 70 2d 3e 65  " %4d,", lemp->e
21c10 72 72 41 63 74 69 6f 6e 29 3b 0a 20 20 20 20 7d  rrAction);.    }
21c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
21c30 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
21c40 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75  , stp->iDfltRedu
21c50 63 65 20 2b 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65  ce + lemp->minRe
21c60 64 75 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  duce);.    }.   
21c70 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
21c80 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
21c90 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
21ca0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
21cb0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
21cc0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
21cd0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
21ce0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
21cf0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
21d00 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
21d10 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
21d20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
21d30 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
21d40 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
21d50 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
21d60 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
21d70 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d      int mx = lem
21d80 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31  p->nterminal - 1
21d90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e  ;.    while( mx>
21da0 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  0 && lemp->symbo
21db0 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b  ls[mx]->fallback
21dc0 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20  ==0 ){ mx--; }. 
21dd0 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69     lemp->tablesi
21de0 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a 43  ze += (mx+1)*szC
21df0 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f 72  odeType;.    for
21e00 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b  (i=0; i<=mx; i++
21e10 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
21e20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70  symbol *p = lemp
21e30 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
21e40 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62      if( p->fallb
21e50 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
21e60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21e70 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20      0,  /* %10s 
21e80 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22  => nothing */\n"
21e90 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  , p->name);.    
21ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21eb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
21ec0 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d   %3d,  /* %10s =
21ed0 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66  > %s */\n", p->f
21ee0 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a  allback->index,.
21ef0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d            p->nam
21f00 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e  e, p->fallback->
21f10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
21f20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
21f30 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f     }.  }.  tplt_
21f40 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
21f50 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e   in, out, &linen
21f60 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
21f70 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
21f80 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  ining the symbol
21f90 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79  ic name of every
21fa0 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66   symbol.  */.  f
21fb0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
21fc0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
21fd0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
21fe0 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c  (line,"\"%s\",",
21ff0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
22000 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72  ->name);.    fpr
22010 69 6e 74 66 28 6f 75 74 2c 22 20 20 2f 2a 20 25  intf(out,"  /* %
22020 34 64 20 2a 2f 20 5c 22 25 73 5c 22 2c 5c 6e 22  4d */ \"%s\",\n"
22030 2c 69 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  ,i, lemp->symbol
22040 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  s[i]->name); lin
22050 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
22060 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
22070 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
22080 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
22090 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
220a0 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
220b0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
220c0 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
220d0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
220e0 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
220f0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
22100 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
22110 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
22120 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
22130 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
22140 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
22150 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
22160 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
22170 72 70 2d 3e 69 52 75 6c 65 3d 3d 69 20 29 3b 0a  rp->iRule==i );.
22180 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22190 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c  " /* %3d */ \"",
221a0 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75   i);.    writeRu
221b0 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
221c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
221d0 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
221e0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
221f0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
22200 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
22210 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
22220 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
22230 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
22240 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
22250 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
22260 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
22270 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
22280 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
22290 67 20 74 68 65 20 70 61 72 73 65 72 2e 0a 20 20  g the parser..  
222a0 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  ** (In other wor
222b0 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ds, generate the
222c0 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63 74   %destructor act
222d0 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ions).  */.  if(
222e0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
222f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65   ){.    int once
22300 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 1;.    for(i=
22310 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
22320 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
22330 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
22340 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
22350 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
22360 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70  sp==0 || sp->typ
22370 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f  e!=TERMINAL ) co
22380 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
22390 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
223a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
223b0 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41        /* TERMINA
223c0 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c  L Destructor */\
223d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
223e0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
223f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
22400 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
22410 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
22420 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
22430 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
22440 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
22450 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
22460 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70  >nsymbol && lemp
22470 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79  ->symbols[i]->ty
22480 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b  pe!=TERMINAL; i+
22490 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65  +);.    if( i<le
224a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
224b0 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75       emit_destru
224c0 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
224d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
224e0 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
224f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22500 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
22510 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
22520 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d   }.  }.  if( lem
22530 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
22540 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
22550 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20  *dflt_sp = 0;.  
22560 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
22570 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
22580 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
22590 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
225a0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
225b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
225c0 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20        if( sp==0 
225d0 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
225e0 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20  MINAL ||.       
225f0 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20     sp->index<=0 
22600 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
22610 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r!=0 ) continue;
22620 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
22630 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
22640 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f  tf(out, "      /
22650 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45  * Default NON-TE
22660 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f  RMINAL Destructo
22670 72 20 2a 2f 5c 6e 22 29 3b 6c 69 6e 65 6e 6f 2b  r */\n");lineno+
22680 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  +;.        once 
22690 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
226a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
226b0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
226c0 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e  %s */\n", sp->in
226d0 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
226e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
226f0 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20  dflt_sp = sp;.  
22700 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74    }.    if( dflt
22710 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  _sp!=0 ){.      
22720 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
22730 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70  code(out,dflt_sp
22740 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
22750 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
22760 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
22770 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
22780 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
22790 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
227a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
227b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
227c0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
227d0 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  ];.    if( sp==0
227e0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
227f0 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65  RMINAL || sp->de
22800 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f  structor==0 ) co
22810 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22820 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3c 30  sp->destLineno<0
22830 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
22840 20 41 6c 72 65 61 64 79 20 65 6d 69 74 74 65 64   Already emitted
22850 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
22860 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
22870 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
22880 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
22890 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  me); lineno++;..
228a0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
228b0 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
228c0 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
228d0 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
228e0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
228f0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
22900 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
22910 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
22920 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
22930 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
22940 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
22950 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
22960 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
22970 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
22980 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
22990 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
229a0 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
229b0 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
229c0 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
229d0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
229e0 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
229f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22a00 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20      sp2->index, 
22a10 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  sp2->name); line
22a20 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73  no++;.         s
22a30 70 32 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d  p2->destLineno =
22a40 20 2d 31 3b 20 20 2f 2a 20 41 76 6f 69 64 20 65   -1;  /* Avoid e
22a50 6d 69 74 74 69 6e 67 20 74 68 69 73 20 64 65 73  mitting this des
22a60 74 72 75 63 74 6f 72 20 61 67 61 69 6e 20 2a 2f  tructor again */
22a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22a80 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
22a90 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d  tor_code(out,lem
22aa0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65  p->symbols[i],le
22ab0 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
22ac0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
22ad0 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
22ae0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
22af0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
22b00 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
22b10 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
22b20 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
22b30 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65  executes wheneve
22b40 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  r the parser sta
22b50 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a  ck overflows */.
22b60 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
22b70 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72  ,lemp,lemp->over
22b80 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  flow,&lineno);. 
22b90 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
22ba0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
22bb0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
22bc0 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
22bd0 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74  of rule informat
22be0 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ion.  **.  ** No
22bf0 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65  te: This code de
22c00 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
22c10 74 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65  t that rules are
22c20 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71   number.  ** seq
22c30 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e  uentually beginn
22c40 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f  ing with 0..  */
22c50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c  .  for(i=0, rp=l
22c60 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
22c70 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29  p=rp->next, i++)
22c80 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
22c90 74 2c 22 20 20 7b 20 25 34 64 2c 20 25 34 64 20  t,"  { %4d, %4d 
22ca0 7d 2c 20 2f 2a 20 28 25 64 29 20 22 2c 72 70 2d  }, /* (%d) ",rp-
22cb0 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 2d 72 70 2d  >lhs->index,-rp-
22cc0 3e 6e 72 68 73 2c 69 29 3b 0a 20 20 20 20 72 75  >nrhs,i);.    ru
22cd0 6c 65 5f 70 72 69 6e 74 28 6f 75 74 2c 20 72 70  le_print(out, rp
22ce0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
22cf0 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ut," */\n"); lin
22d00 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
22d10 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
22d20 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
22d30 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
22d40 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
22d50 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61  cution during ea
22d60 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ch REDUCE action
22d70 20 2a 2f 0a 20 20 69 20 3d 20 30 3b 0a 20 20 66   */.  i = 0;.  f
22d80 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
22d90 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
22da0 74 29 7b 0a 20 20 20 20 69 20 2b 3d 20 74 72 61  t){.    i += tra
22db0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
22dc0 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  , rp);.  }.  if(
22dd0 20 69 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74   i ){.    fprint
22de0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 59  f(out,"        Y
22df0 59 4d 49 4e 4f 52 54 59 50 45 20 79 79 6c 68 73  YMINORTYPE yylhs
22e00 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20 6c 69 6e 65  minor;\n"); line
22e10 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  no++;.  }.  /* F
22e20 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65  irst output rule
22e30 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
22e40 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a   default: rule *
22e50 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
22e60 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
22e70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
22e80 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20  uct rule *rp2;  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ea0 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74 68  Other rules with
22eb0 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e   the same action
22ec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   */.    if( rp->
22ed0 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20 63 6f  codeEmitted ) co
22ee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22ef0 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 7b 0a 20 20  rp->noCode ){.  
22f00 20 20 20 20 2f 2a 20 4e 6f 20 43 20 63 6f 64 65      /* No C code
22f10 20 61 63 74 69 6f 6e 73 2c 20 73 6f 20 74 68 69   actions, so thi
22f20 73 20 77 69 6c 6c 20 62 65 20 70 61 72 74 20 6f  s will be part o
22f30 66 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  f the "default:"
22f40 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63   rule */.      c
22f50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
22f60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
22f70 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
22f80 2a 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29 3b  * ", rp->iRule);
22f90 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
22fa0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
22fb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
22fc0 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
22fd0 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70  ;.    for(rp2=rp
22fe0 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32  ->next; rp2; rp2
22ff0 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =rp2->next){.   
23000 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65     if( rp2->code
23010 3d 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 72 70  ==rp->code && rp
23020 32 2d 3e 63 6f 64 65 50 72 65 66 69 78 3d 3d 72  2->codePrefix==r
23030 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 0a 20 20  p->codePrefix.  
23040 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72 70             && rp
23050 32 2d 3e 63 6f 64 65 53 75 66 66 69 78 3d 3d 72  2->codeSuffix==r
23060 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 29 7b  p->codeSuffix ){
23070 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
23080 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65  (out,"      case
23090 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e   %d: /* ", rp2->
230a0 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  iRule);.        
230b0 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
230c0 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20 20  t, rp2);.       
230d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a   fprintf(out," *
230e0 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72  / yytestcase(yyr
230f0 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20  uleno==%d);\n", 
23100 72 70 32 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e  rp2->iRule); lin
23110 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72  eno++;.        r
23120 70 32 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20  p2->codeEmitted 
23130 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
23140 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65   }.    emit_code
23150 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69  (out,rp,lemp,&li
23160 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
23170 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
23180 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
23190 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  no++;.    rp->co
231a0 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  deEmitted = 1;. 
231b0 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c   }.  /* Finally,
231c0 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66 61   output the defa
231d0 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20 63  ult: rule.  We c
231e0 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65 66  hoose as the def
231f0 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65  ault: all.  ** e
23200 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a 2f  mpty actions. */
23210 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
23220 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c 6e        default:\n
23230 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
23240 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
23250 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
23260 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
23270 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20 63  >codeEmitted ) c
23280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
23290 65 72 74 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 20  ert( rp->noCode 
232a0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
232b0 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28 25 64  ut,"      /* (%d
232c0 29 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29 3b  ) ", rp->iRule);
232d0 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
232e0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
232f0 20 69 66 28 20 72 70 2d 3e 64 6f 65 73 52 65 64   if( rp->doesRed
23300 75 63 65 20 29 7b 0a 20 20 20 20 20 20 66 70 72  uce ){.      fpr
23310 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79  intf(out, " */ y
23320 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65  ytestcase(yyrule
23330 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d  no==%d);\n", rp-
23340 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b  >iRule); lineno+
23350 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
23360 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
23370 20 22 20 28 4f 50 54 49 4d 49 5a 45 44 20 4f 55   " (OPTIMIZED OU
23380 54 29 20 2a 2f 20 61 73 73 65 72 74 28 79 79 72  T) */ assert(yyr
23390 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c 6e 22 2c 0a  uleno!=%d);\n",.
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
233b0 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f  ->iRule); lineno
233c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
233d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
233e0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
233f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
23400 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
23410 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
23420 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
23430 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
23440 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65  cutes if a parse
23450 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74   fails */.  tplt
23460 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
23470 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c  lemp->failure,&l
23480 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
23490 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
234a0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
234b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
234c0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
234d0 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78  es when a syntax
234e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
234f0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
23500 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72  t,lemp,lemp->err
23510 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  or,&lineno);.  t
23520 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
23530 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
23540 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
23550 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
23560 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
23570 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20   parser accepts 
23580 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74  its input */.  t
23590 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
235a0 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c  mp,lemp->accept,
235b0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
235c0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
235d0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
235e0 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61  ;..  /* Append a
235f0 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65  ny addition code
23600 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65   the user desire
23610 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
23620 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
23630 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65  >extracode,&line
23640 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69  no);..  fclose(i
23650 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74  n);.  fclose(out
23660 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
23670 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65  /* Generate a he
23680 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68  ader file for th
23690 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
236a0 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74   ReportHeader(st
236b0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
236c0 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  ).{.  FILE *out,
236d0 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *in;.  const ch
236e0 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68  ar *prefix;.  ch
236f0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
23700 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72  ];.  char patter
23710 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69  n[LINESIZE];.  i
23720 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d  nt i;..  if( lem
23730 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
23740 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
23750 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65  tokenprefix;.  e
23760 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
23770 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
23780 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f  "";.  in = file_
23790 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
237a0 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29  rb");.  if( in )
237b0 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43 68  {.    int nextCh
237c0 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  ar;.    for(i=1;
237d0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
237e0 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65  al && fgets(line
237f0 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69  ,LINESIZE,in); i
23800 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e  ++){.      lemon
23810 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e  _sprintf(pattern
23820 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
23830 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20  s %3d\n",.      
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
23850 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
23860 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
23870 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
23880 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29  (line,pattern) )
23890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
238a0 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67 65    nextChar = fge
238b0 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c 6f  tc(in);.    fclo
238c0 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  se(in);.    if( 
238d0 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  i==lemp->ntermin
238e0 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d 3d  al && nextChar==
238f0 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  EOF ){.      /* 
23900 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65  No change in the
23910 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65   file.  Don't re
23920 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20  write it. */.   
23930 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
23940 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c  .  }.  out = fil
23950 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22  e_open(lemp,".h"
23960 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  ,"wb");.  if( ou
23970 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t ){.    for(i=1
23980 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
23990 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nal; i++){.     
239a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
239b0 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33  efine %s%-30s %3
239c0 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70  d\n",prefix,lemp
239d0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
239e0 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  me,i);.    }.   
239f0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
23a00 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
23a10 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
23a20 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
23a30 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
23a40 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
23a50 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
23a60 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
23a70 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
23a80 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
23a90 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
23aa0 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
23ab0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
23ac0 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
23ad0 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
23ae0 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
23af0 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
23b00 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
23b10 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
23b20 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  bles(struct lemo
23b30 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
23b40 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
23b50 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
23b60 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e 65 78 74  *ap, *ap2, *next
23b70 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
23b80 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62  e *rp, *rp2, *rb
23b90 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74  est;.  int nbest
23ba0 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  , n;.  int i;.  
23bb0 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61 72 64  int usesWildcard
23bc0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
23bd0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
23be0 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
23bf0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
23c00 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20     nbest = 0;.  
23c10 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20 20 20    rbest = 0;.   
23c20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20   usesWildcard = 
23c30 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  0;..    for(ap=s
23c40 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
23c50 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
23c60 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48  if( ap->type==SH
23c70 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c  IFT && ap->sp==l
23c80 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b  emp->wildcard ){
23c90 0a 20 20 20 20 20 20 20 20 75 73 65 73 57 69 6c  .        usesWil
23ca0 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20 20 20  dcard = 1;.     
23cb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d   }.      if( ap-
23cc0 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
23cd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23ce0 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
23cf0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
23d00 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e 75 65  Start ) continue
23d10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d  ;.      if( rp==
23d20 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
23d30 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  ;.      n = 1;. 
23d40 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d       for(ap2=ap-
23d50 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d  >next; ap2; ap2=
23d60 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  ap2->next){.    
23d70 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70      if( ap2->typ
23d80 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
23d90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70  inue;.        rp
23da0 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20  2 = ap2->x.rp;. 
23db0 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
23dc0 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
23dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
23de0 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20  2==rp ) n++;.   
23df0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
23e00 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nbest ){.      
23e10 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20    nbest = n;.   
23e20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b       rbest = rp;
23e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23e40 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61      /* Do not ma
23e50 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66 20  ke a default if 
23e60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75  the number of ru
23e70 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20  les to default. 
23e80 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20     ** is not at 
23e90 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20 74 68  least 1 or if th
23ea0 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
23eb0 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20   is a possible. 
23ec0 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e     ** lookahead.
23ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23ee0 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57  nbest<1 || usesW
23ef0 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e  ildcard ) contin
23f00 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ue;...    /* Com
23f10 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45  bine matching RE
23f20 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74  DUCE actions int
23f30 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75  o a single defau
23f40 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70  lt */.    for(ap
23f50 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
23f60 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
23f70 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
23f80 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
23f90 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61  rp==rbest ) brea
23fa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  k;.    }.    ass
23fb0 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61  ert( ap );.    a
23fc0 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  p->sp = Symbol_n
23fd0 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
23fe0 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e  .    for(ap=ap->
23ff0 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d  next; ap; ap=ap-
24000 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
24010 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
24020 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d  CE && ap->x.rp==
24030 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65  rbest ) ap->type
24040 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20   = NOT_USED;.   
24050 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d   }.    stp->ap =
24060 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
24070 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66 6f 72 28  ->ap);..    for(
24080 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
24090 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
240a0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
240b0 3d 3d 53 48 49 46 54 20 29 20 62 72 65 61 6b 3b  ==SHIFT ) break;
240c0 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
240d0 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
240e0 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73 74 20 29  p->x.rp!=rbest )
240f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
24100 20 20 69 66 28 20 61 70 3d 3d 30 20 29 7b 0a 20    if( ap==0 ){. 
24110 20 20 20 20 20 73 74 70 2d 3e 61 75 74 6f 52 65       stp->autoRe
24120 64 75 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  duce = 1;.      
24130 73 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63 65  stp->pDfltReduce
24140 20 3d 20 72 62 65 73 74 3b 0a 20 20 20 20 7d 0a   = rbest;.    }.
24150 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
24160 20 73 65 63 6f 6e 64 20 70 61 73 73 20 6f 76 65   second pass ove
24170 72 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64  r all states and
24180 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 76 65   actions.  Conve
24190 72 74 0a 20 20 2a 2a 20 65 76 65 72 79 20 61 63  rt.  ** every ac
241a0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 53  tion that is a S
241b0 48 49 46 54 20 74 6f 20 61 6e 20 61 75 74 6f 52  HIFT to an autoR
241c0 65 64 75 63 65 20 73 74 61 74 65 20 69 6e 74 6f  educe state into
241d0 0a 20 20 2a 2a 20 61 20 53 48 49 46 54 52 45 44  .  ** a SHIFTRED
241e0 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  UCE action..  */
241f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
24200 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
24210 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
24220 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
24230 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
24240 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
24250 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
24260 73 74 61 74 65 20 2a 70 4e 65 78 74 53 74 61 74  state *pNextStat
24270 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  e;.      if( ap-
24280 3e 74 79 70 65 21 3d 53 48 49 46 54 20 29 20 63  >type!=SHIFT ) c
24290 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
242a0 4e 65 78 74 53 74 61 74 65 20 3d 20 61 70 2d 3e  NextState = ap->
242b0 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 69 66 28  x.stp;.      if(
242c0 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 61 75 74   pNextState->aut
242d0 6f 52 65 64 75 63 65 20 26 26 20 70 4e 65 78 74  oReduce && pNext
242e0 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64 75  State->pDfltRedu
242f0 63 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ce!=0 ){.       
24300 20 61 70 2d 3e 74 79 70 65 20 3d 20 53 48 49 46   ap->type = SHIF
24310 54 52 45 44 55 43 45 3b 0a 20 20 20 20 20 20 20  TREDUCE;.       
24320 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70 4e 65 78   ap->x.rp = pNex
24330 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64  tState->pDfltRed
24340 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uce;.      }.   
24350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
24360 61 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63  a SHIFTREDUCE ac
24370 74 69 6f 6e 20 73 70 65 63 69 66 69 65 73 20 61  tion specifies a
24380 20 72 75 6c 65 20 74 68 61 74 20 68 61 73 20 61   rule that has a
24390 20 73 69 6e 67 6c 65 20 52 48 53 20 74 65 72 6d   single RHS term
243a0 0a 20 20 2a 2a 20 28 6d 65 61 6e 69 6e 67 20 74  .  ** (meaning t
243b0 68 61 74 20 74 68 65 20 53 48 49 46 54 52 45 44  hat the SHIFTRED
243c0 55 43 45 20 77 69 6c 6c 20 6c 61 6e 64 20 62 61  UCE will land ba
243d0 63 6b 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  ck in the state 
243e0 77 68 65 72 65 20 69 74 0a 20 20 2a 2a 20 73 74  where it.  ** st
243f0 61 72 74 65 64 29 20 61 6e 64 20 69 66 20 74 68  arted) and if th
24400 65 72 65 20 69 73 20 6e 6f 20 43 2d 63 6f 64 65  ere is no C-code
24410 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24420 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
24430 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  on,.  ** then we
24440 20 63 61 6e 20 67 6f 20 61 68 65 61 64 20 61 6e   can go ahead an
24450 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 61 63  d convert the ac
24460 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 73  tion to be the s
24470 61 6d 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ame as the.  ** 
24480 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 52  action for the R
24490 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a  HS of the rule..
244a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
244b0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
244c0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
244d0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
244e0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
244f0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 6e 65 78 74  >ap; ap; ap=next
24500 61 70 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 61  ap){.      nexta
24510 70 20 3d 20 61 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = ap->next;.  
24520 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
24530 21 3d 53 48 49 46 54 52 45 44 55 43 45 20 29 20  !=SHIFTREDUCE ) 
24540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24550 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
24560 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f 43       if( rp->noC
24570 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ode==0 ) continu
24580 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  e;.      if( rp-
24590 3e 6e 72 68 73 21 3d 31 20 29 20 63 6f 6e 74 69  >nrhs!=1 ) conti
245a0 6e 75 65 3b 0a 23 69 66 20 31 0a 20 20 20 20 20  nue;.#if 1.     
245b0 20 2f 2a 20 4f 6e 6c 79 20 61 70 70 6c 79 20 74   /* Only apply t
245c0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
245d0 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   to non-terminal
245e0 73 2e 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20  s.  It would be 
245f0 4f 4b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  OK to.      ** a
24600 70 70 6c 79 20 69 74 20 74 6f 20 74 65 72 6d 69  pply it to termi
24610 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 74 6f 6f 2c  nal symbols too,
24620 20 62 75 74 20 74 68 61 74 20 6d 61 6b 65 73 20   but that makes 
24630 74 68 65 20 70 61 72 73 65 72 20 74 61 62 6c 65  the parser table
24640 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
24650 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
24660 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
24670 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
24680 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66  continue;.#endif
24690 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
246a0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
246b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6f  , it means the o
246c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
246d0 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20  be applied */.  
246e0 20 20 20 20 6e 65 78 74 61 70 20 3d 20 61 70 3b      nextap = ap;
246f0 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 73  .      for(ap2=s
24700 74 70 2d 3e 61 70 3b 20 61 70 32 20 26 26 20 28  tp->ap; ap2 && (
24710 61 70 32 3d 3d 61 70 20 7c 7c 20 61 70 32 2d 3e  ap2==ap || ap2->
24720 73 70 21 3d 72 70 2d 3e 6c 68 73 29 3b 20 61 70  sp!=rp->lhs); ap
24730 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 7d 0a 20  2=ap2->next){}. 
24740 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 32       assert( ap2
24750 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 70 2d  !=0 );.      ap-
24760 3e 73 70 4f 70 74 20 3d 20 61 70 32 2d 3e 73 70  >spOpt = ap2->sp
24770 3b 0a 20 20 20 20 20 20 61 70 2d 3e 74 79 70 65  ;.      ap->type
24780 20 3d 20 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20   = ap2->type;.  
24790 20 20 20 20 61 70 2d 3e 78 20 3d 20 61 70 32 2d      ap->x = ap2-
247a0 3e 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  >x;.    }.  }.}.
247b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
247c0 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20 73  two states for s
247d0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
247e0 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73 74    The smaller st
247f0 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e  ate is the.** on
24800 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 20  e with the most 
24810 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74  non-terminal act
24820 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20 68  ions.  If they h
24830 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
24840 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65  ber.** of non-te
24850 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20  rminal actions, 
24860 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72  then the smaller
24870 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
24880 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b   the most.** tok
24890 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  en actions..*/.s
248a0 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65 52  tatic int stateR
248b0 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e  esortCompare(con
248c0 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
248d0 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f  t void *b){.  co
248e0 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
248f0 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pA = *(const s
24900 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61 3b  truct state**)a;
24910 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
24920 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f  state *pB = *(co
24930 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
24940 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  **)b;.  int n;..
24950 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74    n = pB->nNtAct
24960 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20   - pA->nNtAct;. 
24970 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
24980 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74   n = pB->nTknAct
24990 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a   - pA->nTknAct;.
249a0 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
249b0 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73 74        n = pB->st
249c0 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74 61  atenum - pA->sta
249d0 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  tenum;.    }.  }
249e0 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30 20  .  assert( n!=0 
249f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
24a00 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65  .../*.** Renumbe
24a10 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74 61  r and resort sta
24a20 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
24a30 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
24a40 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61  oices.** occur a
24a50 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63 65  t the end.  Exce
24a60 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20 30  pt, keep state 0
24a70 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73 74   as the first st
24a80 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73  ate..*/.void Res
24a90 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63 74  ortStates(struct
24aa0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
24ab0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
24ac0 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
24ad0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
24ae0 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p;..  for(i=0; i
24af0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
24b00 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
24b10 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
24b20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
24b30 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d   = stp->nNtAct =
24b40 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44 66   0;.    stp->iDf
24b50 6c 74 52 65 64 75 63 65 20 3d 20 2d 31 3b 20 2f  ltReduce = -1; /
24b60 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74 69  * Init dflt acti
24b70 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65 72  on to "syntax er
24b80 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70 2d  ror" */.    stp-
24b90 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f  >iTknOfst = NO_O
24ba0 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e  FFSET;.    stp->
24bb0 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  iNtOfst = NO_OFF
24bc0 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  SET;.    for(ap=
24bd0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
24be0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
24bf0 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20 63   int iAction = c
24c00 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
24c10 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69 66  mp,ap);.      if
24c20 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a  ( iAction>=0 ){.
24c30 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
24c40 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
24c50 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
24c60 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e         stp->nTkn
24c70 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
24c80 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d  else if( ap->sp-
24c90 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79  >index<lemp->nsy
24ca0 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mbol ){.        
24cb0 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b    stp->nNtAct++;
24cc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24cd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24ce0 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63  ( stp->autoReduc
24cf0 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44 66  e==0 || stp->pDf
24d00 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78 2e  ltReduce==ap->x.
24d10 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rp );.          
24d20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65  stp->iDfltReduce
24d30 20 3d 20 69 41 63 74 69 6f 6e 3b 0a 20 20 20 20   = iAction;.    
24d40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24d50 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28    }.  }.  qsort(
24d60 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d  &lemp->sorted[1]
24d70 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31  , lemp->nstate-1
24d80 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73  , sizeof(lemp->s
24d90 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20  orted[0]),.     
24da0 20 20 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f     stateResortCo
24db0 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d  mpare);.  for(i=
24dc0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
24dd0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  e; i++){.    lem
24de0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74  p->sorted[i]->st
24df0 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a  atenum = i;.  }.
24e00 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 20    lemp->nxstate 
24e10 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
24e20 20 20 77 68 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e    while( lemp->n
24e30 78 73 74 61 74 65 3e 31 20 26 26 20 6c 65 6d 70  xstate>1 && lemp
24e40 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e  ->sorted[lemp->n
24e50 78 73 74 61 74 65 2d 31 5d 2d 3e 61 75 74 6f 52  xstate-1]->autoR
24e60 65 64 75 63 65 20 29 7b 0a 20 20 20 20 6c 65 6d  educe ){.    lem
24e70 70 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b 0a 20 20  p->nxstate--;.  
24e80 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
24e90 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
24ea0 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a  e file "set.c" *
24eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ed0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d  ***/./*.** Set m
24ee0 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74  anipulation rout
24ef0 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d  ines for the LEM
24f00 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
24f10 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
24f20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  int size = 0;../
24f30 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69  * Set the set si
24f40 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69  ze */.void SetSi
24f50 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69  ze(int n).{.  si
24f60 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20  ze = n+1;.}../* 
24f70 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
24f80 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e  et */.char *SetN
24f90 65 77 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ew(void){.  char
24fa0 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72   *s;.  s = (char
24fb0 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20  *)calloc( size, 
24fc0 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29  1);.  if( s==0 )
24fd0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
24fe0 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
24ff0 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ;.    memory_err
25000 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
25010 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c  rn s;.}../* Deal
25020 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
25030 76 6f 69 64 20 53 65 74 46 72 65 65 28 63 68 61  void SetFree(cha
25040 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73  r *s).{.  free(s
25050 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  );.}../* Add a n
25060 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
25070 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54  e set.  Return T
25080 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65  RUE if the eleme
25090 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20  nt was added.** 
250a0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20  and FALSE if it 
250b0 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72  was already ther
250c0 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64  e. */.int SetAdd
250d0 28 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29  (char *s, int e)
250e0 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61  .{.  int rv;.  a
250f0 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65  ssert( e>=0 && e
25100 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20  <size );.  rv = 
25110 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
25120 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
25130 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
25140 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
25150 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
25160 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
25170 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
25180 28 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20  (char *s1, char 
25190 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  *s2).{.  int i, 
251a0 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67  progress;.  prog
251b0 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ress = 0;.  for(
251c0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
251d0 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d  ){.    if( s2[i]
251e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
251f0 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30      if( s1[i]==0
25200 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65   ){.      progre
25210 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31  ss = 1;.      s1
25220 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  [i] = 1;.    }. 
25230 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67   }.  return prog
25240 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ress;.}./*******
25250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
25260 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
25270 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.c" ********
25280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25290 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
252a0 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
252b0 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
252c0 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
252d0 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
252e0 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
252f0 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
25300 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
25310 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
25320 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
25330 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
25340 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
25350 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
25360 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
25370 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
25380 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
25390 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
253a0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
253b0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
253c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
253d0 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
253e0 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45  tor..*/..PRIVATE
253f0 20 75 6e 73 69 67 6e 65 64 20 73 74 72 68 61 73   unsigned strhas
25400 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29  h(const char *x)
25410 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 20  .{.  unsigned h 
25420 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78  = 0;.  while( *x
25430 20 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28   ) h = h*13 + *(
25440 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68  x++);.  return h
25450 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69  ;.}../* Works li
25460 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20  ke strdup, sort 
25470 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69  of.  Save a stri
25480 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d  ng in malloced m
25490 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65  emory, but.** ke
254a0 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  ep strings in a 
254b0 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  table so that th
254c0 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73  e same string is
254d0 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20   not in more.** 
254e0 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a  than one place..
254f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  */.const char *S
25500 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61  trsafe(const cha
25510 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  r *y).{.  const 
25520 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20  char *z;.  char 
25530 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d 3d  *cpy;..  if( y==
25540 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25550 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64  z = Strsafe_find
25560 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  (y);.  if( z==0 
25570 26 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a 29  && (cpy=(char *)
25580 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
25590 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29  len(y)+1 ))!=0 )
255a0 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63  {.    lemon_strc
255b0 70 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a  py(cpy,y);.    z
255c0 20 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73   = cpy;.    Strs
255d0 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20  afe_insert(z);. 
255e0 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b   }.  MemoryCheck
255f0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  (z);.  return z;
25600 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
25610 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
25620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
25630 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
25640 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
25650 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
25660 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  1"..*/.struct s_
25670 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x1 {.  int size;
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25690 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
256a0 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
256b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
256d0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
256e0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
256f0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
25720 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
25730 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
25740 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
25750 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
25760 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
25770 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x1node *tbl;
25780 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
25790 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
257a0 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
257b0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
257c0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
257d0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
257e0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
257f0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
25800 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
25810 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
25820 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
25830 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
25840 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
25850 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20  uct s_x1node {. 
25860 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74   const char *dat
25870 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  a;        /* The
25880 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
25890 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74  t s_x1node *next
258a0 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
258b0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
258c0 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
258d0 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x1node **from
258e0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
258f0 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b  ink */.} x1node;
25900 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
25910 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
25920 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
25930 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
25940 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
25950 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b  truct s_x1 *x1a;
25960 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
25970 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
25980 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
25990 72 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29  rsafe_init(void)
259a0 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65  {.  if( x1a ) re
259b0 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73  turn;.  x1a = (s
259c0 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c  truct s_x1*)mall
259d0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
259e0 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28  t s_x1) );.  if(
259f0 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d   x1a ){.    x1a-
25a00 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  >size = 1024;.  
25a10 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x1a->count = 0
25a20 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d  ;.    x1a->tbl =
25a30 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x1node*)calloc
25a40 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78 31  (1024, sizeof(x1
25a50 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
25a60 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  1node*));.    if
25a70 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x1a->tbl==0 ){
25a80 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29  .      free(x1a)
25a90 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b  ;.      x1a = 0;
25aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ab0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
25ac0 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65  1a->ht = (x1node
25ad0 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30  **)&(x1a->tbl[10
25ae0 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  24]);.      for(
25af0 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b  i=0; i<1024; i++
25b00 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x1a->ht[i] = 0
25b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
25b20 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
25b30 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
25b40 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
25b50 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
25b60 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
25b70 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
25b80 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
25b90 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61  ten */.int Strsa
25ba0 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20  fe_insert(const 
25bb0 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20 20  char *data).{.  
25bc0 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e  x1node *np;.  un
25bd0 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69  signed h;.  unsi
25be0 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20  gned ph;..  if( 
25bf0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
25c00 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73  0;.  ph = strhas
25c10 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
25c20 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
25c30 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
25c40 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
25c50 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
25c60 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74  cmp(np->data,dat
25c70 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
25c80 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
25c90 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
25ca0 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
25cb0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
25cc0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
25cd0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
25ce0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
25cf0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
25d00 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
25d10 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75  }.  if( x1a->cou
25d20 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x1a->size ){
25d30 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
25d40 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
25d50 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
25d60 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
25d70 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31  .    struct s_x1
25d80 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
25d90 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65  y.size = arrSize
25da0 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x1a->size*2;.
25db0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
25dc0 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x1a->count;.  
25dd0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
25de0 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72  1node*)calloc(ar
25df0 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 31  rSize, sizeof(x1
25e00 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
25e10 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  1node*));.    if
25e20 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
25e30 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
25e40 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
25e50 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
25e60 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e   array.ht = (x1n
25e70 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
25e80 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20  l[arrSize]);.   
25e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
25ea0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
25eb0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
25ec0 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
25ed0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
25ee0 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
25ef0 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
25f00 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
25f10 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
25f20 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
25f30 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a 65  data) & (arrSize
25f40 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
25f50 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
25f60 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
25f70 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
25f80 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
25f90 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
25fa0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
25fb0 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
25fc0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
25fd0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
25fe0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
25ff0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
26000 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
26010 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
26020 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
26030 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x1a->tbl);.    *
26040 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x1a = array;.  }
26050 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
26060 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
26070 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69   = ph & (x1a->si
26080 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
26090 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f  x1a->tbl[x1a->co
260a0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
260b0 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
260c0 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x1a->ht[h] ) x
260d0 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  1a->ht[h]->from 
260e0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
260f0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d   np->next = x1a-
26100 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68  >ht[h];.  x1a->h
26110 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
26120 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68  >from = &(x1a->h
26130 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
26140 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
26150 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
26160 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
26170 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
26180 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
26190 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
261a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73  const char *Strs
261b0 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  afe_find(const c
261c0 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e  har *key).{.  un
261d0 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e 6f  signed h;.  x1no
261e0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
261f0 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
26200 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
26210 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a  key) & (x1a->siz
26220 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
26230 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
26240 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
26250 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
26260 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
26270 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
26280 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
26290 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
262a0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
262b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
262c0 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e  e (terminal or n
262d0 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62  onterminal) symb
262e0 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74  ol "x"..** Creat
262f0 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69  e a new symbol i
26300 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
26310 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73  rst time "x" has
26320 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73   been seen..*/.s
26330 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
26340 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63  mbol_new(const c
26350 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75  har *x).{.  stru
26360 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
26370 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
26380 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
26390 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
263a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
263b0 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
263c0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20  (struct symbol) 
263d0 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65  );.    MemoryChe
263e0 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e  ck(sp);.    sp->
263f0 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78  name = Strsafe(x
26400 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20  );.    sp->type 
26410 3d 20 49 53 55 50 50 45 52 28 2a 78 29 20 3f 20  = ISUPPER(*x) ? 
26420 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45  TERMINAL : NONTE
26430 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e  RMINAL;.    sp->
26440 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70  rule = 0;.    sp
26450 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
26460 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d      sp->prec = -
26470 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63  1;.    sp->assoc
26480 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e   = UNK;.    sp->
26490 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20  firstset = 0;.  
264a0 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c    sp->lambda = L
264b0 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20  EMON_FALSE;.    
264c0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  sp->destructor =
264d0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74   0;.    sp->dest
264e0 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  Lineno = 0;.    
264f0 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30  sp->datatype = 0
26500 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74  ;.    sp->useCnt
26510 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c   = 0;.    Symbol
26520 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e  _insert(sp,sp->n
26530 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e  ame);.  }.  sp->
26540 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75  useCnt++;.  retu
26550 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  rn sp;.}../* Com
26560 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73  pare two symbols
26570 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
26580 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e  poses.  Return n
26590 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f  egative,.** zero
265a0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
265b0 20 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e 2c   a is less then,
265c0 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
265d0 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62 2e  eater.** than b.
265e0 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74  .**.** Symbols t
265f0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75  hat begin with u
26600 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  pper case letter
26610 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20  s (terminals or 
26620 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20  tokens).** must 
26630 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62  sort before symb
26640 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ols that begin w
26650 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c  ith lower case l
26660 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74  etters.** (non-t
26670 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64 20  erminals).  And 
26680 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73 79  MULTITERMINAL sy
26690 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20 75  mbols (created u
266a0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f 6b  sing the.** %tok
266b0 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74 69  en_class directi
266c0 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61 74  ve) must sort at
266d0 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20 4f   the very end. O
266e0 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 61  ther than.** tha
266f0 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  t, the order doe
26700 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a  s not matter..**
26710 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65  .** We find expe
26720 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20  rimentally that 
26730 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62  leaving the symb
26740 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69  ols in their ori
26750 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28  ginal.** order (
26760 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61  the order they a
26770 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67  ppeared in the g
26780 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76  rammar file) giv
26790 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65  es the.** smalle
267a0 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73  st parser tables
267b0 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69   in SQLite..*/.i
267c0 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f  nt Symbolcmpp(co
267d0 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f  nst void *_a, co
267e0 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a  nst void *_b).{.
267f0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
26800 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e  ymbol *a = *(con
26810 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
26820 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74   **) _a;.  const
26830 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
26840 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  b = *(const stru
26850 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62  ct symbol **) _b
26860 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d 3e  ;.  int i1 = a->
26870 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
26880 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d  NAL ? 3 : a->nam
26890 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31  e[0]>'Z' ? 2 : 1
268a0 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d 3e  ;.  int i2 = b->
268b0 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
268c0 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d  NAL ? 3 : b->nam
268d0 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31  e[0]>'Z' ? 2 : 1
268e0 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d 69  ;.  return i1==i
268f0 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20 62  2 ? a->index - b
26900 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20 69  ->index : i1 - i
26910 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  2;.}../* There i
26920 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
26930 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
26940 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
26950 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
26960 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
26970 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
26980 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
26990 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
269a0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
269b0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
269c0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
269f0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
26a00 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
26a30 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
26a40 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
26a50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26a60 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
26a70 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
26a80 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
26a90 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
26aa0 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
26ab0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
26ac0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
26ad0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
26ae0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
26af0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
26b00 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
26b10 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
26b20 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
26b30 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
26b40 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
26b50 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
26b60 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
26b70 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
26b80 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54   *data;     /* T
26b90 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e  he data */.  con
26ba0 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  st char *key;   
26bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
26bc0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
26bd0 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  2node *next;   /
26be0 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
26bf0 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
26c00 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
26c10 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
26c20 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
26c30 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x2node;../* 
26c40 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
26c50 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
26c60 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
26c70 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26c80 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
26c90 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20   s_x2 *x2a;../* 
26ca0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
26cb0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
26cc0 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f   */.void Symbol_
26cd0 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66  init(void){.  if
26ce0 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x2a ) return;.
26cf0 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74 20    x2a = (struct 
26d00 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x2*)malloc( si
26d10 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32  zeof(struct s_x2
26d20 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29  ) );.  if( x2a )
26d30 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20  {.    x2a->size 
26d40 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e  = 128;.    x2a->
26d50 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
26d60 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64  2a->tbl = (x2nod
26d70 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73  e*)calloc(128, s
26d80 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20  izeof(x2node) + 
26d90 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29  sizeof(x2node*))
26da0 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74  ;.    if( x2a->t
26db0 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
26dc0 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20  ree(x2a);.      
26dd0 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x2a = 0;.    }el
26de0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
26df0 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d  .      x2a->ht =
26e00 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61   (x2node**)&(x2a
26e10 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
26e20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
26e30 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b  8; i++) x2a->ht[
26e40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
26e50 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
26e60 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
26e70 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
26e80 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
26e90 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
26ea0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
26eb0 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
26ec0 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
26ed0 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
26ee0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
26ef0 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
26f00 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20  key).{.  x2node 
26f10 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
26f20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
26f30 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
26f40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
26f50 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b   = strhash(key);
26f60 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61  .  h = ph & (x2a
26f70 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
26f80 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
26f90 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
26fa0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
26fb0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
26fc0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
26fd0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
26fe0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
26ff0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
27000 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
27010 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
27020 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
27030 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
27040 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
27050 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32  xt;.  }.  if( x2
27060 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73  a->count>=x2a->s
27070 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
27080 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
27090 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
270a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72   */.    int i,ar
270b0 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  rSize;.    struc
270c0 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20  t s_x2 array;.  
270d0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61    array.size = a
270e0 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69  rrSize = x2a->si
270f0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
27100 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75  count = x2a->cou
27110 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
27120 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c  l = (x2node*)cal
27130 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
27140 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
27150 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a  zeof(x2node*));.
27160 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
27170 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
27180 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
27190 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
271a0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
271b0 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x2node**)&(ar
271c0 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d  ray.tbl[arrSize]
271d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
271e0 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
271f0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
27200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27210 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x2a->count; i++)
27220 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a  {.      x2node *
27230 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
27240 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
27250 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  2a->tbl[i]);.   
27260 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
27270 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61 72  ldnp->key) & (ar
27280 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  rSize-1);.      
27290 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
272a0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
272b0 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
272c0 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
272d0 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
272e0 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
272f0 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
27300 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
27310 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e  p->key = oldnp->
27320 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  key;.      newnp
27330 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
27340 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
27350 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
27360 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
27370 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
27380 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
27390 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x2a->tbl);. 
273a0 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b     *x2a = array;
273b0 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
273c0 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
273d0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61  .  h = ph & (x2a
273e0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
273f0 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61  = &(x2a->tbl[x2a
27400 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
27410 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  p->key = key;.  
27420 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
27430 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68  .  if( x2a->ht[h
27440 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x2a->ht[h]->
27450 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
27460 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
27470 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x2a->ht[h];.  x
27480 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  2a->ht[h] = np;.
27490 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
274a0 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  2a->ht[h]);.  re
274b0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
274c0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
274d0 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
274e0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
274f0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
27500 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
27510 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
27520 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  ol *Symbol_find(
27530 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
27540 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  .{.  unsigned h;
27550 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x2node *np;..
27560 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
27570 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
27580 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  trhash(key) & (x
27590 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
275a0 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
275b0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
275c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
275d0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
275e0 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
275f0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
27600 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
27610 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
27620 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20  Return the n-th 
27630 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55  data.  Return NU
27640 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f  LL if n is out o
27650 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75  f range. */.stru
27660 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
27670 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20  l_Nth(int n).{. 
27680 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
27690 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20  data;.  if( x2a 
276a0 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61  && n>0 && n<=x2a
276b0 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64  ->count ){.    d
276c0 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e  ata = x2a->tbl[n
276d0 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73  -1].data;.  }els
276e0 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b  e{.    data = 0;
276f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61  .  }.  return da
27700 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ta;.}../* Return
27710 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
27720 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79   array */.int Sy
27730 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20  mbol_count().{. 
27740 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32   return x2a ? x2
27750 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a  a->count : 0;.}.
27760 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
27770 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
27780 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
27790 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
277a0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
277b0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
277c0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
277d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
277e0 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
277f0 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
27800 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
27810 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62  ct symbol **Symb
27820 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20  ol_arrayof().{. 
27830 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
27840 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c  *array;.  int i,
27850 61 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78  arrSize;.  if( x
27860 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
27870 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78 32  ;.  arrSize = x2
27880 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
27890 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  y = (struct symb
278a0 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72  ol **)calloc(arr
278b0 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72  Size, sizeof(str
278c0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a  uct symbol *));.
278d0 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
278e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
278f0 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  rSize; i++) arra
27900 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  y[i] = x2a->tbl[
27910 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
27920 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
27930 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63  /* Compare two c
27940 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
27950 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63  .int Configcmp(c
27960 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f  onst char *_a,co
27970 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a  nst char *_b).{.
27980 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
27990 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75  onfig *a = (stru
279a0 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b  ct config *) _a;
279b0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
279c0 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72  config *b = (str
279d0 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62  uct config *) _b
279e0 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d  ;.  int x;.  x =
279f0 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
27a00 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
27a10 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61  if( x==0 ) x = a
27a20 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a  ->dot - b->dot;.
27a30 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f    return x;.}../
27a40 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
27a50 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20  ates */.PRIVATE 
27a60 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74 72  int statecmp(str
27a70 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73  uct config *a, s
27a80 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29  truct config *b)
27a90 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66  .{.  int rc;.  f
27aa0 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26  or(rc=0; rc==0 &
27ab0 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e  & a && b;  a=a->
27ac0 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20  bp, b=b->bp){.  
27ad0 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e    rc = a->rp->in
27ae0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
27af0 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ex;.    if( rc==
27b00 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20  0 ) rc = a->dot 
27b10 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20  - b->dot;.  }.  
27b20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
27b30 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b   if( a ) rc = 1;
27b40 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20  .    if( b ) rc 
27b50 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
27b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  rn rc;.}../* Has
27b70 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49  h a state */.PRI
27b80 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74  VATE unsigned st
27b90 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20 63  atehash(struct c
27ba0 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e  onfig *a).{.  un
27bb0 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68  signed h=0;.  wh
27bc0 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
27bd0 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
27be0 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
27bf0 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
27c00 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
27c10 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
27c20 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
27c30 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
27c40 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
27c50 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
27c60 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b  state *newstate;
27c70 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73  .  newstate = (s
27c80 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63 61  truct state *)ca
27c90 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
27ca0 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a  truct state) );.
27cb0 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65    MemoryCheck(ne
27cc0 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72  wstate);.  retur
27cd0 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f  n newstate;.}../
27ce0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
27cf0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
27d00 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
27d10 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
27d20 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
27d30 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
27d40 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a  /.struct s_x3 {.
27d50 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
27d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27d70 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
27d80 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
27db0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
27dc0 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
27dd0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
27e00 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
27e30 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
27e40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
27e50 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  3node *tbl;  /* 
27e60 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
27e70 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
27e80 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x3node **ht; 
27e90 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
27ea0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
27eb0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
27ec0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
27ed0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
27ee0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
27ef0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
27f00 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
27f10 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
27f20 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
27f30 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x3node {.  stru
27f40 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20  ct state *data; 
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
27f70 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
27f80 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
27f90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
27fa0 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
27fb0 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x3node *next;  
27fc0 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
27fd0 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
27fe0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
27ff0 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x3node **from;  
28000 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
28010 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f   */.} x3node;../
28020 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
28030 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
28040 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
28050 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
28060 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
28070 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f  ct s_x3 *x3a;../
28080 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28090 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
280a0 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65  ay */.void State
280b0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _init(void){.  i
280c0 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b  f( x3a ) return;
280d0 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74  .  x3a = (struct
280e0 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x3*)malloc( s
280f0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
28100 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20  3) );.  if( x3a 
28110 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65  ){.    x3a->size
28120 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d   = 128;.    x3a-
28130 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
28140 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f  x3a->tbl = (x3no
28150 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20  de*)calloc(128, 
28160 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
28170 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
28180 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e  );.    if( x3a->
28190 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
281a0 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20  free(x3a);.     
281b0 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x3a = 0;.    }e
281c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
281d0 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20  ;.      x3a->ht 
281e0 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33  = (x3node**)&(x3
281f0 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
28200 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
28210 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74  28; i++) x3a->ht
28220 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
28230 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
28240 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
28250 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
28260 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
28270 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
28280 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
28290 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
282a0 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
282b0 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73  t State_insert(s
282c0 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
282d0 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a, struct config
282e0 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64   *key).{.  x3nod
282f0 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65  e *np;.  unsigne
28300 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  d h;.  unsigned 
28310 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  ph;..  if( x3a==
28320 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
28330 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b  ph = statehash(k
28340 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
28350 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
28360 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
28370 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
28380 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
28390 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
283a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
283b0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
283c0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
283d0 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
283e0 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
283f0 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
28400 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
28410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
28420 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
28430 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
28440 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x3a->count>=
28450 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x3a->size ){.   
28460 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
28470 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
28480 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
28490 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20  t i,arrSize;.   
284a0 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72   struct s_x3 arr
284b0 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
284c0 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78  ze = arrSize = x
284d0 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  3a->size*2;.    
284e0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33  array.count = x3
284f0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
28500 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  ray.tbl = (x3nod
28510 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  e*)calloc(arrSiz
28520 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65  e, sizeof(x3node
28530 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
28540 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72  e*));.    if( ar
28550 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
28560 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
28570 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
28580 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
28590 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  ay.ht = (x3node*
285a0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72  *)&(array.tbl[ar
285b0 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  rSize]);.    for
285c0 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b  (i=0; i<arrSize;
285d0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
285e0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
285f0 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74  =0; i<x3a->count
28600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33  ; i++){.      x3
28610 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
28620 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
28630 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d   = &(x3a->tbl[i]
28640 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61  );.      h = sta
28650 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  tehash(oldnp->ke
28660 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29  y) & (arrSize-1)
28670 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
28680 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
28690 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
286a0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
286b0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
286c0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
286d0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
286e0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
286f0 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
28700 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
28710 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
28720 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
28730 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
28740 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
28750 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
28760 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
28770 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d   }.    free(x3a-
28780 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20  >tbl);.    *x3a 
28790 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
287a0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
287b0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
287c0 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
287d0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d  );.  np = &(x3a-
287e0 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x3a->count+
287f0 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
28800 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
28810 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
28820 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d  3a->ht[h] ) x3a-
28830 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
28840 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
28850 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74  ->next = x3a->ht
28860 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68  [h];.  x3a->ht[h
28870 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
28880 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68  om = &(x3a->ht[h
28890 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
288a0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
288b0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
288c0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
288d0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
288e0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
288f0 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
28900 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
28910 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
28920 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e  fig *key).{.  un
28930 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e 6f  signed h;.  x3no
28940 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
28950 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
28960 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61 73  ;.  h = statehas
28970 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73  h(key) & (x3a->s
28980 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
28990 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
289a0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
289b0 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
289c0 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ey,key)==0 ) bre
289d0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
289e0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
289f0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
28a00 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
28a10 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
28a20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
28a30 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
28a40 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
28a50 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
28a60 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
28a70 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
28a80 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
28a90 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
28aa0 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
28ab0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
28ac0 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
28ad0 66 28 76 6f 69 64 29 0a 7b 0a 20 20 73 74 72 75  f(void).{.  stru
28ae0 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
28af0 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a  ;.  int i,arrSiz
28b00 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
28b10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72  ) return 0;.  ar
28b20 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75  rSize = x3a->cou
28b30 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
28b40 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 63  truct state **)c
28b50 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
28b60 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61  izeof(struct sta
28b70 74 65 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72  te *));.  if( ar
28b80 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
28b90 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
28ba0 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
28bb0 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  3a->tbl[i].data;
28bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
28bd0 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20  ray;.}../* Hash 
28be0 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
28bf0 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67  */.PRIVATE unsig
28c00 6e 65 64 20 63 6f 6e 66 69 67 68 61 73 68 28 73  ned confighash(s
28c10 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29  truct config *a)
28c20 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3d  .{.  unsigned h=
28c30 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b  0;.  h = h*571 +
28c40 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37   a->rp->index*37
28c50 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74   + a->dot;.  ret
28c60 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn h;.}../* The
28c70 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
28c80 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
28c90 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
28ca0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
28cb0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
28cc0 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72  ype "x4"..*/.str
28cd0 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74  uct s_x4 {.  int
28ce0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
28cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
28d00 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
28d10 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
28d40 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
28d50 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
28d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
28d80 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
28d90 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
28da0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28db0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
28dc0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
28dd0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
28de0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
28df0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
28e00 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
28e10 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
28e20 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
28e30 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
28e40 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
28e50 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
28e60 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
28e70 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
28e80 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
28e90 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
28ea0 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x4"..*/.typed
28eb0 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  ef struct s_x4no
28ec0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  de {.  struct co
28ed0 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20  nfig *data;     
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ef0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
28f00 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e  ruct s_x4node *n
28f10 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
28f20 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
28f30 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
28f40 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66  uct s_x4node **f
28f50 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
28f60 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f  s link */.} x4no
28f70 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
28f80 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
28f90 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
28fa0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
28fb0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
28fc0 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78  c struct s_x4 *x
28fd0 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  4a;../* Allocate
28fe0 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
28ff0 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
29000 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
29010 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78  t(void){.  if( x
29020 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  4a ) return;.  x
29030 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  4a = (struct s_x
29040 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  4*)malloc( sizeo
29050 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29  f(struct s_x4) )
29060 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20  ;.  if( x4a ){. 
29070 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36     x4a->size = 6
29080 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e  4;.    x4a->coun
29090 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e  t = 0;.    x4a->
290a0 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63  tbl = (x4node*)c
290b0 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f 66  alloc(64, sizeof
290c0 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
290d0 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x4node*));.   
290e0 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30   if( x4a->tbl==0
290f0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
29100 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d  4a);.      x4a =
29110 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
29120 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29130 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e    x4a->ht = (x4n
29140 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c  ode**)&(x4a->tbl
29150 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  [64]);.      for
29160 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29  (i=0; i<64; i++)
29170 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
29180 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
29190 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
291a0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
291b0 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
291c0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
291d0 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
291e0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
291f0 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
29200 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67  en */.int Config
29210 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72  table_insert(str
29220 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
29230 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70  ).{.  x4node *np
29240 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
29250 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
29260 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
29270 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
29280 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29  confighash(data)
29290 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  ;.  h = ph & (x4
292a0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
292b0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
292c0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
292d0 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
292e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
292f0 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
29300 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30 20  har *) data)==0 
29310 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
29320 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
29330 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
29340 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
29350 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
29360 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
29370 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
29380 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29390 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
293a0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
293b0 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34  ( x4a->count>=x4
293c0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
293d0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
293e0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
293f0 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
29400 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73  i,arrSize;.    s
29410 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
29420 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
29430 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 34 61   = arrSize = x4a
29440 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
29450 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d  ray.count = x4a-
29460 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
29470 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  y.tbl = (x4node*
29480 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
29490 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20   sizeof(x4node) 
294a0 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
294b0 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
294c0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
294d0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
294e0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
294f0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
29500 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29  .ht = (x4node**)
29510 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53  &(array.tbl[arrS
29520 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
29530 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
29540 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
29550 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
29560 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
29570 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f  i++){.      x4no
29580 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
29590 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
295a0 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x4a->tbl[i]);
295b0 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69  .      h = confi
295c0 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74  ghash(oldnp->dat
295d0 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29  a) & (arrSize-1)
295e0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
295f0 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
29600 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
29610 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
29620 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
29630 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
29640 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
29650 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
29660 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
29670 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
29680 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
29690 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
296a0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
296b0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
296c0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61    }.    free(x4a
296d0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61  ->tbl);.    *x4a
296e0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
296f0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
29700 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
29710 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
29720 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61  1);.  np = &(x4a
29730 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74  ->tbl[x4a->count
29740 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
29750 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
29760 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d  4a->ht[h] ) x4a-
29770 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
29780 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
29790 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74  ->next = x4a->ht
297a0 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68  [h];.  x4a->ht[h
297b0 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
297c0 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68  om = &(x4a->ht[h
297d0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
297e0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
297f0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
29800 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
29810 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
29820 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
29830 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
29840 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
29850 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72  igtable_find(str
29860 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29  uct config *key)
29870 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34  .{.  int h;.  x4
29880 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
29890 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
298a0 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67   0;.  h = config
298b0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61  hash(key) & (x4a
298c0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
298d0 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
298e0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
298f0 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28   if( Configcmp((
29900 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70  const char *) np
29910 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68  ->data,(const ch
29920 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20  ar *) key)==0 ) 
29930 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
29940 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
29950 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
29960 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
29970 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
29980 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
29990 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
299a0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
299b0 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
299c0 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
299d0 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
299e0 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
299f0 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
29a00 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66  ble_clear(int(*f
29a10 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
29a20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *)).{.  int i;. 
29a30 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78   if( x4a==0 || x
29a40 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72  4a->count==0 ) r
29a50 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29  eturn;.  if( f )
29a60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
29a70 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66  >count; i++) (*f
29a80 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  )(x4a->tbl[i].da
29a90 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ta);.  for(i=0; 
29aa0 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b  i<x4a->size; i++
29ab0 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
29ac0 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d  ;.  x4a->count =
29ad0 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.