/ Hex Artifact Content
Login

Artifact 60d1e1eb0f7ebae709f68f1472d77fbf291c5345cd98ff417219da7e74fd09e9:


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 69 6e 74 20 62  bject */.  int b
2310: 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
2320: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2330: 68 69 73 20 73 79 6d 62 6f 6c 20 65 76 65 72 20  his symbol ever 
2340: 63 61 72 72 69 65 73 20 63 6f 6e 74 65 6e 74 20  carries content 
2350: 2d 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  - if.           
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2a 2a 20 69 74 20 69 73 20 65 76 65 72 20 6d 6f  ** it is ever mo
2380: 72 65 20 74 68 61 6e 20 6a 75 73 74 20 73 79 6e  re than just syn
2390: 74 61 78 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20  tax */.  /* The 
23a0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
23b0: 20 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c   are used by MUL
23c0: 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79  TITERMINALs only
23d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79   */.  int nsubsy
23e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
23f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
2400: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
2410: 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a  in the MULTI */.
2420: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
2430: 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72  **subsym;  /* Ar
2440: 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65  ray of constitue
2450: 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b  nt symbols */.};
2460: 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63  ../* Each produc
2470: 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65  tion rule in the
2480: 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72   grammar is stor
2490: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
24a0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
24b0: 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .  */.struct rul
24c0: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
24d0: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f  bol *lhs;      /
24e0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
24f0: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a   of the rule */.
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68    const char *lh
2510: 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20 41 6c  salias;    /* Al
2520: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
2530: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
2540: 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74  /.  int lhsStart
2550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2560: 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e  True if left-han
2570: 64 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74  d side is the st
2580: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
2590: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
25a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
25b0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
25c0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
25d0: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
25e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25f0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
2600: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2610: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
2620: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
2630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 72    const char **r
2640: 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20 41 6e  hsalias;   /* An
2650: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
2660: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
2670: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
2680: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
2690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
26a0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
26b0: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
26c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64   const char *cod
26d0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
26e0: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
26f0: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
2700: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 63 6f   reduced */.  co
2710: 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65 50 72  nst char *codePr
2720: 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75 70 20  efix;  /* Setup 
2730: 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f 64 65  code before code
2740: 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20 63 6f  [] above */.  co
2750: 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65 53 75  nst char *codeSu
2760: 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61 6b 64  ffix;  /* Breakd
2770: 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72 20 63  own code after c
2780: 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20  ode[] above */. 
2790: 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20 20 20   int noCode;    
27a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27b0: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 68  e if this rule h
27c0: 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64  as no associated
27d0: 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   C code */.  int
27e0: 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20 20 20   codeEmitted;   
27f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2800: 20 74 68 65 20 63 6f 64 65 20 68 61 73 20 62 65   the code has be
2810: 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72 65 61  en emitted alrea
2820: 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  dy */.  struct s
2830: 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20  ymbol *precsym; 
2840: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73   /* Precedence s
2850: 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72  ymbol for this r
2860: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64  ule */.  int ind
2870: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
2880: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75    /* An index nu
2890: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75  mber for this ru
28a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 75 6c  le */.  int iRul
28b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
28c0: 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65 72 20   /* Rule number 
28d0: 61 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 67  as used in the g
28e0: 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 73 20  enerated tables 
28f0: 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e  */.  Boolean can
2900: 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a  Reduce;       /*
2910: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75   True if this ru
2920: 6c 65 20 69 73 20 65 76 65 72 20 72 65 64 75 63  le is ever reduc
2930: 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ed */.  Boolean 
2940: 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20 20 20  doesReduce;     
2950: 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74 69 6f   /* Reduce actio
2960: 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72 20 6f  ns occur after o
2970: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  ptimization */. 
2980: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
2990: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
29a0: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
29b0: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
29c0: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
29d0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
29e0: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
29f0: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
2a00: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
2a10: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
2a20: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
2a30: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
2a40: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
2a50: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
2a60: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
2a70: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
2a80: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
2a90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
2aa0: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
2ab0: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
2ac0: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
2ad0: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
2ae0: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
2af0: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
2b00: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
2b10: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
2b20: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
2b30: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
2b40: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2b50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
2b60: 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61 74 75  */.enum cfgstatu
2b70: 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45 2c 0a  s {.  COMPLETE,.
2b80: 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d 3b 0a    INCOMPLETE.};.
2b90: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a  struct config {.
2ba0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
2bb0: 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p;         /* Th
2bc0: 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63  e rule upon whic
2bd0: 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  h the configurat
2be0: 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a  ion is based */.
2bf0: 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20    int dot;      
2c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c10: 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f  e parse point */
2c20: 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20  .  char *fws;   
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68  ollow-set for th
2c50: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2c60: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63   only */.  struc
2c70: 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20  t plink *fplp;  
2c80: 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65      /* Follow-se
2c90: 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67  t forward propag
2ca0: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
2cb0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62   struct plink *b
2cc0: 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c  plp;      /* Fol
2cd0: 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64  low-set backward
2ce0: 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  s propagation li
2cf0: 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nks */.  struct 
2d00: 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20  state *stp;     
2d10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2d20: 73 74 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74  state which cont
2d30: 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65  ains this */.  e
2d40: 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20 73 74  num cfgstatus st
2d50: 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65 64 20  atus;   /* used 
2d60: 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73 65 74  during followset
2d70: 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d 70 75   and shift compu
2d80: 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  tations */.  str
2d90: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
2da0: 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f  ;     /* Next co
2db0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
2dc0: 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74  he state */.  st
2dd0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b  ruct config *bp;
2de0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2df0: 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  xt basis configu
2e00: 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 65 6e  ration */.};..en
2e10: 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  um e_action {.  
2e20: 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50 54 2c  SHIFT,.  ACCEPT,
2e30: 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45 52 52  .  REDUCE,.  ERR
2e40: 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49 43 54  OR,.  SSCONFLICT
2e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e60: 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66 74 20  * A shift/shift 
2e70: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 52  conflict */.  SR
2e80: 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20  CONFLICT,       
2e90: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2ea0: 72 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74  reduce, but part
2eb0: 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a   of a conflict *
2ec0: 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54 2c 20  /.  RRCONFLICT, 
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
2ef0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
2f00: 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52 45 53  lict */.  SH_RES
2f10: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2f20: 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68 69 66     /* Was a shif
2f30: 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  t.  Precedence r
2f40: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
2f50: 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c 56 45   */.  RD_RESOLVE
2f60: 44 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  D,             /
2f70: 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20 20 50  * Was reduce.  P
2f80: 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76  recedence resolv
2f90: 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ed conflict */. 
2fa0: 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20 20 20   NOT_USED,      
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2fc0: 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73  eted by compress
2fd0: 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54 52 45  ion */.  SHIFTRE
2fe0: 44 55 43 45 20 20 20 20 20 20 20 20 20 20 20 20  DUCE            
2ff0: 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72 73 74    /* Shift first
3000: 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20 2a 2f  , then reduce */
3010: 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68  .};../* Every sh
3020: 69 66 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70  ift or reduce op
3030: 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65  eration is store
3040: 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  d as one of the 
3050: 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72  following */.str
3060: 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73  uct action {.  s
3070: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
3080: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
3090: 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c  ook-ahead symbol
30a0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74   */.  enum e_act
30b0: 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f  ion type;.  unio
30c0: 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  n {.    struct s
30d0: 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f  tate *stp;     /
30e0: 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c  * The new state,
30f0: 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20   if a shift */. 
3100: 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
3110: 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rp;       /* The
3120: 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75   rule, if a redu
3130: 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73  ce */.  } x;.  s
3140: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
3150: 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49 46 54  Opt;    /* SHIFT
3160: 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a 61 74  REDUCE optimizat
3170: 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79 6d 62  ion to this symb
3180: 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  ol */.  struct a
3190: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
31a0: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
31b0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
31c0: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
31d0: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
31e0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
31f0: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
3200: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
3210: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
3220: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
3230: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
3240: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
3250: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
3260: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3270: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
3280: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
3290: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
32a0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
32b0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
32c0: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
32d0: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
32e0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
32f0: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
3300: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
3310: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  set */.  int sta
3320: 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
3330: 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c 20    /* Sequential 
3340: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
3350: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3360: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
3370: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3380: 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ctions for this 
3390: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  state */.  int n
33a0: 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20  TknAct, nNtAct; 
33b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33c0: 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d   actions on term
33d0: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
33e0: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  minals */.  int 
33f0: 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73  iTknOfst, iNtOfs
3400: 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f  t;   /* yy_actio
3410: 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72 20 74  n[] offset for t
3420: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
3430: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69  terms */.  int i
3440: 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20 20 20  DfltReduce;     
3450: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61      /* Default a
3460: 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45 44 55  ction is to REDU
3470: 43 45 20 62 79 20 74 68 69 73 20 72 75 6c 65 20  CE by this rule 
3480: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
3490: 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b 2f 2a   *pDfltReduce;/*
34a0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 52 45 44   The default RED
34b0: 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20 20 69  UCE rule. */.  i
34c0: 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b 20 20  nt autoReduce;  
34d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34e0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  if this is an au
34f0: 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74 65 20  to-reduce state 
3500: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f  */.};.#define NO
3510: 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37 34 38  _OFFSET (-214748
3520: 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c  3647)../* A foll
3530: 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  owset propagatio
3540: 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74 65 73  n link indicates
3550: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
3560: 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e  ts of one.** con
3570: 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f  figuration follo
3580: 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65 20 70  wset should be p
3590: 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61 6e 6f  ropagated to ano
35a0: 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a  ther whenever.**
35b0: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e 67   the first chang
35c0: 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c  es. */.struct pl
35d0: 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ink {.  struct c
35e0: 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20  onfig *cfp;     
35f0: 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72   /* The configur
3600: 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c  ation to which l
3610: 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  inked */.  struc
3620: 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20  t plink *next;  
3630: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
3640: 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a  propagate link *
3650: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61  /.};../* The sta
3660: 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20 74 68  te vector for th
3670: 65 20 65 6e 74 69 72 65 20 70 61 72 73 65 72 20  e entire parser 
3680: 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72 65 63  generator is rec
3690: 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c  orded as.** foll
36a0: 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65  ows.  (LEMON use
36b0: 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69  s no global vari
36c0: 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65 73 20  ables and makes 
36d0: 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a  little use of.**
36e0: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
36f0: 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20 74 68  s.  Fields in th
3700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3710: 63 74 75 72 65 20 63 61 6e 20 62 65 20 74 68 6f  cture can be tho
3720: 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65  ught.** of as be
3730: 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  gin global varia
3740: 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72 6f 67  bles in the prog
3750: 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20  ram.) */.struct 
3760: 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  lemon {.  struct
3770: 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b   state **sorted;
3780: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73     /* Table of s
3790: 74 61 74 65 73 20 73 6f 72 74 65 64 20 62 79 20  tates sorted by 
37a0: 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  state number */.
37b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
37c0: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
37d0: 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20  st of all rules 
37e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
37f0: 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20 2f 2a   *startRule;  /*
3800: 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f 0a 20   First rule */. 
3810: 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20   int nstate;    
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3830: 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f  ber of states */
3840: 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65 3b 20  .  int nxstate; 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
3860: 73 74 61 74 65 20 77 69 74 68 20 74 61 69 6c 20  state with tail 
3870: 64 65 67 65 6e 65 72 61 74 65 20 73 74 61 74 65  degenerate state
3880: 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 69  s removed */.  i
3890: 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20  nt nrule;       
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38b0: 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20  r of rules */.  
38c0: 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20  int nsymbol;    
38d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38e0: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61  er of terminal a
38f0: 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73  nd nonterminal s
3900: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3910: 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20  nterminal;      
3920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3930: 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  f terminal symbo
3940: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 53  ls */.  int minS
3950: 68 69 66 74 52 65 64 75 63 65 3b 20 20 20 20 20  hiftReduce;     
3960: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68 69 66   /* Minimum shif
3970: 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  t-reduce action 
3980: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65  value */.  int e
3990: 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrAction;       
39a0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61 63 74      /* Error act
39b0: 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ion value */.  i
39c0: 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20 20 20  nt accAction;   
39d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 70          /* Accep
39e0: 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a  t action value *
39f0: 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69 6f 6e  /.  int noAction
3a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a10: 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76 61 6c  No-op action val
3a20: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 52  ue */.  int minR
3a30: 65 64 75 63 65 3b 20 20 20 20 20 20 20 20 20 20  educe;          
3a40: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 64 75   /* Minimum redu
3a50: 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ce action */.  i
3a60: 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20 20 20  nt maxAction;   
3a70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3a80: 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75 65 20  um action value 
3a90: 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f 0a 20  of any kind */. 
3aa0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3ab0: 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72  *symbols; /* Sor
3ac0: 74 65 64 20 61 72 72 61 79 20 6f 66 20 70 6f 69  ted array of poi
3ad0: 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f 6c 73  nters to symbols
3ae0: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63   */.  int errorc
3af0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
3b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
3b10: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  rs */.  struct s
3b20: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
3b30: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
3b40: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3b50: 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63 61 72   symbol *wildcar
3b60: 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74  d; /* Token that
3b70: 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e   matches anythin
3b80: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d  g */.  char *nam
3b90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3ba0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67  /* Name of the g
3bb0: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
3bc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20  */.  char *arg; 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3be0: 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20   Declaration of 
3bf0: 74 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74  the 3th argument
3c00: 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20   to parser */.  
3c10: 63 68 61 72 20 2a 63 74 78 3b 20 20 20 20 20 20  char *ctx;      
3c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c           /* Decl
3c30: 61 72 61 74 69 6f 6e 20 6f 66 20 32 6e 64 20 61  aration of 2nd a
3c40: 72 67 75 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  rgument to const
3c50: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
3c60: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
3c70: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
3c80: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
3c90: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
3ca0: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
3cb0: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
3cc0: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
3cd0: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
3ce0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
3cf0: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d10: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
3d20: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
3d30: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
3d40: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
3d50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3d60: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
3d70: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
3d80: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
3d90: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
3da0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
3db0: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
3dc0: 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20  char *error;    
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
3de0: 20 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e   to execute when
3df0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
3e00: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65  n */.  char *ove
3e10: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
3e20: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3e30: 74 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76  te on a stack ov
3e40: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72  erflow */.  char
3e50: 20 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20   *failure;      
3e60: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3e70: 65 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65  execute on parse
3e80: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63  r failure */.  c
3e90: 68 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20  har *accept;    
3ea0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3eb0: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
3ec0: 74 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70  the parser excep
3ed0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  ts */.  char *ex
3ee0: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
3ef0: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
3f00: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
3f10: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ed file */.  cha
3f20: 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20  r *tokendest;   
3f30: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3f40: 20 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74   execute to dest
3f50: 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a  roy token data *
3f60: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73  /.  char *vardes
3f70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
3f80: 43 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66  Code for the def
3f90: 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ault non-termina
3fa0: 6c 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a  l destructor */.
3fb0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
3fc0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
3fd0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
3fe0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3ff0: 6f 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  outname;        
4000: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4010: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
4020: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
4030: 2a 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20  *tokenprefix;   
4040: 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20      /* A prefix 
4050: 61 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e  added to token n
4060: 61 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66  ames in the .h f
4070: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f  ile */.  int nco
4080: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
4090: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
40a0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f   */.  int nactio
40c0: 6e 74 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f  ntab;          /
40d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
40e0: 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
40f0: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a  tion[] table */.
4100: 20 20 69 6e 74 20 6e 6c 6f 6f 6b 61 68 65 61 64    int nlookahead
4110: 74 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  tab;       /* Nu
4120: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4130: 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  in yy_lookahead[
4140: 5d 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65  ] */.  int table
4150: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
4160: 2f 2a 20 54 6f 74 61 6c 20 74 61 62 6c 65 20 73  /* Total table s
4170: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ize of all table
4180: 73 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  s in bytes */.  
4190: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20  int basisflag;  
41a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e           /* Prin
41b0: 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e  t only basis con
41c0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
41d0: 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63   int has_fallbac
41e0: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  k;        /* Tru
41f0: 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61  e if any %fallba
4200: 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68  ck is seen in th
4210: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 69  e grammar */.  i
4220: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
4230: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
4240: 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65  if #line stateme
4250: 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  nts should not b
4260: 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 63  e printed */.  c
4270: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
4280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4290: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a  of the program *
42a0: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65  /.};..#define Me
42b0: 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28  moryCheck(X) if(
42c0: 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74  (X)==0){ \.  ext
42d0: 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
42e0: 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d  error(); \.  mem
42f0: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d  ory_error(); \.}
4300: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4310: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
4320: 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a  e "table.h" ****
4330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
4350: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
4360: 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
4370: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
4380: 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
4390: 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
43a0: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
43b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
43c0: 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
43d0: 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
43e0: 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
43f0: 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
4400: 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
4410: 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
4420: 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
4430: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
4440: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
4450: 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
4460: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
4470: 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
4480: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
4490: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
44a0: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
44b0: 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69   handling a stri
44c0: 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68  ngs */..const ch
44d0: 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
44e0: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69 64  t char *);..void
44f0: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f   Strsafe_init(vo
4500: 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65  id);.int Strsafe
4510: 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68  _insert(const ch
4520: 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61  ar *);.const cha
4530: 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
4540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
4550: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  /* Routines for 
4560: 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73  handling symbols
4570: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
4580: 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  */..struct symbo
4590: 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f  l *Symbol_new(co
45a0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74  nst char *);.int
45b0: 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73   Symbolcmpp(cons
45c0: 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20  t void *, const 
45d0: 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53 79  void *);.void Sy
45e0: 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 3b  mbol_init(void);
45f0: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
4600: 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
4610: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
4620: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4630: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f   *Symbol_find(co
4640: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
4650: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
4660: 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e 74  ol_Nth(int);.int
4670: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f   Symbol_count(vo
4680: 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  id);.struct symb
4690: 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
46a0: 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52  yof(void);../* R
46b0: 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67  outines to manag
46c0: 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  e the state tabl
46d0: 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67  e */..int Config
46e0: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
46f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
4700: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
4710: 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tate_new(void);.
4720: 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
4730: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61 74 65  void);.int State
4740: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
4750: 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63  tate *, struct c
4760: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
4770: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
4780: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
4790: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
47a0: 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
47b0: 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75  f(void);../* Rou
47c0: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 65  tines used for e
47d0: 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e  fficiency in Con
47e0: 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a  figlist_add */..
47f0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
4800: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4810: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
4820: 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
4830: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *);.struct con
4840: 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
4850: 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
4860: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
4870: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69  figtable_clear(i
4880: 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e  nt(*)(struct con
4890: 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  fig *));../*****
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
48b0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
48c0: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
48f0: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
4900: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
4910: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
4920: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
4930: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
4940: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
4950: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
4960: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
4970: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20  ion_new(void){. 
4980: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61   static struct a
4990: 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20  ction *freelist 
49a0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63  = 0;.  struct ac
49b0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
49c0: 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ..  if( freelist
49d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
49e0: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
49f0: 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  100;.    freelis
4a00: 74 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  t = (struct acti
4a10: 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c  on *)calloc(amt,
4a20: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61   sizeof(struct a
4a30: 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28  ction));.    if(
4a40: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
4a50: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
4a60: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
4a70: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
4a80: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
4a90: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
4aa0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
4ab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4ac0: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
4ad0: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
4ae0: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
4af0: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
4b00: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
4b10: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66  .  newaction = f
4b20: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
4b30: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
4b40: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
4b50: 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20  ewaction;.}../* 
4b60: 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69  Compare two acti
4b70: 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ons for sorting 
4b80: 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72  purposes.  Retur
4b90: 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
4ba0: 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65  , or.** positive
4bb0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 63   if the first ac
4bc0: 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61  tion is less tha
4bd0: 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
4be0: 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
4bf0: 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61  the first.*/.sta
4c00: 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d  tic int actioncm
4c10: 70 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p(.  struct acti
4c20: 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63  on *ap1,.  struc
4c30: 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b  t action *ap2.){
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
4c50: 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78  = ap1->sp->index
4c60: 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65   - ap2->sp->inde
4c70: 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  x;.  if( rc==0 )
4c80: 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29  {.    rc = (int)
4c90: 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74  ap1->type - (int
4ca0: 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a  )ap2->type;.  }.
4cb0: 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 28    if( rc==0 && (
4cc0: 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  ap1->type==REDUC
4cd0: 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d  E || ap1->type==
4ce0: 53 48 49 46 54 52 45 44 55 43 45 29 20 29 7b 0a  SHIFTREDUCE) ){.
4cf0: 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e      rc = ap1->x.
4d00: 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  rp->index - ap2-
4d10: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  >x.rp->index;.  
4d20: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
4d30: 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 20  .    rc = (int) 
4d40: 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20 7d  (ap2 - ap1);.  }
4d50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4d60: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
4d70: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
4d80: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
4d90: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
4da0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
4db0: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
4dc0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
4dd0: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
4de0: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
4df0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
4e20: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
4e30: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
4e40: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
4e50: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
4e60: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
4e70: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
4e80: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
4e90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
4ea0: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
4eb0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4ec0: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4ed0: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
4ee0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
4ef0: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
4f00: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
4f10: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
4f20: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
4f30: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
4f40: 20 73 70 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e   sp;.  newaction
4f50: 2d 3e 73 70 4f 70 74 20 3d 20 30 3b 0a 20 20 69  ->spOpt = 0;.  i
4f60: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
4f70: 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d  {.    newaction-
4f80: 3e 78 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74  >x.stp = (struct
4f90: 20 73 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20   state *)arg;.  
4fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63  }else{.    newac
4fb0: 74 69 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74  tion->x.rp = (st
4fc0: 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b  ruct rule *)arg;
4fd0: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
4ff0: 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  ew code to imple
5000: 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74 61 62  ment the "acttab
5010: 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a  " module *******
5020: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ****/./*.** This
5030: 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
5040: 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20  ts routines use 
5050: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5060: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
5070: 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  le..*/../*.** Th
5080: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 79  e state of the y
5090: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75  y_action table u
50a0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
50b0: 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  n is an instance
50c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   of.** the follo
50d0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
50e0: 2a 2a 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74  **.** The yy_act
50f0: 69 6f 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74  ion table maps t
5100: 68 65 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e  he pair (state_n
5110: 75 6d 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64  umber, lookahead
5120: 29 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74  ) into an.** act
5130: 69 6f 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65  ion_number.  The
5140: 20 74 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72   table is an arr
5150: 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70  ay of integers p
5160: 61 69 72 73 2e 20 20 54 68 65 20 73 74 61 74 65  airs.  The state
5170: 5f 6e 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72  _number.** deter
5180: 6d 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  mines an initial
5190: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
51a0: 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79   yy_action array
51b0: 2e 20 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64  .  The lookahead
51c0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65  .** value is the
51d0: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 69 73 20  n added to this 
51e0: 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74  initial offset t
51f0: 6f 20 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58  o get an index X
5200: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f   into the.** yy_
5210: 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66  action array. If
5220: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e   the aAction[X].
5230: 6c 6f 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73  lookahead equals
5240: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5250: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b  e.** of the look
5260: 61 68 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65  ahead input, the
5270: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
5280: 68 65 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  he action_number
5290: 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41   output is.** aA
52a0: 63 74 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e  ction[X].action.
52b0: 20 20 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65    If the lookahe
52c0: 61 64 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  ads do not match
52d0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66   then the.** def
52e0: 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
52f0: 74 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  the state_number
5300: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
5310: 0a 2a 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20  .** All actions 
5320: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5330: 61 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e  a single state_n
5340: 75 6d 62 65 72 20 61 72 65 20 66 69 72 73 74 20  umber are first 
5350: 65 6e 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20  entered.** into 
5360: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69  aLookahead[] usi
5370: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  ng multiple call
5380: 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69  s to acttab_acti
5390: 6f 6e 28 29 2e 20 20 54 68 65 6e 20 74 68 65 0a  on().  Then the.
53a0: 2a 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  ** actions for t
53b0: 68 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65  hat single state
53c0: 5f 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63  _number are plac
53d0: 65 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74  ed into the aAct
53e0: 69 6f 6e 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  ion[].** array w
53f0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
5400: 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65  l to acttab_inse
5410: 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61  rt().  The actta
5420: 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a  b_insert() call.
5430: 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74  ** also resets t
5440: 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  he aLookahead[] 
5450: 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61  array in prepara
5460: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78  tion for the nex
5470: 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65  t.** state numbe
5480: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f  r..*/.struct loo
5490: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a  kahead_action {.
54a0: 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b    int lookahead;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54c0: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
54d0: 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a  kahead token */.
54e0: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5500: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
5510: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
5520: 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  ahead */.};.type
5530: 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61  def struct actta
5540: 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74  b acttab;.struct
5550: 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20   acttab {.  int 
5560: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
5570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5580: 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73  er of used slots
5590: 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f   in aAction[] */
55a0: 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c  .  int nActionAl
55b0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
55c0: 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  /* Slots allocat
55d0: 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d  ed for aAction[]
55e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f   */.  struct loo
55f0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20  kahead_action.  
5600: 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20    *aAction,     
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5620: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  The yy_action[] 
5630: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5640: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
5650: 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  *aLookahead;    
5660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
5670: 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73  single new trans
5680: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
5690: 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  int mnLookahead;
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56b0: 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Minimum aLookahe
56c0: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
56d0: 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e  /.  int mnAction
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63   /* Action assoc
5700: 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f  iated with mnLoo
5710: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5720: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  mxLookahead;    
5730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
5740: 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  mum aLookahead[]
5750: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  .lookahead */.  
5760: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  int nLookahead; 
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5780: 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c  Used slots in aL
5790: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20  ookahead[] */.  
57a0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  int nLookaheadAl
57b0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
57c0: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
57d0: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
57e0: 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d 69 6e  */.  int ntermin
57f0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
5800: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
5810: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
5820: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
5830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5840: 20 20 2f 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65    /* total numbe
5850: 72 20 6f 66 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  r of symbols */.
5860: 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  };../* Return th
5870: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5880: 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
5890: 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64  tion table */.#d
58a0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 6c 6f 6f  efine acttab_loo
58b0: 6b 61 68 65 61 64 5f 73 69 7a 65 28 58 29 20 28  kahead_size(X) (
58c0: 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f  (X)->nAction)../
58d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * The value for 
58e0: 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69  the N-th entry i
58f0: 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23  n yy_action */.#
5900: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79  define acttab_yy
5910: 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58  action(X,N)  ((X
5920: 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63  )->aAction[N].ac
5930: 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61  tion)../* The va
5940: 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  lue for the N-th
5950: 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f   entry in yy_loo
5960: 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e  kahead */.#defin
5970: 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  e acttab_yylooka
5980: 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d  head(X,N)  ((X)-
5990: 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b  >aAction[N].look
59a0: 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20  ahead)../* Free 
59b0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
59c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
59d0: 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76  iven acttab */.v
59e0: 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65 28  oid acttab_free(
59f0: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72  acttab *p){.  fr
5a00: 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29  ee( p->aAction )
5a10: 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f  ;.  free( p->aLo
5a20: 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65  okahead );.  fre
5a30: 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c  e( p );.}../* Al
5a40: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63 74  locate a new act
5a50: 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f  tab structure */
5a60: 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f  .acttab *acttab_
5a70: 61 6c 6c 6f 63 28 69 6e 74 20 6e 73 79 6d 62 6f  alloc(int nsymbo
5a80: 6c 2c 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c  l, int nterminal
5a90: 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d  ){.  acttab *p =
5aa0: 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c 6c   (acttab *) call
5ab0: 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70  oc( 1, sizeof(*p
5ac0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
5ad0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
5ae0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
5af0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
5b00: 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61   for a new actta
5b10: 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  b.");.    exit(1
5b20: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
5b30: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
5b40: 29 3b 0a 20 20 70 2d 3e 6e 73 79 6d 62 6f 6c 20  );.  p->nsymbol 
5b50: 3d 20 6e 73 79 6d 62 6f 6c 3b 0a 20 20 70 2d 3e  = nsymbol;.  p->
5b60: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 6e 74 65 72  nterminal = nter
5b70: 6d 69 6e 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  minal;.  return 
5b80: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  p;.}../* Add a n
5b90: 65 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ew action to the
5ba0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
5bb0: 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  tion set..**.** 
5bc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5bd0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
5be0: 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66  each lookahead f
5bf0: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a  or a particular.
5c00: 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  ** state..*/.voi
5c10: 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  d acttab_action(
5c20: 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c  acttab *p, int l
5c30: 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63  ookahead, int ac
5c40: 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  tion){.  if( p->
5c50: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e  nLookahead>=p->n
5c60: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
5c70: 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  {.    p->nLookah
5c80: 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a  eadAlloc += 25;.
5c90: 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61      p->aLookahea
5ca0: 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  d = (struct look
5cb0: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
5cc0: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f  realloc( p->aLoo
5cd0: 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20  kahead,.        
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61       sizeof(p->a
5d00: 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d  Lookahead[0])*p-
5d10: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
5d20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   );.    if( p->a
5d30: 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a  Lookahead==0 ){.
5d40: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
5d50: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
5d60: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
5d70: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
5d80: 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  }.  if( p->nLook
5d90: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
5da0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
5db0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5dc0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
5dd0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5de0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5df0: 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
5e00: 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b     if( p->mxLook
5e10: 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20  ahead<lookahead 
5e20: 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ) p->mxLookahead
5e30: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
5e40: 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61    if( p->mnLooka
5e50: 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29  head>lookahead )
5e60: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  {.      p->mnLoo
5e70: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5e80: 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41  ad;.      p->mnA
5e90: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5ea0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61      }.  }.  p->a
5eb0: 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f  Lookahead[p->nLo
5ec0: 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65  okahead].lookahe
5ed0: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
5ee0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5ef0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61  p->nLookahead].a
5f00: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5f10: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b    p->nLookahead+
5f20: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  +;.}../*.** Add 
5f30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5f40: 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74  set built up wit
5f50: 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  h prior calls to
5f60: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
5f70: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72  .** into the cur
5f80: 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  rent action tabl
5f90: 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74  e.  Then reset t
5fa0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5fb0: 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e  et back.** to an
5fc0: 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72   empty set in pr
5fd0: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20  eparation for a 
5fe0: 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74  new round of act
5ff0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c  tab_action() cal
6000: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ls..**.** Return
6010: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
6020: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
6030: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61  e of the new tra
6040: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
6050: 49 66 20 74 68 65 20 6d 61 6b 65 49 74 53 61 66  If the makeItSaf
6060: 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
6070: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 66  rue, then the of
6080: 66 73 65 74 20 69 73 20 63 68 6f 73 65 6e 20 73  fset is chosen s
6090: 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 73 20  o that.** it is 
60a0: 69 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 76  impossible to ov
60b0: 65 72 72 65 61 64 20 74 68 65 20 79 79 5f 6c 6f  erread the yy_lo
60c0: 6f 6b 61 73 69 64 65 5b 5d 20 74 61 62 6c 65 20  okaside[] table 
60d0: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
60e0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 74   the lookaside t
60f0: 6f 6b 65 6e 2e 20 20 54 68 69 73 20 69 73 20 64  oken.  This is d
6100: 6f 6e 65 20 66 6f 72 20 74 68 65 20 74 65 72 6d  one for the term
6110: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2c 20 61 73  inal symbols, as
6120: 20 74 68 65 79 0a 2a 2a 20 63 6f 6d 65 20 66 72   they.** come fr
6130: 6f 6d 20 65 78 74 65 72 6e 61 6c 20 69 6e 70 75  om external inpu
6140: 74 73 20 61 6e 64 20 63 61 6e 20 63 6f 6e 74 61  ts and can conta
6150: 69 6e 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  in syntax errors
6160: 2e 20 20 57 68 65 6e 20 6d 61 6b 65 49 74 53 61  .  When makeItSa
6170: 66 65 0a 2a 2a 20 69 73 20 66 61 6c 73 65 2c 20  fe.** is false, 
6180: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 66 6c  there is more fl
6190: 65 78 69 62 69 6c 69 74 79 20 69 6e 20 73 65 6c  exibility in sel
61a0: 65 63 74 69 6e 67 20 6f 66 66 73 65 74 73 2c 20  ecting offsets, 
61b0: 72 65 73 75 6c 74 69 6e 67 20 69 6e 0a 2a 2a 20  resulting in.** 
61c0: 61 20 73 6d 61 6c 6c 65 72 20 74 61 62 6c 65 2e  a smaller table.
61d0: 20 20 46 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e    For non-termin
61e0: 61 6c 20 73 79 6d 62 6f 6c 73 2c 20 77 68 69 63  al symbols, whic
61f0: 68 20 61 72 65 20 6e 65 76 65 72 20 73 79 6e 74  h are never synt
6200: 61 78 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 6d 61  ax errors,.** ma
6210: 6b 65 49 74 53 61 66 65 20 63 61 6e 20 62 65 20  keItSafe can be 
6220: 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 61 63  false..*/.int ac
6230: 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74  ttab_insert(actt
6240: 61 62 20 2a 70 2c 20 69 6e 74 20 6d 61 6b 65 49  ab *p, int makeI
6250: 74 53 61 66 65 29 7b 0a 20 20 69 6e 74 20 69 2c  tSafe){.  int i,
6260: 20 6a 2c 20 6b 2c 20 6e 2c 20 65 6e 64 3b 0a 20   j, k, n, end;. 
6270: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f   assert( p->nLoo
6280: 6b 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f  kahead>0 );..  /
6290: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
62a0: 61 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ave enough space
62b0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70   to hold the exp
62c0: 61 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62  anded action tab
62d0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77  le.  ** in the w
62e0: 6f 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20  orst case.  The 
62f0: 77 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72  worst case occur
6300: 73 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  s if the transac
6310: 74 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75  tion set.  ** mu
6320: 73 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  st be appended t
6330: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63  o the current ac
6340: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  tion table.  */.
6350: 20 20 6e 20 3d 20 70 2d 3e 6e 73 79 6d 62 6f 6c    n = p->nsymbol
6360: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   + 1;.  if( p->n
6370: 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d  Action + n >= p-
6380: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b  >nActionAlloc ){
6390: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f  .    int oldAllo
63a0: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  c = p->nActionAl
63b0: 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74  loc;.    p->nAct
63c0: 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ionAlloc = p->nA
63d0: 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e  ction + n + p->n
63e0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30  ActionAlloc + 20
63f0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
6400: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
6410: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
6420: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69  ealloc( p->aActi
6430: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6450: 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b  zeof(p->aAction[
6460: 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  0])*p->nActionAl
6470: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
6480: 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  >aAction==0 ){. 
6490: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
64a0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
64b0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
64c0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
64d0: 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b   for(i=oldAlloc;
64e0: 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   i<p->nActionAll
64f0: 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  oc; i++){.      
6500: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
6510: 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20  okahead = -1;.  
6520: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
6530: 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20  ].action = -1;. 
6540: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
6550: 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67  can the existing
6560: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f   action table lo
6570: 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66  oking for an off
6580: 73 65 74 20 74 68 61 74 20 69 73 20 61 0a 20 20  set that is a.  
6590: 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20  ** duplicate of 
65a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
65b0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61  saction set.  Fa
65c0: 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ll out of the lo
65d0: 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77  op.  ** if and w
65e0: 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74  hen the duplicat
65f0: 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a  e is found..  **
6600: 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69  .  ** i is the i
6610: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69  ndex in p->aActi
6620: 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e  on[] where p->mn
6630: 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73  Lookahead is ins
6640: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6e  erted..  */.  en
6650: 64 20 3d 20 6d 61 6b 65 49 74 53 61 66 65 20 3f  d = makeItSafe ?
6660: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6670: 3a 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  : 0;.  for(i=p->
6680: 6e 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 65 6e  nAction-1; i>=en
6690: 64 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  d; i--){.    if(
66a0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
66b0: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
66c0: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
66d0: 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65    /* All lookahe
66e0: 61 64 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 20  ads and actions 
66f0: 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61  in the aLookahea
6700: 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  d[] transaction.
6710: 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61        ** must ma
6720: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
6730: 63 61 6e 64 69 64 61 74 65 20 61 41 63 74 69 6f  candidate aActio
6740: 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  n[i] entry. */. 
6750: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
6760: 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70  ion[i].action!=p
6770: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e  ->mnAction ) con
6780: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
6790: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
67a0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
67b0: 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f       k = p->aLoo
67c0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
67d0: 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ead - p->mnLooka
67e0: 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20  head + i;.      
67f0: 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d    if( k<0 || k>=
6800: 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65  p->nAction ) bre
6810: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
6820: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6830: 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61  .lookahead!=p->a
6840: 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68  Action[k].lookah
6850: 65 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ead ) break;.   
6860: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
6870: 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e  kahead[j].action
6880: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6890: 61 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a  action ) break;.
68a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
68b0: 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ( j<p->nLookahea
68c0: 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  d ) continue;.. 
68d0: 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69       /* No possi
68e0: 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61  ble lookahead va
68f0: 6c 75 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lue that is not 
6900: 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61  in the aLookahea
6910: 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  d[].      ** tra
6920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f  nsaction is allo
6930: 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 41 63  wed to match aAc
6940: 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20  tion[i] */.     
6950: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
6960: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
6970: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
6980: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6990: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[j].lookahead<0
69a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
69b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
69c0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
69d0: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
69e0: 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ad-i ) n++;.    
69f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d    }.      if( n=
6a00: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
6a10: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
6a20: 20 20 2f 2a 20 41 6e 20 65 78 61 63 74 20 6d 61    /* An exact ma
6a30: 74 63 68 20 69 73 20 66 6f 75 6e 64 20 61 74 20  tch is found at 
6a40: 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20 20 20 20  offset i */.    
6a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6a60: 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69 73 74 69   /* If no existi
6a70: 6e 67 20 6f 66 66 73 65 74 73 20 65 78 61 63 74  ng offsets exact
6a80: 6c 79 20 6d 61 74 63 68 20 74 68 65 20 63 75 72  ly match the cur
6a90: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6aa0: 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61  , find an.  ** a
6ab0: 6e 20 65 6d 70 74 79 20 6f 66 66 73 65 74 20 69  n empty offset i
6ac0: 6e 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  n the aAction[] 
6ad0: 74 61 62 6c 65 20 69 6e 20 77 68 69 63 68 20 77  table in which w
6ae0: 65 20 63 61 6e 20 61 64 64 20 74 68 65 0a 20 20  e can add the.  
6af0: 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  ** aLookahead[] 
6b00: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
6b10: 2f 0a 20 20 69 66 28 20 69 3c 65 6e 64 20 29 7b  /.  if( i<end ){
6b20: 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
6b30: 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61 41   holes in the aA
6b40: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74 68  ction[] table th
6b50: 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72 65  at fit the curre
6b60: 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b 61  nt.    ** aLooka
6b70: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
6b80: 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65 74  on.  Leave i set
6b90: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f   to the offset o
6ba0: 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20 20  f the hole..    
6bb0: 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20 61  ** If no holes a
6bc0: 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20 6c  re found, i is l
6bd0: 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69 6f  eft at p->nActio
6be0: 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  n, which means t
6bf0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
6c00: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 70  ction will be ap
6c10: 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 69  pended. */.    i
6c20: 20 3d 20 6d 61 6b 65 49 74 53 61 66 65 20 3f 20   = makeItSafe ? 
6c30: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3a  p->mnLookahead :
6c40: 20 30 3b 0a 20 20 20 20 66 6f 72 28 3b 20 69 3c   0;.    for(; i<
6c50: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
6c60: 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  - p->mxLookahead
6c70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6c80: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
6c90: 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20  lookahead<0 ){. 
6ca0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6cb0: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
6cc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6cd0: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
6ce0: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
6cf0: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
6d00: 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   + i;.          
6d10: 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b  if( k<0 ) break;
6d20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6d30: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
6d40: 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61  kahead>=0 ) brea
6d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d60: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
6d70: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
6d80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
6d90: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69  (j=0; j<p->nActi
6da0: 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  on; j++){.      
6db0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6dc0: 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[j].lookahead=
6dd0: 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  =j+p->mnLookahea
6de0: 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  d-i ) break;.   
6df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6e00: 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e  f( j==p->nAction
6e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
6e20: 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e  eak;  /* Fits in
6e30: 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a   empty slots */.
6e40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
6e60: 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74   Insert transact
6e70: 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78  ion set at index
6e80: 20 69 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70   i. */.#if 0.  p
6e90: 72 69 6e 74 66 28 22 41 63 74 74 61 62 3a 22 29  rintf("Acttab:")
6ea0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
6eb0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
6ec0: 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  +){.    printf("
6ed0: 20 25 64 22 2c 20 70 2d 3e 61 4c 6f 6f 6b 61 68   %d", p->aLookah
6ee0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6ef0: 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  );.  }.  printf(
6f00: 22 20 69 6e 73 65 72 74 65 64 20 61 74 20 25 64  " inserted at %d
6f10: 5c 6e 22 2c 20 69 29 3b 0a 23 65 6e 64 69 66 0a  \n", i);.#endif.
6f20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
6f30: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
6f40: 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f  {.    k = p->aLo
6f50: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
6f60: 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  head - p->mnLook
6f70: 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 70  ahead + i;.    p
6f80: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70  ->aAction[k] = p
6f90: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b  ->aLookahead[j];
6fa0: 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e  .    if( k>=p->n
6fb0: 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74  Action ) p->nAct
6fc0: 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20  ion = k+1;.  }. 
6fd0: 20 69 66 28 20 6d 61 6b 65 49 74 53 61 66 65 20   if( makeItSafe 
6fe0: 26 26 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61  && i+p->ntermina
6ff0: 6c 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  l>=p->nAction ) 
7000: 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 69 2b 70  p->nAction = i+p
7010: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b 31 3b 0a 20  ->nterminal+1;. 
7020: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->nLookahead =
7030: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e   0;..  /* Return
7040: 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61 74   the offset that
7050: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
7060: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f 72   lookahead in or
7070: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a 20  der to get the. 
7080: 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 79   ** index into y
7090: 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  y_action of the 
70a0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75  action */.  retu
70b0: 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  rn i - p->mnLook
70c0: 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ahead;.}../*.** 
70d0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
70e0: 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  of the action ta
70f0: 62 6c 65 20 77 69 74 68 6f 75 74 20 74 68 65 20  ble without the 
7100: 74 72 61 69 6c 69 6e 67 20 73 79 6e 74 61 78 20  trailing syntax 
7110: 65 72 72 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73  error.** entries
7120: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
7130: 61 63 74 69 6f 6e 5f 73 69 7a 65 28 61 63 74 74  action_size(actt
7140: 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 20  ab *p){.  int n 
7150: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20  = p->nAction;.  
7160: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 70 2d  while( n>0 && p-
7170: 3e 61 41 63 74 69 6f 6e 5b 6e 2d 31 5d 2e 6c 6f  >aAction[n-1].lo
7180: 6f 6b 61 68 65 61 64 3c 30 20 29 7b 20 6e 2d 2d  okahead<0 ){ n--
7190: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ; }.  return n;.
71a0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
71c0: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
71d0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71f0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
7200: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   to construction
7210: 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74   the finite stat
7220: 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
7230: 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65  e LEMON.** parse
7240: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
7250: 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65  ./* Find a prece
7260: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20  dence symbol of 
7270: 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68  every rule in th
7280: 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 0a 2a 2a  e grammar..**.**
7290: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
72a0: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
72b0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
72c0: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
72d0: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
72e0: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
72f0: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
7300: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
7310: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
7320: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
7330: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
7340: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
7350: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
7360: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
7370: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
7380: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
7390: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
73a0: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
73b0: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
73c0: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
73d0: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
73e0: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
73f0: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
7400: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
7410: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
7420: 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp).{.  struct r
7430: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
7440: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
7450: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
7460: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
7470: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
7480: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
7490: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
74a0: 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d  s && rp->precsym
74b0: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ==0; i++){.     
74c0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
74d0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
74e0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
74f0: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
7500: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7510: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
7520: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
7530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
7540: 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ( sp->subsym[j]-
7550: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
7560: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
7570: 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73  ecsym = sp->subs
7580: 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  ym[j];.         
7590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
75c0: 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63  lse if( sp->prec
75d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
75e0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
75f0: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
7600: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7610: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
7620: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
7630: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
7640: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
7650: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
7660: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
7670: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
7680: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
7690: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
76a0: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
76b0: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
76c0: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
76d0: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
76e0: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
76f0: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
7700: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
7710: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
7720: 69 72 73 74 53 65 74 73 28 73 74 72 75 63 74 20  irstSets(struct 
7730: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
7740: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
7750: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
7760: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
7770: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
7780: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
7790: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
77a0: 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20  ls[i]->lambda = 
77b0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d  LEMON_FALSE;.  }
77c0: 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e  .  for(i=lemp->n
77d0: 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70  terminal; i<lemp
77e0: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
77f0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
7800: 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20  ls[i]->firstset 
7810: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a  = SetNew();.  }.
7820: 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70  .  /* First comp
7830: 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20  ute all lambdas 
7840: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f  */.  do{.    pro
7850: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
7860: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
7870: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
7880: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
7890: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20  ->lhs->lambda ) 
78a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
78b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
78c0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
78d0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
78e0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
78f0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
7900: 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  t( sp->type==NON
7910: 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
7920: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
7930: 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69  LSE );.        i
7940: 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( sp->lambda==L
7950: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
7960: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7970: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
7980: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
7990: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
79a0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
79b0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
79c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
79d0: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
79e0: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
79f0: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
7a00: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
7a10: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
7a20: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
7a30: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
7a40: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
7a50: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
7a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
7a70: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
7a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
7a90: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
7aa0: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
7ab0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
7ac0: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
7ad0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
7ae0: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
7af0: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
7b00: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
7b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7b30: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
7b40: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7b50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
7b60: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
7b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
7b80: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
7b90: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7ba0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
7bb0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
7bc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7bd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
7be0: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
7bf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
7c00: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
7c10: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LSE ) break;.   
7c20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7c30: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7c40: 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66  = SetUnion(s1->f
7c50: 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73  irstset,s2->firs
7c60: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
7c70: 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d   if( s2->lambda=
7c80: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
7c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7cb0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7cc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   );.  return;.}.
7cd0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
7ce0: 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72  LR(0) states for
7cf0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c   the grammar.  L
7d00: 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65  inks.** are adde
7d10: 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d  d to between som
7d20: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
7d30: 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f   the LR(1) follo
7d40: 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65  w sets.** can be
7d50: 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e   computed later.
7d60: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75  .*/.PRIVATE stru
7d70: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
7d80: 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  te(struct lemon 
7d90: 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  *);  /* forward 
7da0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
7db0: 64 20 46 69 6e 64 53 74 61 74 65 73 28 73 74 72  d FindStates(str
7dc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
7dd0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
7de0: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
7df0: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f   rule *rp;..  Co
7e00: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b  nfiglist_init();
7e10: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
7e20: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
7e30: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
7e40: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
7e50: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
7e60: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
7e70: 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  sp==0 ){.      E
7e80: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
7e90: 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73  lename,0,."The s
7ea0: 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73  pecified start s
7eb0: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20  ymbol \"%s\" is 
7ec0: 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65  not \.in a nonte
7ed0: 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72  rminal of the gr
7ee0: 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77  ammar.  \"%s\" w
7ef0: 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74  ill be used as t
7f00: 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f  he start \.symbo
7f10: 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70  l instead.",lemp
7f20: 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 73 74  ->start,lemp->st
7f30: 61 72 74 52 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61  artRule->lhs->na
7f40: 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
7f50: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
7f60: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74     sp = lemp->st
7f70: 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  artRule->lhs;.  
7f80: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
7f90: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
7fa0: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  tRule->lhs;.  }.
7fb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7fc0: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
7fd0: 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f   doesn't occur o
7fe0: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
7ff0: 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e   side of.  ** an
8000: 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20  y rule.  Report 
8010: 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64  an error if it d
8020: 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c  oes.  (YACC woul
8030: 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77  d generate a new
8040: 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62  .  ** start symb
8050: 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ol in this case.
8060: 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  ) */.  for(rp=le
8070: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8080: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8090: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
80a0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
80b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
80c0: 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29  rp->rhs[i]==sp )
80d0: 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20  {   /* FIX ME:  
80e0: 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74  Deal with multit
80f0: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20  erminals */.    
8100: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
8110: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
8120: 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  The start symbol
8130: 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f   \"%s\" occurs o
8140: 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61  n the \.right-ha
8150: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c  nd side of a rul
8160: 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73  e. This will res
8170: 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20  ult in a parser 
8180: 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74  which \.does not
8190: 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22   work properly."
81a0: 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
81b0: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
81c0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
81d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
81e0: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
81f0: 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68  ation set for th
8200: 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20  e first state.  
8210: 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20  ** is all rules 
8220: 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73  which have the s
8230: 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74  tart symbol as t
8240: 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68  heir.  ** left-h
8250: 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f  and side */.  fo
8260: 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72  r(rp=sp->rule; r
8270: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68  p; rp=rp->nextlh
8280: 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63  s){.    struct c
8290: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20  onfig *newcfp;. 
82a0: 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20     rp->lhsStart 
82b0: 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20  = 1;.    newcfp 
82c0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
82d0: 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20  basis(rp,0);.   
82e0: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
82f0: 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  fws,0);.  }..  /
8300: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69  * Compute the fi
8310: 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20  rst state.  All 
8320: 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c  other states wil
8330: 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  l be.  ** comput
8340: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
8350: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70   during the comp
8360: 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  utation of the f
8370: 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54  irst one..  ** T
8380: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
8390: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
83a0: 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73   state is not us
83b0: 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ed. */.  (void)g
83c0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20  etstate(lemp);. 
83d0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
83e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
83f0: 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68  to a state which
8400: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
8410: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8420: 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68  on.** list which
8430: 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20   has been built 
8440: 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f  from calls to Co
8450: 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f  nfiglist_add..*/
8460: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75  .PRIVATE void bu
8470: 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74  ildshifts(struct
8480: 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74   lemon *, struct
8490: 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f   state *); /* Fo
84a0: 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41  rwd ref */.PRIVA
84b0: 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20  TE struct state 
84c0: 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74  *getstate(struct
84d0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
84e0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
84f0: 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72  *cfp, *bp;.  str
8500: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
8510: 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68  .  /* Extract th
8520: 65 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f  e sorted basis o
8530: 66 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e  f the new state.
8540: 20 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20    The basis was 
8550: 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
8560: 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20   by prior calls 
8570: 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61  to "Configlist_a
8580: 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20  ddbasis()". */. 
8590: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
85a0: 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20  basis();.  bp = 
85b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
85c0: 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  ();..  /* Get a 
85d0: 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73  state with the s
85e0: 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73  ame basis */.  s
85f0: 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28  tp = State_find(
8600: 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29  bp);.  if( stp )
8610: 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65  {.    /* A state
8620: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62   with the same b
8630: 61 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69  asis already exi
8640: 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74  sts!  Copy all t
8650: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20  he follow-set.  
8660: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e    ** propagation
8670: 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20   links from the 
8680: 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73  state under cons
8690: 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  truction into th
86a0: 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73  e.    ** preexis
86b0: 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e  ting state, then
86c0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
86d0: 72 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73  r to the preexis
86e0: 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20  ting state */.  
86f0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8700: 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28  *x, *y;.    for(
8710: 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b  x=bp, y=stp->bp;
8720: 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70   x && y; x=x->bp
8730: 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20  , y=y->bp){.    
8740: 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d    Plink_copy(&y-
8750: 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a  >bplp,x->bplp);.
8760: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65        Plink_dele
8770: 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20  te(x->fplp);.   
8780: 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e     x->fplp = x->
8790: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  bplp = 0;.    }.
87a0: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
87b0: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20  list_return();. 
87c0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61     Configlist_ea
87d0: 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  t(cfp);.  }else{
87e0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61  .    /* This rea
87f0: 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61  lly is a new sta
8800: 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61  te.  Construct a
8810: 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a  ll the details *
8820: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
8830: 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20  _closure(lemp); 
8840: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
8850: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8860: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43  closure */.    C
8870: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29  onfiglist_sort()
8880: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
8890: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
88a0: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
88b0: 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  .    cfp = Confi
88c0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20  glist_return(); 
88d0: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
88e0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  er to the config
88f0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70   list */.    stp
8900: 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20   = State_new(); 
8910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
8920: 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75  ew state structu
8930: 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79  re */.    Memory
8940: 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20  Check(stp);.    
8950: 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20  stp->bp = bp;   
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8970: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e  Remember the con
8980: 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73  figuration basis
8990: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70   */.    stp->cfp
89a0: 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20   = cfp;         
89b0: 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72       /* Remember
89c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
89d0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
89e0: 20 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20    stp->statenum 
89f0: 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b  = lemp->nstate++
8a00: 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65  ; /* Every state
8a10: 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65   gets a sequence
8a20: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73   number */.    s
8a30: 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20  tp->ap = 0;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8a50: 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20  o actions, yet. 
8a60: 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73  */.    State_ins
8a70: 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29  ert(stp,stp->bp)
8a80: 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  ;   /* Add to th
8a90: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
8aa0: 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73  .    buildshifts
8ab0: 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20  (lemp,stp);     
8ac0: 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
8ad0: 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   compute success
8ae0: 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d  or states */.  }
8af0: 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d  .  return stp;.}
8b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8b10: 72 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f  rue if two symbo
8b20: 6c 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ls are the same.
8b30: 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d  .*/.int same_sym
8b40: 62 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f  bol(struct symbo
8b50: 6c 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d  l *a, struct sym
8b60: 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20  bol *b).{.  int 
8b70: 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  i;.  if( a==b ) 
8b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
8b90: 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  a->type!=MULTITE
8ba0: 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20  RMINAL ) return 
8bb0: 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65  0;.  if( b->type
8bc0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
8bd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
8be0: 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d  ( a->nsubsym!=b-
8bf0: 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72  >nsubsym ) retur
8c00: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
8c10: 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  i<a->nsubsym; i+
8c20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73  +){.    if( a->s
8c30: 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62  ubsym[i]!=b->sub
8c40: 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  sym[i] ) return 
8c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8c60: 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  1;.}../* Constru
8c70: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
8c80: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
8c90: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
8ca0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
8cb0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
8cc0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
8cd0: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
8ce0: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
8cf0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
8d00: 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  ifts(struct lemo
8d10: 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20  n *lemp, struct 
8d20: 73 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20  state *stp).{.  
8d30: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
8d40: 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  fp;  /* For loop
8d50: 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e  ing thru the con
8d60: 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22  fig closure of "
8d70: 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  stp" */.  struct
8d80: 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f   config *bcfp; /
8d90: 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20  * For the inner 
8da0: 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63  loop on config c
8db0: 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20  losure of "stp" 
8dc0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
8dd0: 69 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20  ig *newcfg;  /* 
8de0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
8df0: 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d  ol *sp;   /* Sym
8e00: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
8e10: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
8e20: 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a  ration "cfp" */.
8e30: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
8e40: 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c  *bsp;  /* Symbol
8e50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
8e60: 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74  ot in configurat
8e70: 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20  ion "bcfp" */.  
8e80: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
8e90: 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74  wstp; /* A point
8ea0: 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  er to a successo
8eb0: 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
8ec0: 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74   Each configurat
8ed0: 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70  ion becomes comp
8ee0: 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f  lete after it co
8ef0: 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75  ntibutes to a su
8f00: 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61  ccessor.  ** sta
8f10: 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20  te.  Initially, 
8f20: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8f30: 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74  ns are incomplet
8f40: 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73  e */.  for(cfp=s
8f50: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
8f60: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70  p=cfp->next) cfp
8f70: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
8f80: 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  PLETE;..  /* Loo
8f90: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
8fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20  nfigurations of 
8fb0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8fc0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
8fd0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8fe0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8ff0: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
9000: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
9010: 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65  inue;    /* Alre
9020: 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65  ady used by inne
9030: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66  r loop */.    if
9040: 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d  ( cfp->dot>=cfp-
9050: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
9060: 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20  inue;  /* Can't 
9070: 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69  shift this confi
9080: 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  g */.    Configl
9090: 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20  ist_reset();    
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e    /* Reset the n
90c0: 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f  ew config set */
90d0: 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72  .    sp = cfp->r
90e0: 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d  p->rhs[cfp->dot]
90f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9100: 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68   Symbol after th
9110: 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e dot */..    /*
9120: 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69   For every confi
9130: 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  guration in the 
9140: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
9150: 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c  h has the symbol
9160: 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c   "sp".    ** fol
9170: 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20  lowing its dot, 
9180: 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  add the same con
9190: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68  figuration to th
91a0: 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65  e basis set unde
91b0: 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  r.    ** constru
91c0: 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74  ction but with t
91d0: 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f  he dot shifted o
91e0: 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65  ne symbol to the
91f0: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66   right. */.    f
9200: 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66  or(bcfp=cfp; bcf
9210: 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65  p; bcfp=bcfp->ne
9220: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  xt){.      if( b
9230: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
9240: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
9250: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
9260: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  used */.      if
9270: 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66  ( bcfp->dot>=bcf
9280: 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  p->rp->nrhs ) co
9290: 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74  ntinue; /* Can't
92a0: 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20   shift this one 
92b0: 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62  */.      bsp = b
92c0: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66  cfp->rp->rhs[bcf
92d0: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
92e0: 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c     /* Get symbol
92f0: 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20   after dot */.  
9300: 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79      if( !same_sy
9310: 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63  mbol(bsp,sp) ) c
9320: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a  ontinue;      /*
9330: 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73   Must be same as
9340: 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20   for "cfp" */.  
9350: 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73      bcfp->status
9360: 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20   = COMPLETE;    
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9380: 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69   Mark this confi
9390: 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20  g as used */.   
93a0: 20 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66     newcfg = Conf
93b0: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
93c0: 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64  bcfp->rp,bcfp->d
93d0: 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69  ot+1);.      Pli
93e0: 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e  nk_add(&newcfg->
93f0: 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20  bplp,bcfp);.    
9400: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20  }..    /* Get a 
9410: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
9420: 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62  tate described b
9430: 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66  y the basis conf
9440: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20  iguration set.  
9450: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64    ** constructed
9460: 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e   in the precedin
9470: 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65  g loop */.    ne
9480: 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28  wstp = getstate(
9490: 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  lemp);..    /* T
94a0: 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70  he state "newstp
94b0: 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f  " is reached fro
94c0: 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  m the state "stp
94d0: 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  " by a shift act
94e0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ion.    ** on th
94f0: 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f  e symbol "sp" */
9500: 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
9510: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
9520: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
9530: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9540: 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69  i<sp->nsubsym; i
9550: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74  ++){.        Act
9560: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
9570: 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79  ,SHIFT,sp->subsy
9580: 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73  m[i],(char*)news
9590: 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tp);.      }.   
95a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63   }else{.      Ac
95b0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
95c0: 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72  p,SHIFT,sp,(char
95d0: 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20   *)newstp);.    
95e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
95f0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72 6f  onstruct the pro
9600: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
9610: 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73  /.void FindLinks
9620: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
9630: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
9640: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
9650: 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20  *cfp, *other;.  
9660: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
9670: 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  p;.  struct plin
9680: 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f  k *plp;..  /* Ho
9690: 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69  usekeeping detai
96a0: 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65  l:.  ** Add to e
96b0: 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c  very propagate l
96c0: 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61  ink a pointer ba
96d0: 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ck to the state 
96e0: 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68  to.  ** which th
96f0: 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68  e link is attach
9700: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ed. */.  for(i=0
9710: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
9720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
9730: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
9740: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
9750: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
9760: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
9770: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73      cfp->stp = s
9780: 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  tp;.    }.  }.. 
9790: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20   /* Convert all 
97a0: 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66  backlinks into f
97b0: 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f  orward links.  O
97c0: 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a  nly the forward.
97d0: 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75    ** links are u
97e0: 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  sed in the follo
97f0: 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f  w-set computatio
9800: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
9810: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9820: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
9830: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
9840: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
9850: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
9860: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
9870: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
9880: 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  bplp; plp; plp=p
9890: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
98a0: 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e     other = plp->
98b0: 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69  cfp;.        Pli
98c0: 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66  nk_add(&other->f
98d0: 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  plp,cfp);.      
98e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
98f0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f  * Compute all fo
9900: 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20  llowsets..**.** 
9910: 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74  A followset is t
9920: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79  he set of all sy
9930: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
9940: 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  come immediately
9950: 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66  .** after a conf
9960: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  iguration..*/.vo
9970: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
9980: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
9990: 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
99a0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
99b0: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
99c0: 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e  plink *plp;.  in
99d0: 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e  t progress;.  in
99e0: 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72  t change;..  for
99f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9a00: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
9a10: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
9a20: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
9a30: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9a40: 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74  ){.      cfp->st
9a50: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
9a60: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
9a70: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
9a80: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
9a90: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9aa0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
9ab0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
9ac0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
9ad0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9ae0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
9af0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
9b00: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
9b10: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
9b20: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
9b30: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
9b40: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
9b50: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
9b60: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
9b70: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
9b80: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
9b90: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
9ba0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
9bb0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
9bc0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
9bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9bf0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
9c00: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  MPLETE;.      }.
9c10: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9c20: 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73  progress );.}..s
9c30: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
9c40: 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63  e_conflict(struc
9c50: 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63  t action *,struc
9c60: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
9c70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64   Compute the red
9c80: 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64  uce actions, and
9c90: 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   resolve conflic
9ca0: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  ts..*/.void Find
9cb0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
9cc0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
9cd0: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
9ce0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
9cf0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
9d00: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
9d10: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
9d20: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
9d30: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
9d40: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 0a   reduce actions.
9d50: 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63    ** A reduce ac
9d60: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f  tion is added fo
9d70: 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  r each element o
9d80: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20  f the followset 
9d90: 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67  of.  ** a config
9da0: 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61  uration which ha
9db0: 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65  s its dot at the
9dc0: 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a   extreme right..
9dd0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
9de0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
9df0: 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20  i++){   /* Loop 
9e00: 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
9e10: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
9e20: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
9e30: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
9e40: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
9e50: 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f  ->next){  /* Loo
9e60: 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69  p over all confi
9e70: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  gurations */.   
9e80: 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e     if( cfp->rp->
9e90: 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  nrhs==cfp->dot )
9ea0: 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64  {        /* Is d
9eb0: 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69  ot at extreme ri
9ec0: 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght? */.        
9ed0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d  for(j=0; j<lemp-
9ee0: 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29  >nterminal; j++)
9ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9f00: 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73  SetFind(cfp->fws
9f10: 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,j) ){.         
9f20: 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75     /* Add a redu
9f30: 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ce action to the
9f40: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
9f50: 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62  ch will reduce b
9f60: 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  y the.          
9f70: 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e    ** rule "cfp->
9f80: 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61  rp" if the looka
9f90: 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22  head symbol is "
9fa0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
9fb0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  " */.           
9fc0: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
9fd0: 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70  ->ap,REDUCE,lemp
9fe0: 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68  ->symbols[j],(ch
9ff0: 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20  ar *)cfp->rp);. 
a000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a020: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64   }.  }..  /* Add
a030: 20 74 68 65 20 61 63 63 65 70 74 69 6e 67 20 74   the accepting t
a040: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65  oken */.  if( le
a050: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
a060: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
a070: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
a080: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 20      if( sp==0 ) 
a090: 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74  sp = lemp->start
a0a0: 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c  Rule->lhs;.  }el
a0b0: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
a0c0: 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68  p->startRule->lh
a0d0: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
a0e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
a0f0: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
a100: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
a110: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
a120: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
a130: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
a140: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
a150: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
a160: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
a170: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
a180: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
a190: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
a1a0: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
a1b0: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
a1c0: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
a1d0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
a1e0: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
a1f0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a200: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
a210: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
a220: 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  [i];.    /* asse
a230: 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a  rt( stp->ap ); *
a240: 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  /.    stp->ap = 
a250: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
a260: 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  >ap);.    for(ap
a270: 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20  =stp->ap; ap && 
a280: 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d  ap->next; ap=ap-
a290: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f  >next){.      fo
a2a0: 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20  r(nap=ap->next; 
a2b0: 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d  nap && nap->sp==
a2c0: 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d  ap->sp; nap=nap-
a2d0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
a2e0: 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69   /* The two acti
a2f0: 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61  ons "ap" and "na
a300: 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  p" have the same
a310: 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
a320: 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f       ** Figure o
a330: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f  ut which one sho
a340: 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20  uld be used */. 
a350: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63          lemp->nc
a360: 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c  onflict += resol
a370: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e  ve_conflict(ap,n
a380: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
a390: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
a3a0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ort an error for
a3b0: 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20   each rule that 
a3c0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64  can never be red
a3d0: 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72  uced. */.  for(r
a3e0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
a3f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72  ; rp=rp->next) r
a400: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
a410: 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f  EMON_FALSE;.  fo
a420: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
a430: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
a440: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a450: 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c  ap;.    for(ap=l
a460: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
a470: 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
a480: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
a490: 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
a4a0: 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e   ) ap->x.rp->can
a4b0: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54  Reduce = LEMON_T
a4c0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
a4d0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
a4e0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
a4f0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
a500: 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f  ->canReduce ) co
a510: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f  ntinue;.    Erro
a520: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
a530: 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
a540: 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20  ,"This rule can 
a550: 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c  not be reduced.\
a560: 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  n");.    lemp->e
a570: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d  rrorcnt++;.  }.}
a580: 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63  ../* Resolve a c
a590: 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20  onflict between 
a5a0: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63  the two given ac
a5b0: 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a  tions.  If the.*
a5c0: 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74  * conflict can't
a5d0: 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72 65   be resolved, re
a5e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
a5f0: 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54  *.** NO LONGER T
a600: 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73  RUE:.**   To res
a610: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c  olve a conflict,
a620: 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73   first look to s
a630: 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63 74  ee if either act
a640: 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61  ion.**   is on a
a650: 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49  n error rule.  I
a660: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61 6b  n that case, tak
a670: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68 69  e the action whi
a680: 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  ch.**   is not a
a690: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
a6a0: 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  he error rule.  
a6b0: 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62 6f  If neither or bo
a6c0: 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20  th.**   actions 
a6d0: 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  are associated w
a6e0: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75 6c  ith an error rul
a6f0: 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a  e, then try to.*
a700: 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65 6e  *   use preceden
a710: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ce to resolve th
a720: 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a  e conflict..**.*
a730: 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74 69  * If either acti
a740: 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20 74  on is a SHIFT, t
a750: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 61  hen it must be a
a760: 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e  px.  This.** fun
a770: 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b  ction won't work
a780: 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52   if apx->type==R
a790: 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e 74  EDUCE and apy->t
a7a0: 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73  ype==SHIFT..*/.s
a7b0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
a7c0: 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73 74  e_conflict(.  st
a7d0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78  ruct action *apx
a7e0: 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ,.  struct actio
a7f0: 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72 75  n *apy.){.  stru
a800: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20  ct symbol *spx, 
a810: 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63  *spy;.  int errc
a820: 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  nt = 0;.  assert
a830: 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e  ( apx->sp==apy->
a840: 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  sp );  /* Otherw
a850: 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ise there would 
a860: 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a  be no conflict *
a870: 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  /.  if( apx->typ
a880: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
a890: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a  >type==SHIFT ){.
a8a0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a8b0: 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SSCONFLICT;.    
a8c0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  errcnt++;.  }.  
a8d0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
a8e0: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
a8f0: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
a900: 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a   spx = apx->sp;.
a910: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
a920: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
a930: 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20    if( spy==0 || 
a940: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spx->prec<0 || s
a950: 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20  py->prec<0 ){.  
a960: 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67      /* Not enoug
a970: 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66  h precedence inf
a980: 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ormation. */.   
a990: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
a9a0: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
a9b0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
a9c0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
a9d0: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
a9e0: 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72 65     /* higher pre
a9f0: 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a  cedence wins */.
aa00: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
aa10: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
aa20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
aa30: 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63  ->prec<spy->prec
aa40: 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ){.      apx->t
aa50: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
aa60: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
aa70: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
aa80: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
aa90: 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a  soc==RIGHT ){ /*
aaa0: 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   Use operator */
aab0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
aac0: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20   = RD_RESOLVED; 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
aaf0: 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a  ssociativity */.
ab00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
ab10: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
ab20: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
ab30: 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f  ==LEFT ){  /* to
ab40: 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20   break tie */.  
ab50: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
ab60: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
ab70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
ab80: 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d  sert( spx->prec=
ab90: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
aba0: 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29  x->assoc==NONE )
abb0: 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  ;.      apx->typ
abc0: 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20 20 7d  e = ERROR;.    }
abd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
abe0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
abf0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
ac00: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
ac10: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
ac20: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
ac30: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
ac40: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
ac50: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
ac60: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
ac70: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
ac80: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
ac90: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
aca0: 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e  py->type = RRCON
acb0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
acc0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
acd0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
ace0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
acf0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
ad00: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
ad10: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
ad20: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
ad30: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
ad40: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
ad50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ad60: 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
ad70: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
ad80: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
ad90: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
ada0: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
adb0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apx->type==SSCON
adc0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
add0: 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  px->type==SRCONF
ade0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
adf0: 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  x->type==RRCONFL
ae00: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
ae10: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
ae20: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
ae30: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
ae40: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
ae50: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
ae60: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
ae70: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
ae80: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
ae90: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
aea0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
aeb0: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
aec0: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
aed0: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
aee0: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
aef0: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
af00: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
af10: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
af20: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
af30: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
af40: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
af50: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
af60: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
af70: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
af80: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
af90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
afa0: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
afb0: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
afc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
afd0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
afe0: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
aff0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
b000: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
b010: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
b020: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
b030: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
b040: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
b050: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
b060: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
b070: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
b080: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
b090: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
b0a0: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
b0b0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
b0c0: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
b0d0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
b0e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
b0f0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
b100: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
b110: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
b120: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
b130: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
b140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
b150: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
b160: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
b170: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
b180: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
b190: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
b1a0: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
b1b0: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
b1c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b1d0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
b1e0: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
b1f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
b200: 77 63 6f 6e 66 69 67 28 76 6f 69 64 29 7b 0a 20  wconfig(void){. 
b210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b220: 6e 65 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72  newcfg;.  if( fr
b230: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
b240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b250: 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65  amt = 3;.    fre
b260: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
b270: 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28  config *)calloc(
b280: 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72   amt, sizeof(str
b290: 75 63 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20  uct config) );. 
b2a0: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
b2b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
b2c0: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
b2d0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
b2e0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
b2f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29  configuration.")
b300: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
b310: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
b320: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
b330: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
b340: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
b350: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
b360: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
b370: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20  0;.  }.  newcfg 
b380: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
b390: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
b3a0: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
b3b0: 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20  n newcfg;.}../* 
b3c0: 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  The configuratio
b3d0: 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f  n "old" is no lo
b3e0: 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49  nger used */.PRI
b3f0: 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65  VATE void delete
b400: 63 6f 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f  config(struct co
b410: 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f  nfig *old).{.  o
b420: 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c  ld->next = freel
b430: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
b440: 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  = old;.}../* Ini
b450: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
b460: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b470: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
b480: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
b490: 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74  void){.  current
b4a0: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
b4b0: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
b4c0: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
b4d0: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
b4e0: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  .  Configtable_i
b4f0: 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b  nit();.  return;
b500: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
b510: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
b520: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
b530: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
b540: 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64 29  list_reset(void)
b550: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
b560: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
b570: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
b580: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
b590: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
b5a0: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
b5b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
b5c0: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
b5d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
b5e0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
b5f0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
b600: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
b610: 6c 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75  list_add(.  stru
b620: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20  ct rule *rp,    
b630: 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20  /* The rule */. 
b640: 20 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20   int dot        
b650: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
b660: 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  to the RHS of th
b670: 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65  e rule where the
b680: 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a   dot goes */.){.
b690: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
b6a0: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
b6b0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
b6c0: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
b6d0: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
b6e0: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
b6f0: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
b700: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
b710: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
b720: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
b730: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
b740: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
b750: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
b760: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
b770: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
b780: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
b790: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
b7a0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
b7b0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
b7c0: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
b7d0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
b7e0: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
b7f0: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
b800: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
b810: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
b820: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
b830: 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63  /* Add a basis c
b840: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
b850: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b860: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
b870: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b880: 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72  ist_addbasis(str
b890: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e  uct rule *rp, in
b8a0: 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63  t dot).{.  struc
b8b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d  t config *cfp, m
b8c0: 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  odel;..  assert(
b8d0: 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a   basisend!=0 );.
b8e0: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
b8f0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
b900: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
b910: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
b920: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
b930: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
b940: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
b950: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
b960: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
b970: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
b980: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
b990: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
b9a0: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
b9b0: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
b9c0: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
b9d0: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
b9e0: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
b9f0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
ba00: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
ba10: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
ba20: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
ba30: 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20      *basisend = 
ba40: 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e  cfp;.    basisen
ba50: 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20  d = &cfp->bp;.  
ba60: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
ba70: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
ba80: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
ba90: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
baa0: 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f  losure of the co
bab0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
bac0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
bad0: 69 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75  ist_closure(stru
bae0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
baf0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
bb00: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
bb10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
bb20: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
bb30: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
bb40: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
bb50: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
bb60: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
bb70: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
bb80: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
bb90: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
bba0: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
bbb0: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
bbc0: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
bbd0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
bbe0: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
bbf0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
bc00: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
bc10: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
bc20: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
bc30: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
bc40: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
bc50: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
bc60: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
bc70: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
bc80: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
bc90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
bca0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
bcb0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
bcc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bcd0: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
bce0: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
bcf0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
bd00: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
bd10: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
bd20: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
bd30: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
bd40: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
bd50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
bd60: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
bd70: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
bd80: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
bd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
bda0: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
bdb0: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
bde0: 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65  se if( xsp->type
bdf0: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
be00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
be10: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
be20: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70    for(k=0; k<xsp
be30: 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
be40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
be50: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
be60: 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b  s, xsp->subsym[k
be70: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
be80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bea0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
beb0: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
bec0: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
bed0: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
bee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
bef0: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
bf00: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
bf10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bf20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
bf30: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
bf40: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
bf50: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
bf60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bf70: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
bf80: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
bf90: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
bfa0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
bfb0: 6f 72 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72  ort(void){.  cur
bfc0: 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63  rent = (struct c
bfd0: 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68  onfig*)msort((ch
bfe0: 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61  ar*)current,(cha
bff0: 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e  r**)&(current->n
c000: 65 78 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ext),.          
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 43 6f 6e 66 69 67 63 6d          Configcm
c030: 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64  p);.  currentend
c040: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
c050: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62  }../* Sort the b
c060: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
c070: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
c080: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
c090: 61 73 69 73 28 76 6f 69 64 29 7b 0a 20 20 62 61  asis(void){.  ba
c0a0: 73 69 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f  sis = (struct co
c0b0: 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61  nfig*)msort((cha
c0c0: 72 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72  r*)current,(char
c0d0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
c0e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20     Configcmp);. 
c110: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
c120: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
c130: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c140: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
c150: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
c160: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
c170: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
c180: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
c190: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
c1a0: 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20  void){.  struct 
c1b0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
c1c0: 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20  ld = current;.  
c1d0: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
c1e0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
c1f0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
c200: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
c210: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
c220: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
c230: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
c240: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
c250: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
c260: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73   *Configlist_bas
c270: 69 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 72 75  is(void){.  stru
c280: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
c290: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
c2a0: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
c2b0: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
c2c0: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
c2d0: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
c2e0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
c2f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
c300: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
c310: 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20  list_eat(struct 
c320: 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
c330: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
c340: 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b  nextcfp;.  for(;
c350: 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66   cfp; cfp=nextcf
c360: 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20  p){.    nextcfp 
c370: 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = cfp->next;.   
c380: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70   assert( cfp->fp
c390: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  lp==0 );.    ass
c3a0: 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d  ert( cfp->bplp==
c3b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70  0 );.    if( cfp
c3c0: 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28  ->fws ) SetFree(
c3d0: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64  cfp->fws);.    d
c3e0: 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29  eleteconfig(cfp)
c3f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
c400: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c410: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
c420: 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a  le "error.c" ***
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
c450: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
c460: 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65  rinting error me
c470: 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20  ssage..*/..void 
c480: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
c490: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69  har *filename, i
c4a0: 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
c4b0: 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e   char *format, .
c4c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
c4d0: 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  p;.  fprintf(std
c4e0: 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20  err, "%s:%d: ", 
c4f0: 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f  filename, lineno
c500: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
c510: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70  , format);.  vfp
c520: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f 72  rintf(stderr,for
c530: 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mat,ap);.  va_en
c540: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
c550: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
c560: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c570: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c580: 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a  e "main.c" *****
c590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c5b0: 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67  ./*.** Main prog
c5c0: 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ram file for the
c5d0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
c5e0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
c5f0: 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66  Report an out-of
c600: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
c610: 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68  n and abort.  Th
c620: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
c630: 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79  s used mostly by
c640: 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63   the "MemoryChec
c650: 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75  k" macro in stru
c660: 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ct.h.*/.void mem
c670: 6f 72 79 5f 65 72 72 6f 72 28 76 6f 69 64 29 7b  ory_error(void){
c680: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
c690: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
c6a0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
c6b0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
c6c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
c6d0: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
c6e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
c6f0: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
c700: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
c710: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
c720: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
c730: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
c740: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
c750: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c760: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
c770: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
c780: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
c790: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
c7a0: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
c7b0: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
c7c0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
c7d0: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
c7e0: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
c7f0: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
c800: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
c810: 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72  ne = (char **) r
c820: 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c  ealloc(azDefine,
c830: 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65   sizeof(azDefine
c840: 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20  [0])*nDefine);. 
c850: 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30   if( azDefine==0
c860: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
c870: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
c880: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
c890: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61  xit(1);.  }.  pa
c8a0: 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44  z = &azDefine[nD
c8b0: 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a  efine-1];.  *paz
c8c0: 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
c8d0: 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
c8e0: 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70  z)+1 );.  if( *p
c8f0: 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  az==0 ){.    fpr
c900: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74  intf(stderr,"out
c910: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
c920: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
c930: 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
c940: 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28  *paz, z);.  for(
c950: 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a  z=*paz; *z && *z
c960: 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20  !='='; z++){}.  
c970: 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  *z = 0;.}../* Re
c980: 6d 62 65 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  mber the name of
c990: 20 74 68 65 20 6f 75 74 70 75 74 20 64 69 72 65   the output dire
c9a0: 63 74 6f 72 79 20 0a 2a 2f 0a 73 74 61 74 69 63  ctory .*/.static
c9b0: 20 63 68 61 72 20 2a 6f 75 74 70 75 74 44 69 72   char *outputDir
c9c0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
c9d0: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 64 5f 6f 70  void handle_d_op
c9e0: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
c9f0: 20 6f 75 74 70 75 74 44 69 72 20 3d 20 28 63 68   outputDir = (ch
ca00: 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
ca10: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29  monStrlen(z)+1 )
ca20: 3b 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69  ;.  if( outputDi
ca30: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  r==0 ){.    fpri
ca40: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
ca50: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
ca60: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
ca70: 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6f    lemon_strcpy(o
ca80: 75 74 70 75 74 44 69 72 2c 20 7a 29 3b 0a 7d 0a  utputDir, z);.}.
ca90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73  .static char *us
caa0: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
cab0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
cac0: 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  oid handle_T_opt
cad0: 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ion(char *z){.  
cae0: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
caf0: 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  e = (char *) mal
cb00: 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
cb10: 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75  (z)+1 );.  if( u
cb20: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
cb30: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72  ==0 ){.    memor
cb40: 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
cb50: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73   lemon_strcpy(us
cb60: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
cb70: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65   z);.}../* Merge
cb80: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73   together to lis
cb90: 74 73 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65  ts of rules orde
cba0: 72 65 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c  red by rule.iRul
cbb0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e */.static stru
cbc0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65  ct rule *Rule_me
cbd0: 72 67 65 28 73 74 72 75 63 74 20 72 75 6c 65 20  rge(struct rule 
cbe0: 2a 70 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *pA, struct rule
cbf0: 20 2a 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20   *pB){.  struct 
cc00: 72 75 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30  rule *pFirst = 0
cc10: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
cc20: 2a 2a 70 70 50 72 65 76 20 3d 20 26 70 46 69 72  **ppPrev = &pFir
cc30: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  st;.  while( pA 
cc40: 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
cc50: 20 70 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69   pA->iRule<pB->i
cc60: 52 75 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Rule ){.      *p
cc70: 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20  pPrev = pA;.    
cc80: 20 20 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e    ppPrev = &pA->
cc90: 6e 65 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d  next;.      pA =
cca0: 20 70 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d   pA->next;.    }
ccb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
ccc0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rev = pB;.      
ccd0: 70 70 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65  ppPrev = &pB->ne
cce0: 78 74 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  xt;.      pB = p
ccf0: 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  B->next;.    }. 
cd00: 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
cd10: 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b     *ppPrev = pA;
cd20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
cd30: 70 50 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a  pPrev = pB;.  }.
cd40: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
cd50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
cd60: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69   list of rules i
cd70: 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65  n order of incre
cd80: 61 73 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75  asing iRule valu
cd90: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e.*/.static stru
cda0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f  ct rule *Rule_so
cdb0: 72 74 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  rt(struct rule *
cdc0: 72 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rp){.  int i;.  
cdd0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65  struct rule *pNe
cde0: 78 74 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  xt;.  struct rul
cdf0: 65 20 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73  e *x[32];.  mems
ce00: 65 74 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(x, 0, sizeof(
ce10: 78 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70  x));.  while( rp
ce20: 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20   ){.    pNext = 
ce30: 72 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70  rp->next;.    rp
ce40: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
ce50: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
ce60: 66 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d  f(x)/sizeof(x[0]
ce70: 29 20 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b  ) && x[i]; i++){
ce80: 0a 20 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65  .      rp = Rule
ce90: 5f 6d 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29  _merge(x[i], rp)
cea0: 3b 0a 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30  ;.      x[i] = 0
ceb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d  ;.    }.    x[i]
cec0: 20 3d 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20   = rp;.    rp = 
ced0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20  pNext;.  }.  rp 
cee0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
cef0: 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65  i<sizeof(x)/size
cf00: 6f 66 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  of(x[0]); i++){.
cf10: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
cf20: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
cf30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a   }.  return rp;.
cf40: 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  }../* forward re
cf50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
cf60: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
cf70: 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
cf80: 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
cf90: 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a  , int *pnByte);.
cfa0: 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
cfb0: 6c 65 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22  le line of the "
cfc0: 50 61 72 73 65 72 20 53 74 61 74 73 22 20 6f 75  Parser Stats" ou
cfd0: 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tput.*/.static v
cfe0: 6f 69 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63  oid stats_line(c
cff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
d000: 6c 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a  l, int iValue){.
d010: 20 20 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c    int nLabel = l
d020: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65  emonStrlen(zLabe
d030: 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  l);.  printf("  
d040: 25 73 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a  %s%.*s %5d\n", z
d050: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
d060: 33 35 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e  35-nLabel, "....
d070: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
d080: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20  ............",. 
d090: 20 20 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b          iValue);
d0a0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20  .}../* The main 
d0b0: 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20  program.  Parse 
d0c0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
d0d0: 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f   and do it... */
d0e0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
d0f0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
d100: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
d110: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
d120: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
d130: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
d140: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
d150: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
d160: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
d170: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
d180: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
d190: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
d1a0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
d1b0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
d1c0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
d1d0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
d1e0: 74 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74  tic int noResort
d1f0: 20 3d 20 30 3b 0a 20 20 0a 20 20 73 74 61 74 69   = 0;.  .  stati
d200: 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  c struct s_optio
d210: 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b  ns options[] = {
d220: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
d230: 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73  "b", (char*)&bas
d240: 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f  isflag, "Print o
d250: 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20 69 6e  nly the basis in
d260: 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20   report."},.    
d270: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20  {OPT_FLAG, "c", 
d280: 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73  (char*)&compress
d290: 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73  , "Don't compres
d2a0: 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  s the action tab
d2b0: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
d2c0: 46 53 54 52 2c 20 22 64 22 2c 20 28 63 68 61 72  FSTR, "d", (char
d2d0: 2a 29 26 68 61 6e 64 6c 65 5f 64 5f 6f 70 74 69  *)&handle_d_opti
d2e0: 6f 6e 2c 20 22 4f 75 74 70 75 74 20 64 69 72 65  on, "Output dire
d2f0: 63 74 6f 72 79 2e 20 20 44 65 66 61 75 6c 74 20  ctory.  Default 
d300: 27 2e 27 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  '.'"},.    {OPT_
d310: 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68 61 72  FSTR, "D", (char
d320: 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f  *)handle_D_optio
d330: 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20 25 69  n, "Define an %i
d340: 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20  fdef macro."},. 
d350: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 66     {OPT_FSTR, "f
d360: 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20  ", 0, "Ignored. 
d370: 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f   (Placeholder fo
d380: 72 20 2d 66 20 63 6f 6d 70 69 6c 65 72 20 6f 70  r -f compiler op
d390: 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b  tions.)"},.    {
d3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
d3b0: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
d3c0: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
d3d0: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
d3e0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
d3f0: 20 22 49 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65   "I", 0, "Ignore
d400: 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72  d.  (Placeholder
d410: 20 66 6f 72 20 27 2d 49 27 20 63 6f 6d 70 69 6c   for '-I' compil
d420: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
d430: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
d440: 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c  m", (char*)&mhfl
d450: 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61  ag, "Output a ma
d460: 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74  keheaders compat
d470: 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  ible file."},.  
d480: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22    {OPT_FLAG, "l"
d490: 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65  , (char*)&noline
d4a0: 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74  nosflag, "Do not
d4b0: 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74 61   print #line sta
d4c0: 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20  tements."},.    
d4d0: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 4f 22 2c 20  {OPT_FSTR, "O", 
d4e0: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
d4f0: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
d500: 2d 4f 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -O' compiler opt
d510: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
d520: 50 54 5f 46 4c 41 47 2c 20 22 70 22 2c 20 28 63  PT_FLAG, "p", (c
d530: 68 61 72 2a 29 26 73 68 6f 77 50 72 65 63 65 64  har*)&showPreced
d540: 65 6e 63 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20  enceConflict,.  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 22 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74    "Show conflict
d570: 73 20 72 65 73 6f 6c 76 65 64 20 62 79 20 70 72  s resolved by pr
d580: 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 22 7d  ecedence rules"}
d590: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
d5a0: 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26 71 75   "q", (char*)&qu
d5b0: 69 65 74 2c 20 22 28 51 75 69 65 74 29 20 44 6f  iet, "(Quiet) Do
d5c0: 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20 72 65  n't print the re
d5d0: 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  port file."},.  
d5e0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22    {OPT_FLAG, "r"
d5f0: 2c 20 28 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f  , (char*)&noReso
d600: 72 74 2c 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74  rt, "Do not sort
d610: 20 6f 72 20 72 65 6e 75 6d 62 65 72 20 73 74 61   or renumber sta
d620: 74 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  tes"},.    {OPT_
d630: 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72  FLAG, "s", (char
d640: 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a 20  *)&statistics,. 
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 22 50 72 69 6e 74 20 70 61 72 73 65 72 20    "Print parser 
d680: 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72  stats to standar
d690: 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20  d output."},.   
d6a0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c   {OPT_FLAG, "x",
d6b0: 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e   (char*)&version
d6c0: 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65 72  , "Print the ver
d6d0: 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a  sion number."},.
d6e0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
d6f0: 54 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  T", (char*)handl
d700: 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22 53 70 65  e_T_option, "Spe
d710: 63 69 66 79 20 61 20 74 65 6d 70 6c 61 74 65 20  cify a template 
d720: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
d730: 54 5f 46 53 54 52 2c 20 22 57 22 2c 20 30 2c 20  T_FSTR, "W", 0, 
d740: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
d750: 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 57 27  eholder for '-W'
d760: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
d770: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
d780: 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b  FLAG,0,0,0}.  };
d790: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d7a0: 65 78 69 74 63 6f 64 65 3b 0a 20 20 73 74 72 75  exitcode;.  stru
d7b0: 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 20 20  ct lemon lem;.  
d7c0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
d7d0: 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76  ..  OptInit(argv
d7e0: 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29  ,options,stderr)
d7f0: 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20  ;.  if( version 
d800: 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22  ){.     printf("
d810: 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e  Lemon version 1.
d820: 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74  0\n");.     exit
d830: 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4f  (0);.  }.  if( O
d840: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
d850: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d860: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
d870: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
d880: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
d890: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
d8a0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
d8b0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
d8c0: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
d8d0: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
d8e0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
d8f0: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
d900: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
d910: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
d920: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
d930: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
d940: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
d950: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
d960: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
d970: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
d980: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
d990: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
d9a0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
d9b0: 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  ");..  /* Parse 
d9c0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
d9d0: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
d9e0: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
d9f0: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
da00: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
da10: 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a  lem.nrule==0 ){.
da20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
da30: 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61  rr,"Empty gramma
da40: 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  r.\n");.    exit
da50: 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65  (1);.  }.  lem.e
da60: 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 66  rrsym = Symbol_f
da70: 69 6e 64 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20  ind("error");.. 
da80: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
da90: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
daa0: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
dab0: 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  /.  Symbol_new("
dac0: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
dad0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d  em.nsymbol = Sym
dae0: 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c  bol_count();.  l
daf0: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
db00: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
db10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e   for(i=0; i<lem.
db20: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
db30: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
db40: 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74  dex = i;.  qsort
db50: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d  (lem.symbols,lem
db60: 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28  .nsymbol,sizeof(
db70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
db80: 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20   Symbolcmpp);.  
db90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e  for(i=0; i<lem.n
dba0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d  symbol; i++) lem
dbb0: 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64  .symbols[i]->ind
dbc0: 65 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28  ex = i;.  while(
dbd0: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31   lem.symbols[i-1
dbe0: 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  ]->type==MULTITE
dbf0: 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d  RMINAL ){ i--; }
dc00: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 63 6d  .  assert( strcm
dc10: 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d  p(lem.symbols[i-
dc20: 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75  1]->name,"{defau
dc30: 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65  lt}")==0 );.  le
dc40: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20  m.nsymbol = i - 
dc50: 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 49 53  1;.  for(i=1; IS
dc60: 55 50 50 45 52 28 6c 65 6d 2e 73 79 6d 62 6f 6c  UPPER(lem.symbol
dc70: 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20  s[i]->name[0]); 
dc80: 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72  i++);.  lem.nter
dc90: 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a  minal = i;..  /*
dca0: 20 41 73 73 69 67 6e 20 73 65 71 75 65 6e 74 69   Assign sequenti
dcb0: 61 6c 20 72 75 6c 65 20 6e 75 6d 62 65 72 73 2e  al rule numbers.
dcc0: 20 20 53 74 61 72 74 20 77 69 74 68 20 30 2e 20    Start with 0. 
dcd0: 20 50 75 74 20 72 75 6c 65 73 20 74 68 61 74 20   Put rules that 
dce0: 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 72 65 64  have no.  ** red
dcf0: 75 63 65 20 61 63 74 69 6f 6e 20 43 2d 63 6f 64  uce action C-cod
dd00: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
dd10: 68 20 74 68 65 6d 20 6c 61 73 74 2c 20 73 6f 20  h them last, so 
dd20: 74 68 61 74 20 74 68 65 20 73 77 69 74 63 68 28  that the switch(
dd30: 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ).  ** statement
dd40: 20 74 68 61 74 20 73 65 6c 65 63 74 73 20 72 65   that selects re
dd50: 64 75 63 74 69 6f 6e 20 61 63 74 69 6f 6e 73 20  duction actions 
dd60: 77 69 6c 6c 20 68 61 76 65 20 61 20 73 6d 61 6c  will have a smal
dd70: 6c 65 72 20 6a 75 6d 70 20 74 61 62 6c 65 2e 0a  ler jump table..
dd80: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
dd90: 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b  rp=lem.rule; rp;
dda0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
ddb0: 20 20 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 72     rp->iRule = r
ddc0: 70 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b 20 3a 20  p->code ? i++ : 
ddd0: 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  -1;.  }.  for(rp
dde0: 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b 20 72  =lem.rule; rp; r
ddf0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
de00: 20 69 66 28 20 72 70 2d 3e 69 52 75 6c 65 3c 30   if( rp->iRule<0
de10: 20 29 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 69   ) rp->iRule = i
de20: 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 73 74  ++;.  }.  lem.st
de30: 61 72 74 52 75 6c 65 20 3d 20 6c 65 6d 2e 72 75  artRule = lem.ru
de40: 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c 65 20 3d  le;.  lem.rule =
de50: 20 52 75 6c 65 5f 73 6f 72 74 28 6c 65 6d 2e 72   Rule_sort(lem.r
de60: 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ule);..  /* Gene
de70: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
de80: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
de90: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
dea0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
deb0: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
dec0: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
ded0: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
dee0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
def0: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
df00: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
df10: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
df20: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
df30: 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  inal+1);..    /*
df40: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
df50: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
df60: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
df70: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
df80: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
df90: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
dfa0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
dfb0: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
dfc0: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
dfd0: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
dfe0: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
dff0: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
e000: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
e010: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
e020: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
e030: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
e040: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
e050: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
e060: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
e070: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
e080: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
e090: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
e0a0: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
e0b0: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
e0c0: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
e0d0: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
e0e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
e0f0: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
e100: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
e110: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
e120: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
e130: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
e140: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
e150: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
e160: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
e170: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
e180: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
e190: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
e1a0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
e1b0: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
e1c0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
e1d0: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
e1e0: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
e1f0: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
e200: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
e210: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
e220: 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e   Reorder and ren
e230: 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73  umber the states
e240: 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
e250: 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
e260: 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  es.    ** occur 
e270: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
e280: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
e290: 74 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73 20  tion that helps 
e2a0: 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  make the.    ** 
e2b0: 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72  generated parser
e2c0: 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e   tables smaller.
e2d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 52 65   */.    if( noRe
e2e0: 73 6f 72 74 3d 3d 30 20 29 20 52 65 73 6f 72 74  sort==0 ) Resort
e2f0: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  States(&lem);.. 
e300: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
e310: 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70   report of the p
e320: 61 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e  arser generated.
e330: 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74    (the "y.output
e340: 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69  " file) */.    i
e350: 66 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f  f( !quiet ) Repo
e360: 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a  rtOutput(&lem);.
e370: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
e380: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
e390: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
e3a0: 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62  */.    ReportTab
e3b0: 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29  le(&lem, mhflag)
e3c0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63  ;..    /* Produc
e3d0: 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
e3e0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73  for use by the s
e3f0: 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73  canner.  (This s
e400: 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d  tep is.    ** om
e410: 69 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d  itted if the "-m
e420: 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  " option is used
e430: 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61   because makehea
e440: 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ders will.    **
e450: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69   generate the fi
e460: 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20  le for us.) */. 
e470: 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29     if( !mhflag )
e480: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c   ReportHeader(&l
e490: 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  em);.  }.  if( s
e4a0: 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20  tatistics ){.   
e4b0: 20 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20   printf("Parser 
e4c0: 73 74 61 74 69 73 74 69 63 73 3a 5c 6e 22 29 3b  statistics:\n");
e4d0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e4e0: 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  "terminal symbol
e4f0: 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  s", lem.ntermina
e500: 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  l);.    stats_li
e510: 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ne("non-terminal
e520: 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e   symbols", lem.n
e530: 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65  symbol - lem.nte
e540: 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61  rminal);.    sta
e550: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 73  ts_line("total s
e560: 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79  ymbols", lem.nsy
e570: 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  mbol);.    stats
e580: 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22 2c 20 6c  _line("rules", l
e590: 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 73  em.nrule);.    s
e5a0: 74 61 74 73 5f 6c 69 6e 65 28 22 73 74 61 74 65  tats_line("state
e5b0: 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61 74 65 29  s", lem.nxstate)
e5c0: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
e5d0: 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c 20 6c 65  ("conflicts", le
e5e0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
e5f0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 61 63    stats_line("ac
e600: 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e 74 72 69  tion table entri
e610: 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74 69 6f 6e  es", lem.naction
e620: 74 61 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  tab);.    stats_
e630: 6c 69 6e 65 28 22 6c 6f 6f 6b 61 68 65 61 64 20  line("lookahead 
e640: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 22 2c 20  table entries", 
e650: 6c 65 6d 2e 6e 6c 6f 6f 6b 61 68 65 61 64 74 61  lem.nlookaheadta
e660: 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  b);.    stats_li
e670: 6e 65 28 22 74 6f 74 61 6c 20 74 61 62 6c 65 20  ne("total table 
e680: 73 69 7a 65 20 28 62 79 74 65 73 29 22 2c 20 6c  size (bytes)", l
e690: 65 6d 2e 74 61 62 6c 65 73 69 7a 65 29 3b 0a 20  em.tablesize);. 
e6a0: 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f   }.  if( lem.nco
e6b0: 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a 20 20  nflict > 0 ){.  
e6c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
e6d0: 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e  ,"%d parsing con
e6e0: 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e  flicts.\n",lem.n
e6f0: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 0a  conflict);.  }..
e700: 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e    /* return 0 on
e710: 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20 66   success, 1 on f
e720: 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65 78 69  ailure. */.  exi
e730: 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e 65 72  tcode = ((lem.er
e740: 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c 20 28  rorcnt > 0) || (
e750: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20  lem.nconflict > 
e760: 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 65  0)) ? 1 : 0;.  e
e770: 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b 0a 20  xit(exitcode);. 
e780: 20 72 65 74 75 72 6e 20 28 65 78 69 74 63 6f 64   return (exitcod
e790: 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  e);.}./*********
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
e7b0: 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74   the file "msort
e7c0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7e0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e  ***/./*.** A gen
e7f0: 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20  eric merge-sort 
e800: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55  program..**.** U
e810: 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74  SAGE:.** Let "pt
e820: 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  r" be a pointer 
e830: 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72  to some structur
e840: 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74 68  e which is at th
e850: 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e  e head of.** a n
e860: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
e870: 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f  ist.  Then to so
e880: 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c  rt the list call
e890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20  :.**.**     ptr 
e8a0: 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74  = msort(ptr,&(pt
e8b0: 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29  r->next),cmpfnc)
e8c0: 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ;.**.** In the a
e8d0: 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69  bove, "cmpfnc" i
e8e0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
e8f0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20   function which 
e900: 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20  compares.** two 
e910: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
e920: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
e930: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
e940: 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63  r, as in.** strc
e950: 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  mp.  The second 
e960: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
e970: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69  inter to the poi
e980: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  nter to the.** s
e990: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66  econd element of
e9a0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e9b0: 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73 20  .  This address 
e9c0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  is used to compu
e9d0: 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74  te.** the offset
e9e0: 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66   to the "next" f
e9f0: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
ea00: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
ea10: 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  offset to.** the
ea20: 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75   "next" field mu
ea30: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66  st be constant f
ea40: 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  or all structure
ea50: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  s in the list..*
ea60: 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f  *.** The functio
ea70: 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  n returns a new 
ea80: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69 73  pointer which is
ea90: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
eaa0: 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73   list.** after s
eab0: 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c  orting..**.** AL
eac0: 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67  GORITHM:.** Merg
ead0: 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  e-sort..*/../*.*
eae0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
eaf0: 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  er to the next s
eb00: 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65 20  tructure in the 
eb10: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
eb20: 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20  #define NEXT(A) 
eb30: 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63 68 61  (*(char**)(((cha
eb40: 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a  r*)A)+offset))..
eb50: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
eb60: 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f     a:       A so
eb70: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
eb80: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
eb90: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
eba0: 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20  )..**   b:      
ebb0: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
ebc0: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
ebd0: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
ebe0: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70   null)..**   cmp
ebf0: 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20  :     A pointer 
ec00: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
ec10: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20  n function..**  
ec20: 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74   offset:  Offset
ec30: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
ec40: 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  e to the "next" 
ec50: 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  field..**.** Ret
ec60: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
ec70: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
ec80: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
ec90: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
eca0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
ecb0: 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e  *   of both a an
ecc0: 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  d b..**.** Side 
ecd0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
ece0: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
ecf0: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
ed00: 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e  n the lists a an
ed10: 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61  d b are.**   cha
ed20: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
ed30: 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63  char *merge(.  c
ed40: 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a  har *a,.  char *
ed50: 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28  b,.  int (*cmp)(
ed60: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ed70: 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20  t char*),.  int 
ed80: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72  offset.){.  char
ed90: 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20   *ptr, *head;.. 
eda0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
edb0: 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c   head = b;.  }el
edc0: 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20  se if( b==0 ){. 
edd0: 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d     head = a;.  }
ede0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a  else{.    if( (*
edf0: 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a  cmp)(a,b)<=0 ){.
ee00: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
ee10: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
ee20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee30: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
ee40: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
ee50: 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20     }.    head = 
ee60: 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ptr;.    while( 
ee70: 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20  a && b ){.      
ee80: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
ee90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  =0 ){.        NE
eea0: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
eeb0: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
eec0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
eed0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
eee0: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
eef0: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
ef00: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
ef10: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
ef20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ef30: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
ef40: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
ef50: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
ef60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
ef70: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
ef80: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
ef90: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
efa0: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
efb0: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
efc0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
efd0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
efe0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
eff0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
f000: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
f010: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
f020: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
f030: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
f040: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
f050: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
f060: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
f070: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f080: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
f090: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
f0a0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
f0b0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
f0c0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
f0d0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
f0e0: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
f0f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
f100: 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68  IZE 30.static ch
f110: 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61  ar *msort(.  cha
f120: 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20  r *list,.  char 
f130: 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a  **next,.  int (*
f140: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
f150: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
f160: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
f170: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
f180: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
f190: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
f1a0: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
f1b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 28  (unsigned long)(
f1c0: 28 63 68 61 72 2a 29 6e 65 78 74 20 2d 20 28 63  (char*)next - (c
f1d0: 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20 20 66 6f  har*)list);.  fo
f1e0: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
f1f0: 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d  E; i++) set[i] =
f200: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73   0;.  while( lis
f210: 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69  t ){.    ep = li
f220: 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e  st;.    list = N
f230: 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e  EXT(list);.    N
f240: 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20  EXT(ep) = 0;.   
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
f260: 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d  SIZE-1 && set[i]
f270: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
f280: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
f290: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
f2a0: 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20  );.      set[i] 
f2b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
f2c0: 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a  et[i] = ep;.  }.
f2d0: 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28    ep = 0;.  for(
f2e0: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
f2f0: 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d   i++) if( set[i]
f300: 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73 65   ) ep = merge(se
f310: 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73  t[i],ep,cmp,offs
f320: 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70  et);.  return ep
f330: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
f350: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74  om the file "opt
f360: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
f390: 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74  *argv;.static st
f3a0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a  ruct s_options *
f3b0: 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20  op;.static FILE 
f3c0: 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65  *errstream;..#de
f3d0: 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28  fine ISOPT(X) ((
f3e0: 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b  X)[0]=='-'||(X)[
f3f0: 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28  0]=='+'||strchr(
f400: 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a  (X),'=')!=0)../*
f410: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
f420: 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20  mmand line with 
f430: 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e  a carrot pointin
f440: 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68  g to the k-th ch
f450: 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68  aracter.** of th
f460: 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f  e n-th field..*/
f470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72  .static void err
f480: 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20  line(int n, int 
f490: 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  k, FILE *err).{.
f4a0: 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a    int spcnt, i;.
f4b0: 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20    if( argv[0] ) 
f4c0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22  fprintf(err,"%s"
f4d0: 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63  ,argv[0]);.  spc
f4e0: 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  nt = lemonStrlen
f4f0: 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20  (argv[0]) + 1;. 
f500: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
f510: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
f520: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
f530: 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a  " %s",argv[i]);.
f540: 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d      spcnt += lem
f550: 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d  onStrlen(argv[i]
f560: 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74  )+1;.  }.  spcnt
f570: 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61   += k;.  for(; a
f580: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72  rgv[i]; i++) fpr
f590: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
f5a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73  rgv[i]);.  if( s
f5b0: 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66  pcnt<20 ){.    f
f5c0: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
f5d0: 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63  s^-- here\n",spc
f5e0: 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  nt,"");.  }else{
f5f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
f600: 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c  ,"\n%*shere --^\
f610: 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a  n",spcnt-7,"");.
f620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
f630: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
f640: 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77   the N-th non-sw
f650: 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20  itch argument.  
f660: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
f670: 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
f680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f690: 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e 29   argindex(int n)
f6a0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  .{.  int i;.  in
f6b0: 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a  t dashdash = 0;.
f6c0: 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26    if( argv!=0 &&
f6d0: 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20   *argv!=0 ){.   
f6e0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
f6f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
f700: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
f710: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
f720: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  {.        if( n=
f730: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
f740: 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
f750: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
f760: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
f770: 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
f780: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f790: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
f7a0: 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67  static char emsg
f7b0: 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69  [] = "Command li
f7c0: 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a  ne syntax error:
f7d0: 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65   ";../*.** Proce
f7e0: 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e  ss a flag comman
f7f0: 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e  d line argument.
f800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
f810: 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20 69  andleflags(int i
f820: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
f830: 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72   int v;.  int er
f840: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rcnt = 0;.  int 
f850: 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70  j;.  for(j=0; op
f860: 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b  [j].label; j++){
f870: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
f880: 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b  (&argv[i][1],op[
f890: 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74  j].label,lemonSt
f8a0: 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  rlen(op[j].label
f8b0: 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ))==0 ) break;. 
f8c0: 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d   }.  v = argv[i]
f8d0: 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30  [0]=='-' ? 1 : 0
f8e0: 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61  ;.  if( op[j].la
f8f0: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  bel==0 ){.    if
f900: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
f910: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e  printf(err,"%sun
f920: 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c  defined option.\
f930: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
f940: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
f950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
f960: 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nt++;.  }else if
f970: 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20 29  ( op[j].arg==0 )
f980: 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  {.    /* Ignore 
f990: 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  this option */. 
f9a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f9b0: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20  .type==OPT_FLAG 
f9c0: 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f  ){.    *((int*)o
f9d0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20  p[j].arg) = v;. 
f9e0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f9f0: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47  .type==OPT_FFLAG
fa00: 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28   ){.    (*(void(
fa10: 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61  *)(int))(op[j].a
fa20: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
fa30: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
fa40: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
fa50: 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72   (*(void(*)(char
fa60: 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29   *))(op[j].arg))
fa70: 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20  (&argv[i][2]);. 
fa80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
fa90: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
faa0: 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73 73  intf(err,"%smiss
fab0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ing argument on 
fac0: 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29  switch.\n",emsg)
fad0: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
fae0: 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,1,err);.    }.
faf0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fb00: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
fb10: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  t;.}../*.** Proc
fb20: 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69  ess a command li
fb30: 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68 20  ne switch which 
fb40: 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  has an argument.
fb50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
fb60: 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e 74 20  andleswitch(int 
fb70: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
fb80: 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20    int lv = 0;.  
fb90: 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b  double dv = 0.0;
fba0: 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c  .  char *sv = 0,
fbb0: 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63   *end;.  char *c
fbc0: 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  p;.  int j;.  in
fbd0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
fbe0: 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76  cp = strchr(argv
fbf0: 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65  [i],'=');.  asse
fc00: 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a  rt( cp!=0 );.  *
fc10: 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d  cp = 0;.  for(j=
fc20: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
fc30: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
fc40: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b  rcmp(argv[i],op[
fc50: 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62  j].label)==0 ) b
fc60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20  reak;.  }.  *cp 
fc70: 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b  = '=';.  if( op[
fc80: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
fc90: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
fca0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
fcb0: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
fcc0: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
fcd0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
fce0: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
fcf0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
fd00: 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20  se{.    cp++;.  
fd10: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
fd20: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
fd30: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
fd40: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
fd50: 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  G:.        if( e
fd60: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
fd70: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f  fprintf(err,"%so
fd80: 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
fd90: 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  n argument.\n",e
fda0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
fdb0: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
fdc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fdd0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fde0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fdf0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
fe00: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
fe10: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76  FDBL:.        dv
fe20: 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e   = strtod(cp,&en
fe30: 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
fe40: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
fe50: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
fe60: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
fe70: 28 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  (err,.          
fe80: 20 20 20 20 20 22 25 73 69 6c 6c 65 67 61 6c 20       "%sillegal 
fe90: 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f  character in flo
fea0: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75  ating-point argu
feb0: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
fed0: 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63 68 61  ine(i,(int)((cha
fee0: 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29 61 72  r*)end-(char*)ar
fef0: 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20 20 20  gv[i]),err);.   
ff00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff10: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
ff20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ff30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ff40: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
ff50: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
ff60: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
ff70: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
ff80: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
ff90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ffa0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
ffb0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
ffc0: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
ffd0: 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
ffe0: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
fff0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
10000 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28  errline(i,(int)(
10010 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72  (char*)end-(char
10020 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b  *)argv[i]),err);
10030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10040 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
10050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10070 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
10080 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
10090 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20  R:.        sv = 
100a0 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  cp;.        brea
100b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  k;.    }.    swi
100c0 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
100d0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
100e0 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
100f0 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
10100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10110 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
10120 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c  .        *(doubl
10130 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  e*)(op[j].arg) =
10140 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   dv;.        bre
10150 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10160 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
10170 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75 62   (*(void(*)(doub
10180 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  le))(op[j].arg))
10190 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (dv);.        br
101a0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
101b0 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20  OPT_INT:.       
101c0 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61   *(int*)(op[j].a
101d0 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20  rg) = lv;.      
101e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
101f0 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
10200 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
10210 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int))(op[j].arg
10220 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20  ))((int)lv);.   
10230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10240 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
10250 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
10260 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73  )(op[j].arg) = s
10270 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
10280 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10290 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28  _FSTR:.        (
102a0 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a  *(void(*)(char *
102b0 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73  ))(op[j].arg))(s
102c0 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
102d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
102e0 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
102f0 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68 61  .int OptInit(cha
10300 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 5f  r **a, struct s_
10310 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45  options *o, FILE
10320 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65   *err).{.  int e
10330 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67  rrcnt = 0;.  arg
10340 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b  v = a;.  op = o;
10350 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65  .  errstream = e
10360 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26  rr;.  if( argv &
10370 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b  & *argv && op ){
10380 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10390 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
103a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
103b0 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b  ( argv[i][0]=='+
103c0 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  ' || argv[i][0]=
103d0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
103e0 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
103f0 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20  flags(i,err);.  
10400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10410 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
10420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
10430 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
10440 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
10450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10460 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
10470 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
10480 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
10490 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
104a0 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
104b0 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
104c0 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
104d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
104e0 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
104f0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6e  (void){.  int cn
10500 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73  t = 0;.  int das
10510 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74  hdash = 0;.  int
10520 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d   i;.  if( argv!=
10530 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20  0 && argv[0]!=0 
10540 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
10550 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
10560 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
10570 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
10580 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  [i]) ) cnt++;.  
10590 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
105a0 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20  rgv[i],"--")==0 
105b0 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a  ) dashdash = 1;.
105c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
105d0 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20  rn cnt;.}..char 
105e0 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b  *OptArg(int n).{
105f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
10600 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
10610 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
10620 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
10630 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a  d OptErr(int n).
10640 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
10650 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
10660 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
10670 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
10680 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
10690 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  int(void){.  int
106a0 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c   i;.  int max, l
106b0 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20  en;.  max = 0;. 
106c0 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
106d0 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
106e0 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
106f0 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20  en(op[i].label) 
10700 2b 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28  + 1;.    switch(
10710 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
10720 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
10730 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
10740 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
10750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10760 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
10770 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
10780 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
10790 20 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   9;       /* len
107a0 67 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72  gth of "<integer
107b0 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
107c0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
107d0 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
107e0 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
107f0 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20        len += 6; 
10800 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
10810 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20  of "<real>" */. 
10820 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10830 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
10840 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10850 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c  _FSTR:.        l
10860 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f  en += 8;       /
10870 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74  * length of "<st
10880 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20  ring>" */.      
10890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
108a0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29     if( len>max )
108b0 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a   max = len;.  }.
108c0 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d    for(i=0; op[i]
108d0 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  .label; i++){.  
108e0 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
108f0 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
10900 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
10910 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
10920 47 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  G:.        fprin
10930 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
10940 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78  -%-*s  %s\n",max
10950 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b  ,op[i].label,op[
10960 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
10970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10980 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
10990 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
109a0 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72  INT:.        fpr
109b0 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
109c0 20 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a    -%s<integer>%*
109d0 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c  s  %s\n",op[i].l
109e0 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
109f0 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53  (int)(max-lemonS
10a00 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
10a10 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-9),"",op[i].m
10a20 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
10a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10a40 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
10a50 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
10a60 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
10a70 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
10a80 73 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e  s<real>%*s  %s\n
10a90 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
10aa0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
10ab0 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f  ax-lemonStrlen(o
10ac0 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22  p[i].label)-6),"
10ad0 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
10ae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
10af0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10b00 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
10b10 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
10b20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
10b30 65 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e  eam,"  -%s<strin
10b40 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  g>%*s  %s\n",op[
10b50 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
10b60 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
10b70 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
10b80 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b  label)-8),"",op[
10b90 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
10ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10bb0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  }.  }.}./*******
10bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bd0 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
10be0 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  parse.c" *******
10bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c00 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70  *****/./*.** Inp
10c10 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66  ut file parser f
10c20 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
10c30 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
10c40 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  /../* The state 
10c50 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
10c60 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a  .enum e_state {.
10c70 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20    INITIALIZE,.  
10c80 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10c90 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54  _OR_RULE,.  WAIT
10ca0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
10cb0 57 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f  WORD,.  WAITING_
10cc0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20  FOR_DECL_ARG,.  
10cd0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
10ce0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20  EDENCE_SYMBOL,. 
10cf0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
10d00 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20  OW,.  IN_RHS,.  
10d10 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c  LHS_ALIAS_1,.  L
10d20 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48  HS_ALIAS_2,.  LH
10d30 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53  S_ALIAS_3,.  RHS
10d40 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f  _ALIAS_1,.  RHS_
10d50 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45  ALIAS_2,.  PRECE
10d60 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20  DENCE_MARK_1,.  
10d70 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
10d80 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45  2,.  RESYNC_AFTE
10d90 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
10da0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
10db0 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49  L_ERROR,.  WAITI
10dc0 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
10dd0 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  R_SYMBOL,.  WAIT
10de0 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
10df0 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
10e00 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
10e10 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
10e20 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20  R_WILDCARD_ID,. 
10e30 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
10e40 53 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47  SS_ID,.  WAITING
10e50 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e  _FOR_CLASS_TOKEN
10e60 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
10e70 54 4f 4b 45 4e 5f 4e 41 4d 45 0a 7d 3b 0a 73 74  TOKEN_NAME.};.st
10e80 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20  ruct pstate {.  
10e90 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
10ea0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
10eb0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
10ec0 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69  */.  int tokenli
10ed0 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69  neno;      /* Li
10ee0 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  nenumber at whic
10ef0 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20  h current token 
10f00 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20  starts */.  int 
10f10 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
10f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
10f30 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a  rrors so far */.
10f40 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61    char *tokensta
10f50 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  rt;     /* Text 
10f60 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  of current token
10f70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   */.  struct lem
10f80 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47  on *gp;     /* G
10f90 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
10fa0 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73  or */.  enum e_s
10fb0 74 61 74 65 20 73 74 61 74 65 3b 20 20 20 20 20  tate state;     
10fc0 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
10fd0 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
10fe0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
10ff0 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a   *fallback;   /*
11000 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f   The fallback to
11010 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
11020 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b  symbol *tkclass;
11030 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61      /* Token cla
11040 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73  ss symbol */.  s
11050 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
11060 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  s;        /* Lef
11070 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t-hand side of c
11080 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20  urrent rule */. 
11090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
110a0 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41  alias;      /* A
110b0 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
110c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69   /* Number of ri
110f0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79  ght-hand side sy
11100 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20  mbols seen */.  
11110 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72  struct symbol *r
11120 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20  hs[MAXRHS];  /* 
11130 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
11140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69   const char *ali
11150 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41  as[MAXRHS]; /* A
11160 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20  liases for each 
11170 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e  RHS symbol (or N
11180 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74  ULL) */.  struct
11190 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b   rule *prevrule;
111a0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
111b0 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a   rule parsed */.
111c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
111d0 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20  clkeyword;   /* 
111e0 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63  Keyword of a dec
111f0 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  laration */.  ch
11200 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74  ar **declargslot
11210 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
11220 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
11230 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  n argument shoul
11240 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e  d be put */.  in
11250 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  t insertLineMacr
11260 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  o;       /* Add 
11270 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63  #line before dec
11280 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20  laration insert 
11290 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69  */.  int *declli
112a0 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20  nenoslot;       
112b0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
112c0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
112d0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65  ne number */.  e
112e0 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
112f0 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
11300 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
11310 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
11320 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
11330 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
11340 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
11350 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
11360 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
11370 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
11380 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
11390 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
113a0 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
113b0 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
113c0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
113d0 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
113e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
113f0 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
11400 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
11410 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
11420 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
11430 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
11440 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65  en(struct pstate
11450 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74   *psp).{.  const
11460 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
11470 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
11480 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
11490 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
114a0 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
114b0 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
114c0 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
114d0 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
114e0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
114f0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11500 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
11510 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
11520 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
11530 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
11540 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
11550 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
11560 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
11570 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
11580 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
11590 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
115a0 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
115b0 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
115c0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
115d0 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
115e0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
115f0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
11600 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
11610 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
11620 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11630 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11640 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
11650 65 6c 73 65 20 69 66 28 20 49 53 4c 4f 57 45 52  else if( ISLOWER
11660 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11670 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
11680 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
11690 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
116a0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
116b0 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
116c0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
116d0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
116e0 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
116f0 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
11700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11710 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
11720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11730 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11740 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11750 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
11760 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 75 70  no prior rule up
11770 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
11780 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
11790 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
117a0 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
117b0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
117c0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
117d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
117e0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
117f0 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
11800 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11810 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11820 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
11830 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
11840 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
11850 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
11860 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
11870 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
11880 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
11890 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
118a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
118b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
118c0 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
118d0 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
118e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
118f0 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
11900 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20 20 20 20  e = &x[1];.     
11910 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
11920 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a  le->noCode = 0;.
11930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11940 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
11950 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '[' ){.        p
11960 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
11970 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20  EDENCE_MARK_1;. 
11980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11990 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
119a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
119b0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
119c0 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22         "Token \"
119d0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65  %s\" should be e
119e0 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20  ither \"%%\" or 
119f0 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61  a nonterminal na
11a00 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  me.",.          
11a10 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11a20 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11a30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11a40 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
11a50 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20  DENCE_MARK_1:.  
11a60 20 20 20 20 69 66 28 20 21 49 53 55 50 50 45 52      if( !ISUPPER
11a70 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11a80 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11a90 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11aa0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11ab0 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64       "The preced
11ac0 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74  ence symbol must
11ad0 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22   be a terminal."
11ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11af0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11b00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
11b10 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
11b20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11b30 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11b40 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11b50 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72  .          "Ther
11b60 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
11b70 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65  le to assign pre
11b80 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22  cedence \"[%s]\"
11b90 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
11ba0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11bb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11bc0 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
11bd0 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20  recsym!=0 ){.   
11be0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11bf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11c00 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50  >tokenlineno,."P
11c10 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f  recedence mark o
11c20 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
11c30 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
11c40 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
11c50 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
11c60 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11c70 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
11c90 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
11ca0 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
11cb0 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
11cc0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11cd0 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
11ce0 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
11cf0 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
11d00 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20  NCE_MARK_2:.    
11d10 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20    if( x[0]!=']' 
11d20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
11d30 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11d40 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11d50 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
11d60 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20  issing \"]\" on 
11d70 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e  precedence mark.
11d80 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
11d90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11da0 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
11db0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11dc0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11dd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11de0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11df0 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20  FOR_ARROW:.     
11e00 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
11e10 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
11e20 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
11e30 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11e40 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
11e50 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
11e60 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  (' ){.        ps
11e70 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
11e80 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
11e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11ea0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11eb0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11ec0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11ed0 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65  "Expected to see
11ee0 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69   a \":\" followi
11ef0 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  ng the LHS symbo
11f00 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  l \"%s\".",.    
11f10 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
11f20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
11f30 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11f40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11f50 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11f60 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
11f70 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11f80 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
11f90 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
11fa0 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29  f( ISALPHA(x[0])
11fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11fc0 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20  >lhsalias = x;. 
11fd0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11fe0 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b  e = LHS_ALIAS_2;
11ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12000 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12010 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12020 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12030 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
12040 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
12050 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  alias for the LH
12060 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  S \"%s\"\n",.   
12070 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68         x,psp->lh
12080 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
12090 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
120a0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
120b0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
120c0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
120d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
120e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
120f0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
12100 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
12110 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12120 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
12130 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_3;.      }else
12140 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12150 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12160 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12170 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
12180 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
12190 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
121a0 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
121b0 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
121c0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
121d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
121e0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
121f0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
12200 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12220 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a  se LHS_ALIAS_3:.
12230 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12240 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
12250 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
12260 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12270 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
12280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12290 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
122a0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
122b0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
122c0 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
122d0 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a  "->\" following:
122e0 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20   \"%s(%s)\".",. 
122f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
12300 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68  hs->name,psp->lh
12310 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
12320 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12330 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12340 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12350 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
12370 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e  eak;.    case IN
12380 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20  _RHS:.      if( 
12390 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
123a0 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
123b0 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70   *rp;.        rp
123c0 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
123d0 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)calloc( sizeof
123e0 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 0a  (struct rule) +.
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
12400 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
12410 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
12420 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
12430 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
12440 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
12450 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
12460 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12470 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12480 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12490 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
124a0 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
124b0 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
124c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
124d0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
124e0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
124f0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ule = 0;.       
12500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12510 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
12520 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20     rp->ruleline 
12530 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
12540 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  no;.          rp
12550 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20  ->rhs = (struct 
12560 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b  symbol**)&rp[1];
12570 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
12580 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74  hsalias = (const
12590 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68   char**)&(rp->rh
125a0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20  s[psp->nrhs]);. 
125b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
125c0 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69  ; i<psp->nrhs; i
125d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
125e0 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73   rp->rhs[i] = ps
125f0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
12600 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
12610 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c  ias[i] = psp->al
12620 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ias[i];.        
12630 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
12640 6c 69 61 73 5b 69 5d 21 3d 30 20 29 7b 20 72 70  lias[i]!=0 ){ rp
12650 2d 3e 72 68 73 5b 69 5d 2d 3e 62 43 6f 6e 74 65  ->rhs[i]->bConte
12660 6e 74 20 3d 20 31 3b 20 7d 0a 20 20 20 20 20 20  nt = 1; }.      
12670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12680 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c  rp->lhs = psp->l
12690 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  hs;.          rp
126a0 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70  ->lhsalias = psp
126b0 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20  ->lhsalias;.    
126c0 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d        rp->nrhs =
126d0 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20   psp->nrhs;.    
126e0 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d        rp->code =
126f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   0;.          rp
12700 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20  ->noCode = 1;.  
12710 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
12720 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
12730 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
12740 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
12750 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
12760 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
12770 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
12780 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
12790 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
127a0 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
127b0 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
127c0 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
127d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
127e0 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
127f0 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
12800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
12810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
12820 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65  sp->lastrule->ne
12830 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  xt = rp;.       
12840 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
12850 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
12860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12870 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
12880 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
12890 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
128a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
128b0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
128c0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c    }else if( ISAL
128d0 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
128e0 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
128f0 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
12900 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12910 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12920 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12930 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
12940 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
12950 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65  n RHS of rule be
12960 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
12970 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
12980 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
12990 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
129a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
129b0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
129c0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
129d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
129e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
129f0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
12a00 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12a10 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
12a20 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
12a30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
12a40 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20 20 20  ->nrhs++;.      
12a50 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
12a60 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  if( (x[0]=='|' |
12a70 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
12a80 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
12a90 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12aa0 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
12ab0 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
12ac0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
12ad0 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
12ae0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
12af0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
12b00 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70  ol *origsp = msp
12b10 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20  ;.          msp 
12b20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
12b30 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a   *) calloc(1,siz
12b40 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20  eof(*msp));.    
12b50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70        memset(msp
12b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70  , 0, sizeof(*msp
12b70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
12b80 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  p->type = MULTIT
12b90 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
12ba0 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20     msp->nsubsym 
12bb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 1;.          m
12bc0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
12bd0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
12be0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
12bf0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
12c00 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
12c10 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
12c20 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
12c30 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
12c40 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
12c50 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
12c60 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
12c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c80 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
12c90 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
12ca0 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
12cb0 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
12cc0 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
12cd0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
12ce0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
12cf0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
12d00 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
12d10 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  sym[msp->nsubsym
12d20 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  -1] = Symbol_new
12d30 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (&x[1]);.       
12d40 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b 31   if( ISLOWER(x[1
12d50 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28 6d 73  ]) || ISLOWER(ms
12d60 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
12d70 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
12d80 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12d90 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
12da0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12db0 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
12dc0 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64   form a compound
12dd0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f   containing a no
12de0 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20  n-terminal");.  
12df0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12e00 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
12e10 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
12e20 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
12e30 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
12e40 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12e50 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
12e60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12e70 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12e80 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12e90 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12ea0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
12eb0 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
12ec0 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
12ed0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
12ee0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12ef0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12f00 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12f10 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
12f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
12f30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
12f40 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
12f50 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30   if( ISALPHA(x[0
12f60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
12f70 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
12f80 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
12f90 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12fa0 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
12fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12fc0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12fd0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12fe0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12ff0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
13000 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
13010 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
13020 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
13030 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
13040 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
13050 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
13060 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13070 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
13080 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13090 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
130b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
130c0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
130d0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
130e0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
130f0 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
13100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13110 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13120 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
13130 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
13140 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
13150 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
13160 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
13170 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
13180 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
13190 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
131a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
131b0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
131c0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
131d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
131e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
131f0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
13200 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
13210 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20  ( ISALPHA(x[0]) 
13220 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
13230 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
13240 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
13250 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
13260 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13270 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a  linenoslot = 0;.
13280 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13290 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
132a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
132b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
132c0 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
132d0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
132e0 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a  x,"name")==0 ){.
132f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13300 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
13310 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20  sp->gp->name);. 
13320 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
13330 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
13340 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
13350 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
13360 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
13370 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
13380 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
13390 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
133a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
133b0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
133c0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
133d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
133e0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
133f0 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20  ->extracode);.  
13400 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13410 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
13420 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
13430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13440 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13450 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
13460 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  est;.        }el
13470 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13480 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63  "default_destruc
13490 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
134a0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
134b0 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
134c0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20  p->vardest;.    
134d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
134e0 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
134f0 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
13500 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13510 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
13520 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
13530 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13540 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13560 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13570 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
13580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13590 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
135a0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
135b0 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ror);.        }e
135c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
135d0 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29  ,"parse_accept")
135e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
135f0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13600 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
13610 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20 20  ccept);.        
13620 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13630 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72  (x,"parse_failur
13640 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13650 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13660 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13670 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20  ->failure);.    
13680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13690 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76  rcmp(x,"stack_ov
136a0 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20  erflow")==0 ){. 
136b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
136c0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
136d0 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  p->gp->overflow)
136e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
136f0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78  if( strcmp(x,"ex
13700 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d  tra_argument")==
13710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13720 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13730 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67  = &(psp->gp->arg
13740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13750 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13760 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13770 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13780 78 2c 22 65 78 74 72 61 5f 63 6f 6e 74 65 78 74  x,"extra_context
13790 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
137a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
137b0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
137c0 3e 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  >ctx);.         
137d0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
137e0 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
137f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13800 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
13810 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13820 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13830 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13840 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
13850 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13860 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
13870 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13880 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
13890 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
138a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
138b0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
138c0 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
138d0 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
138e0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
138f0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13900 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13910 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
13920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13930 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13940 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
13950 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
13960 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
13970 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
13980 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13990 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
139a0 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
139b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
139c0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
139d0 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
139e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
139f0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13a10 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13a20 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
13a30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
13a40 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
13a50 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
13a60 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
13a70 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13a80 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13a90 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13aa0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13ab0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
13ac0 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
13ad0 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
13ae0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
13af0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
13b00 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
13b10 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13b20 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13b30 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13b40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13b50 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
13b60 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
13b70 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
13b80 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
13b90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13ba0 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
13bb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13bc0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13bd0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13be0 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13bf0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13c00 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
13c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13c20 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13c30 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
13c40 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
13c50 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13c60 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
13c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13c80 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13c90 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13ca0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13cb0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13cc0 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
13cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13ce0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
13cf0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13d00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13d10 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
13d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13d30 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
13d40 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
13d50 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13d60 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f  = WAITING_FOR_TO
13d70 4b 45 4e 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20  KEN_NAME;.      
13d80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13d90 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29  mp(x,"wildcard")
13da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13db0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13dc0 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
13dd0 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  RD_ID;.        }
13de0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13df0 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29  x,"token_class")
13e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13e10 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13e20 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
13e30 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
13e40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
13e50 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13e60 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
13e70 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13e80 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
13e90 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13ea0 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
13eb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13ec0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13ed0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13ee0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13f00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13f10 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13f20 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13f30 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13f40 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
13f50 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
13f60 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
13f70 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
13f80 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13f90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13fa0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13fb0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13fd0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
13fe0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
13ff0 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
14000 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b   if( !ISALPHA(x[
14010 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
14020 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
14030 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
14040 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14050 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
14060 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 64  issing after %%d
14070 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
14080 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
14090 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
140a0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
140b0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
140c0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
140d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
140e0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
140f0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
14100 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14110 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
14120 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
14130 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
14140 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73  llinenoslot = &s
14150 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20  p->destLineno;. 
14160 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
14170 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b  rtLineMacro = 1;
14180 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14190 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
141a0 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
141b0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
141c0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
141d0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
141e0 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
141f0 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
14200 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
14210 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14220 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
14230 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
14240 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
14250 6e 67 20 61 66 74 65 72 20 25 25 74 79 70 65 20  ng after %%type 
14260 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
14270 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14280 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
14290 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
142a0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
142b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
142c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
142d0 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
142e0 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 20 20 20  l_find(x);.     
142f0 20 20 20 69 66 28 28 73 70 29 20 26 26 20 28 73     if((sp) && (s
14300 70 2d 3e 64 61 74 61 74 79 70 65 29 29 7b 0a 20  p->datatype)){. 
14310 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
14320 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14330 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
14350 79 6d 62 6f 6c 20 25 25 74 79 70 65 20 5c 22 25  ymbol %%type \"%
14360 73 5c 22 20 61 6c 72 65 61 64 79 20 64 65 66 69  s\" already defi
14370 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ned", x);.      
14380 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14390 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
143a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
143b0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
143c0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
143d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
143e0 20 28 21 73 70 29 7b 0a 20 20 20 20 20 20 20 20   (!sp){.        
143f0 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
14400 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
14420 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
14430 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
14440 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
14450 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
14460 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
14470 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14480 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
14490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
144a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
144b0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
144c0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
144d0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
144e0 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
144f0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14500 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14510 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
14530 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  UPPER(x[0]) ){. 
14540 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
14550 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
14560 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
14570 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
14580 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
14590 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
145a0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
145b0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
145c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
145d0 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
145e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
145f0 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
14600 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
14610 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14630 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
14640 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
14650 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
14660 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
14670 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20  p->declassoc;.  
14680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
146a0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
146b0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
146c0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
146d0 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
146e0 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
146f0 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
14700 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14710 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14730 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
14740 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
14750 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78  ( x[0]=='{' || x
14760 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41  [0]=='\"' || ISA
14770 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LNUM(x[0]) ){.  
14780 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14790 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20   *zOld, *zNew;. 
147a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75         char *zBu
147b0 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  f, *z;.        i
147c0 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e  nt nOld, n, nLin
147d0 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61  e = 0, nNew, nBa
147e0 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
147f0 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
14800 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
14810 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
14820 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
14830 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
14840 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
14850 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
14860 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
14870 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
14880 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
14890 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
148a0 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
148b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
148c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
148d0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
148e0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
148f0 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
14900 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
14910 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
14920 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
14930 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
14940 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
14950 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
14960 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
14970 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
149a0 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
149b0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
149c0 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
149d0 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
149e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
149f0 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
14a00 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
14a10 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
14a20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
14a30 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
14a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14a50 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
14a60 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
14a70 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
14a80 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
14a90 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
14aa0 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
14ab0 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
14ac0 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
14ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
14ae0 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
14af0 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
14b00 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
14b10 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
14b20 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
14b30 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
14b40 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
14b50 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
14b60 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
14b70 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
14b80 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
14b90 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
14ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
14bb0 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
14bc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14bd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14be0 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
14bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
14c00 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
14c10 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14c20 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
14c30 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
14c40 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
14c50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
14c60 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
14c70 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
14c80 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
14c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ca0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14cb0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
14cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14cd0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
14ce0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14cf0 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
14d00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
14d10 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14d20 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
14d30 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
14d40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
14d50 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
14d60 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
14d70 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
14d80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14d90 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
14da0 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
14db0 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
14dc0 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
14dd0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14de0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14df0 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14e10 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14e20 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14e30 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14e40 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
14e50 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
14e60 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
14e70 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
14e80 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14e90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14ea0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14eb0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14ed0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
14ee0 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
14ef0 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
14f00 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14f10 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14f20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14f30 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14f40 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50   }else if( !ISUP
14f50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
14f60 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14f70 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14f80 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14f90 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
14fa0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
14fb0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14fc0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14fd0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14fe0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
14ff0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
15000 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
15010 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
15020 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
15030 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
15040 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
15050 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
15060 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
15070 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
15080 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
15090 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
150a0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
150b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
150c0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
150d0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
150e0 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
150f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
15100 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15120 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
15130 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
15140 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
15150 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
15160 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
15170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15180 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
15190 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
151a0 4e 5f 4e 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a  N_NAME:.      /*
151b0 20 54 6f 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68   Tokens do not h
151c0 61 76 65 20 74 6f 20 62 65 20 64 65 63 6c 61 72  ave to be declar
151d0 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
151e0 42 75 74 20 74 68 65 79 20 63 61 6e 20 62 65 0a  But they can be.
151f0 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
15200 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  r to control the
15210 69 72 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  ir assigned inte
15220 67 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ger number.  The
15230 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 20 20   number for.    
15240 20 20 2a 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20    ** each token 
15250 69 73 20 61 73 73 69 67 6e 65 64 20 77 68 65 6e  is assigned when
15260 20 69 74 20 69 73 20 66 69 72 73 74 20 73 65 65   it is first see
15270 6e 2e 20 20 53 6f 20 62 79 20 69 6e 63 6c 75 64  n.  So by includ
15280 69 6e 67 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ing.      **.   
15290 20 20 20 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e     **     %token
152a0 20 4f 4e 45 20 54 57 4f 20 54 48 52 45 45 0a 20   ONE TWO THREE. 
152b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
152c0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 67 72   early in the gr
152d0 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 61 74  ammar file, that
152e0 20 61 73 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63   assigns small c
152f0 6f 6e 73 65 63 75 74 69 76 65 20 76 61 6c 75 65  onsecutive value
15300 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 61  s.      ** to ea
15310 63 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73  ch of the tokens
15320 20 4f 4e 45 20 54 57 4f 20 61 6e 64 20 54 48 52   ONE TWO and THR
15330 45 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  EE..      */.   
15340 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
15350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
15360 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15370 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15380 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
15390 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
153a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
153b0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
153c0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
153d0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
153e0 20 22 25 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65   "%%token argume
153f0 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
15400 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
15410 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
15420 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
15430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15440 28 76 6f 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77  (void)Symbol_new
15450 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
15460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15470 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
15480 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
15490 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
154a0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
154b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
154c0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
154d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
154e0 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
15500 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
15510 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
15520 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
15530 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
15540 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
15550 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
15560 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15570 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15590 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
155a0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
155b0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
155c0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
155d0 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
155e0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
155f0 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
15600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15610 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
15620 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
15630 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
15640 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
15650 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
15660 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
15670 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
15680 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
15690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
156a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
156b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
156c0 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
156d0 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
156e0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
156f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
15700 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
15710 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
15720 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
15730 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
15740 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
15750 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
15760 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
15770 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
15780 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
15790 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
157a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
157b0 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
157c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
157d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
157e0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
157f0 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
15800 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
15810 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
15820 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
15830 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
15840 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
15850 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
15860 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
15870 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
15880 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
15890 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
158a0 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
158b0 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
158c0 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
158d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
158e0 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
158f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15900 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
15910 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
15920 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
15930 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
15940 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15950 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
15960 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
15970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
15980 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
15990 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
159a0 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
159b0 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
159c0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
159d0 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
159e0 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
159f0 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
15a00 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15a10 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
15a20 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
15a30 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
15a40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
15a50 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
15a60 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
15a70 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
15a80 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
15a90 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15aa0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
15ab0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
15ac0 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
15ad0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
15ae0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15af0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15b00 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
15b10 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
15b20 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
15b30 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
15b40 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
15b50 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15b60 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15b70 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
15b80 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
15b90 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15ba0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
15bb0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
15bc0 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
15bd0 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
15be0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15bf0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15c00 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
15c10 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
15c20 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
15c30 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
15c40 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
15c50 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
15c60 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
15c70 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
15c80 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
15c90 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15ca0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
15cb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15cc0 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
15cd0 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
15ce0 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
15cf0 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
15d00 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
15d10 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
15d20 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
15d30 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
15d40 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
15d50 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
15d60 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
15d70 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
15d80 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
15d90 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
15da0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
15db0 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
15dc0 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
15dd0 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
15de0 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
15df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15e00 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
15e10 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
15e20 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
15e30 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
15e40 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
15e50 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
15e60 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
15e70 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15e80 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
15e90 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
15ea0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15eb0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
15ec0 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
15ed0 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
15ee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15ef0 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
15f00 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
15f10 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
15f20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15f30 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
15f40 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
15f50 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
15f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15f70 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
15f80 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
15f90 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
15fa0 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
15fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15fc0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
15fd0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
15fe0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
15ff0 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
16000 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
16010 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
16020 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
16030 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
16040 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
16050 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
16060 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
16070 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
16080 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
16090 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
160a0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
160b0 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
160c0 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
160d0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
160e0 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
160f0 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
16100 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
16110 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
16120 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
16130 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
16140 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
16150 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
16160 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
16170 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
16180 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
16190 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
161a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
161b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
161c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161d0 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
161e0 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
161f0 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
16200 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
16210 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
16220 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
16230 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
16240 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
16250 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
16260 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
16270 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
16280 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
16290 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
162a0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
162b0 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
162c0 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
162d0 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
162e0 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
162f0 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
16300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
16310 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
16320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16330 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
16340 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
16350 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
16360 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
16370 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
16380 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
16390 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
163a0 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
163b0 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
163c0 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
163d0 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
163e0 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
163f0 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
16400 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
16410 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
16420 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
16430 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
16440 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
16450 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
16460 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
16470 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
16480 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
16490 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
164a0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
164b0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
164c0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
164d0 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
164e0 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
164f0 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
16500 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
16510 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
16520 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
16530 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
16540 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
16550 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
16560 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
16570 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
16580 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
165a0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
165b0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
165c0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
165d0 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
165e0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
165f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
16600 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
16610 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
16620 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
16630 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
16640 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
16650 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
16660 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
16670 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
16680 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
16690 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
166a0 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
166b0 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
166c0 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20  free(filebuf);. 
166d0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
166e0 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  +;.    fclose(fp
166f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16700 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66   }.  if( fread(f
16710 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a  ilebuf,1,filesiz
16720 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20  e,fp)!=filesize 
16730 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
16740 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
16750 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c  an't read in all
16760 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69   %d bytes of thi
16770 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
16780 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66  filesize);.    f
16790 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20  ree(filebuf);.  
167a0 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
167b0 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
167c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
167d0 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
167e0 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69    filebuf[filesi
167f0 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  ze] = 0;..  /* M
16800 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70  ake an initial p
16810 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
16820 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25  file to handle %
16830 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65  ifdef and %ifnde
16840 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73  f */.  preproces
16850 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29  s_input(filebuf)
16860 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e  ;..  /* Now scan
16870 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
16880 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
16890 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66   lineno = 1;.  f
168a0 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28  or(cp=filebuf; (
168b0 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20  c= *cp)!=0; ){. 
168c0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
168d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20   lineno++;      
168e0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20          /* Keep 
168f0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
16900 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
16910 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29  if( ISSPACE(c) )
16920 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65  { cp++; continue
16930 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c  ; }  /* Skip all
16940 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
16950 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
16960 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
16970 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
16980 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
16990 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
169a0 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
169b0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
169c0 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
169d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
169e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
169f0 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16a00 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  *' ){          /
16a10 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63  * Skip C style c
16a20 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16a30 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
16a40 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
16a50 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63   && (c!='/' || c
16a60 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20  p[-1]!='*') ){. 
16a70 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
16a80 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
16a90 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
16aa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
16ab0 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
16ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
16ad0 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74     ps.tokenstart
16ae0 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20   = cp;          
16af0 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
16b00 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
16b10 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
16b20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d  ps.tokenlineno =
16b30 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
16b40 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
16b50 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20   on which token 
16b60 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66  begins */.    if
16b70 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  ( c=='\"' ){    
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72   /* String liter
16ba0 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  als */.      cp+
16bb0 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
16bc0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
16bd0 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  !='\"' ){.      
16be0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16bf0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16c00 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
16c10 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
16c20 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
16c30 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73  sg(ps.filename,s
16c40 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e  tartline,."Strin
16c50 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  g starting on th
16c60 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
16c70 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
16c80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16c90 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
16ca0 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
16cb0 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
16cc0 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
16cd0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
16ce0 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
16cf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
16d00 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20  =='{' ){        
16d10 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63         /* A bloc
16d20 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20  k of C code */. 
16d30 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a       int level;.
16d40 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
16d50 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28    for(level=1; (
16d60 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c  c= *cp)!=0 && (l
16d70 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27  evel>1 || c!='}'
16d80 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
16d90 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16da0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16db0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b    else if( c=='{
16dc0 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20  ' ) level++;.   
16dd0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16de0 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a  ='}' ) level--;.
16df0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
16e00 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16e10 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='*' ){  /* Ski
16e20 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  p comments */.  
16e30 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76          int prev
16e40 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  c;.          cp 
16e50 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
16e60 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
16e70 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16e80 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
16e90 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21  c!='/' || prevc!
16ea0 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
16eb0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
16ec0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
16ed0 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
16ee0 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   c;.            
16ef0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
16f00 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
16f10 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
16f20 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
16f30 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
16f40 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
16f50 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
16f60 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
16f70 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
16f80 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
16f90 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
16fa0 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
16fb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
16fc0 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
16fd0 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
16fe0 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
16ff0 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
17000 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
17010 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
17020 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
17030 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
17040 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
17050 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
17060 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
17070 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
17080 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
17090 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
170a0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
170b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
170c0 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
170d0 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
170e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
170f0 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
17100 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
17110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17120 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17130 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
17140 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
17150 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65  filename,ps.toke
17160 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65  nlineno,."C code
17170 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
17180 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
17190 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
171a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
171b0 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
171c0 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
171d0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
171e0 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
171f0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
17200 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
17210 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
17220 41 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20  ALNUM(c) ){     
17230 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69       /* Identifi
17240 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ers */.      whi
17250 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
17260 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
17270 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
17280 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17290 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
172a0 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b  f( c==':' && cp[
172b0 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d  1]==':' && cp[2]
172c0 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20  =='=' ){ /* The 
172d0 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a  operator "::=" *
172e0 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b  /.      cp += 3;
172f0 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
17300 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
17310 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d  ( (c=='/' || c==
17320 27 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28  '|') && ISALPHA(
17330 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  cp[1]) ){.      
17340 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77  cp += 2;.      w
17350 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21  hile( (c = *cp)!
17360 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63  =0 && (ISALNUM(c
17370 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
17380 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
17390 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
173a0 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
173b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
173c0 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
173d0 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
173e0 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
173f0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17400 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
17410 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
17420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17440 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
17450 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
17460 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
17470 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
17480 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
17490 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28  n */.    *cp = (
174a0 63 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20  char)c;         
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
174c0 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
174d0 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
174e0 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
174f0 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
17500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17510 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
17520 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
17530 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
17540 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
17550 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
17560 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
17590 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
175a0 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
175b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
175c0 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
175d0 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
175e0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
175f0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
17600 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
17610 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
17620 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
17630 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
17640 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
17650 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
17660 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
17670 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
17680 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20  void){.  struct 
17690 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a  plink *newlink;.
176a0 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
176b0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
176c0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
176d0 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
176e0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
176f0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63  struct plink *)c
17700 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
17710 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
17720 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
17730 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
17740 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
17750 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
17760 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17770 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
17780 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
17790 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
177a0 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
177b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
177c0 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
177d0 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
177e0 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
177f0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
17800 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
17810 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
17820 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
17830 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  link = plink_fre
17840 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
17850 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
17860 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
17870 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b    return newlink
17880 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
17890 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
178a0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
178b0 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69  k_add(struct pli
178c0 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63  nk **plpp, struc
178d0 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
178e0 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
178f0 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c  *newlink;.  newl
17900 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28  ink = Plink_new(
17910 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65  );.  newlink->ne
17920 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70  xt = *plpp;.  *p
17930 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20  lpp = newlink;. 
17940 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20   newlink->cfp = 
17950 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73  cfp;.}../* Trans
17960 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  fer every plink 
17970 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f  on the list "fro
17980 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22  m" to the list "
17990 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  to" */.void Plin
179a0 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c  k_copy(struct pl
179b0 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74  ink **to, struct
179c0 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a   plink *from).{.
179d0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
179e0 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
179f0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
17a00 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
17a10 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
17a20 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
17a30 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
17a40 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
17a50 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
17a60 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
17a70 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
17a80 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20  k_delete(struct 
17a90 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20  plink *plp).{.  
17aa0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
17ab0 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
17ac0 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
17ad0 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
17ae0 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
17af0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
17b00 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
17b10 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
17b20 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
17b30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
17b50 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
17b60 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
17b80 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
17b90 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
17ba0 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
17bb0 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
17bc0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
17bd0 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
17be0 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
17bf0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
17c00 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
17c10 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
17c20 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
17c30 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
17c40 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
17c50 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
17c60 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
17c70 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73  *file_makename(s
17c80 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17c90 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  p, const char *s
17ca0 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20  uffix).{.  char 
17cb0 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  *name;.  char *c
17cc0 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e  p;.  char *filen
17cd0 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 66 69 6c 65  ame = lemp->file
17ce0 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 73 7a 3b 0a  name;.  int sz;.
17cf0 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72  .  if( outputDir
17d00 20 29 7b 0a 20 20 20 20 63 70 20 3d 20 73 74 72   ){.    cp = str
17d10 72 63 68 72 28 66 69 6c 65 6e 61 6d 65 2c 20 27  rchr(filename, '
17d20 2f 27 29 3b 0a 20 20 20 20 69 66 28 20 63 70 20  /');.    if( cp 
17d30 29 20 66 69 6c 65 6e 61 6d 65 20 3d 20 63 70 20  ) filename = cp 
17d40 2b 20 31 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  + 1;.  }.  sz = 
17d50 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 66 69 6c 65  lemonStrlen(file
17d60 6e 61 6d 65 29 3b 0a 20 20 73 7a 20 2b 3d 20 6c  name);.  sz += l
17d70 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69  emonStrlen(suffi
17d80 78 29 3b 0a 20 20 69 66 28 20 6f 75 74 70 75 74  x);.  if( output
17d90 44 69 72 20 29 20 73 7a 20 2b 3d 20 6c 65 6d 6f  Dir ) sz += lemo
17da0 6e 53 74 72 6c 65 6e 28 6f 75 74 70 75 74 44 69  nStrlen(outputDi
17db0 72 29 20 2b 20 31 3b 0a 20 20 73 7a 20 2b 3d 20  r) + 1;.  sz += 
17dc0 35 3b 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61  5;.  name = (cha
17dd0 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b  r*)malloc( sz );
17de0 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29  .  if( name==0 )
17df0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
17e00 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  derr,"Can't allo
17e10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
17e20 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a   filename.\n");.
17e30 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
17e40 0a 20 20 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  .  name[0] = 0;.
17e50 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72 20    if( outputDir 
17e60 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  ){.    lemon_str
17e70 63 70 79 28 6e 61 6d 65 2c 20 6f 75 74 70 75 74  cpy(name, output
17e80 44 69 72 29 3b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  Dir);.    lemon_
17e90 73 74 72 63 61 74 28 6e 61 6d 65 2c 20 22 2f 22  strcat(name, "/"
17ea0 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
17eb0 74 72 63 61 74 28 6e 61 6d 65 2c 66 69 6c 65 6e  trcat(name,filen
17ec0 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72  ame);.  cp = str
17ed0 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a  rchr(name,'.');.
17ee0 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d    if( cp ) *cp =
17ef0 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63   0;.  lemon_strc
17f00 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b  at(name,suffix);
17f10 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a  .  return name;.
17f20 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
17f30 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61  e with a name ba
17f40 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20  sed on the name 
17f50 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
17f60 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61  e,.** but with a
17f70 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63   different (spec
17f80 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61  ified) suffix, a
17f90 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
17fa0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ter.** to the st
17fb0 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20  ream */.PRIVATE 
17fc0 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28  FILE *file_open(
17fd0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
17fe0 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63  *lemp,.  const c
17ff0 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63  har *suffix,.  c
18000 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a  onst char *mode.
18010 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  ){.  FILE *fp;..
18020 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
18030 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
18040 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
18050 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
18060 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
18070 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
18080 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
18090 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
180a0 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
180b0 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
180c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
180d0 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
180e0 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
180f0 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
18100 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
18110 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18120 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
18130 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 74 65 78  /* Print the tex
18140 74 20 6f 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76  t of a rule.*/.v
18150 6f 69 64 20 72 75 6c 65 5f 70 72 69 6e 74 28 46  oid rule_print(F
18160 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
18170 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e   rule *rp){.  in
18180 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74  t i, j;.  fprint
18190 66 28 6f 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e  f(out, "%s",rp->
181a0 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a  lhs->name);.  /*
181b0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
181c0 6c 69 61 73 20 29 20 66 70 72 69 6e 74 66 28 6f  lias ) fprintf(o
181d0 75 74 2c 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  ut,"(%s)",rp->lh
181e0 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70  salias); */.  fp
181f0 72 69 6e 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22  rintf(out," ::="
18200 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18210 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
18220 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
18230 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
18240 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
18250 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
18260 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
18270 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
18280 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
18290 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
182a0 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73  j=1; j<sp->nsubs
182b0 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
182c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c    fprintf(out,"|
182d0 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
182e0 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
182f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
18300 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18310 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
18320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
18330 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
18340 69 5d 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  i] ) fprintf(out
18350 2c 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ,"(%s)",rp->rhsa
18360 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d  lias[i]); */.  }
18370 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65  .}../* Duplicate
18380 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
18390 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73  without comments
183a0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74   and without act
183b0 69 6f 6e 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73  ions.** on rules
183c0 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74   */.void Reprint
183d0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
183e0 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
183f0 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
18400 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
18410 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65   int i, j, maxle
18420 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73  n, len, ncolumns
18430 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66  , skip;.  printf
18440 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20  ("// Reprint of 
18450 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c  input file \"%s\
18460 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c  ".\n// Symbols:\
18470 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  n",lemp->filenam
18480 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31  e);.  maxlen = 1
18490 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
184a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
184b0 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  ++){.    sp = le
184c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
184d0 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
184e0 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
184f0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
18500 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
18510 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
18520 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
18530 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
18540 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
18550 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
18560 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
18570 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
18580 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
18590 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
185a0 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
185b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
185c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
185d0 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
185e0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
185f0 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
18600 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
18610 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
18620 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
18630 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
18640 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
18650 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
18660 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
18670 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
18680 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
18690 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 73 74 64    rule_print(std
186a0 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 70 72  out, rp);.    pr
186b0 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69  intf(".");.    i
186c0 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
186d0 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c   printf(" [%s]",
186e0 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d  rp->precsym->nam
186f0 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72  e);.    /* if( r
18700 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66  p->code ) printf
18710 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e  ("\n    %s",rp->
18720 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72  code); */.    pr
18730 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
18740 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69  }../* Print a si
18750 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f  ngle rule..*/.vo
18760 69 64 20 52 75 6c 65 50 72 69 6e 74 28 46 49 4c  id RulePrint(FIL
18770 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 72 75  E *fp, struct ru
18780 6c 65 20 2a 72 70 2c 20 69 6e 74 20 69 43 75 72  le *rp, int iCur
18790 73 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73  sor){.  struct s
187a0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
187b0 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66   i, j;.  fprintf
187c0 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d  (fp,"%s ::=",rp-
187d0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
187e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e  or(i=0; i<=rp->n
187f0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
18800 66 28 20 69 3d 3d 69 43 75 72 73 6f 72 20 29 20  f( i==iCursor ) 
18810 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29  fprintf(fp," *")
18820 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d  ;.    if( i==rp-
18830 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20  >nrhs ) break;. 
18840 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
18850 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
18860 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
18870 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
18880 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73  intf(fp," %s", s
18890 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
188a0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  me);.      for(j
188b0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
188c0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
188d0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73   fprintf(fp,"|%s
188e0 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ",sp->subsym[j]-
188f0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
18900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18910 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
18920 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
18930 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72    }.  }.}../* Pr
18940 69 6e 74 20 74 68 65 20 72 75 6c 65 20 66 6f 72  int the rule for
18950 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
18960 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  ..*/.void Config
18970 50 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20  Print(FILE *fp, 
18980 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
18990 66 70 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74  fp){.  RulePrint
189a0 28 66 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66  (fp, cfp->rp, cf
189b0 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23  p->dot);.}../* #
189c0 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23  define TEST */.#
189d0 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20  if 0./* Print a 
189e0 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  set */.PRIVATE v
189f0 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74  oid SetPrint(out
18a00 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20  ,set,lemp).FILE 
18a10 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b  *out;.char *set;
18a20 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
18a30 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
18a40 20 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a    char *spacer;.
18a50 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20    spacer = "";. 
18a60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
18a70 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28  2s[","");.  for(
18a80 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=0; i<lemp->nte
18a90 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
18aa0 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65    if( SetFind(se
18ab0 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70  t,i) ){.      fp
18ac0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22  rintf(out,"%s%s"
18ad0 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79  ,spacer,lemp->sy
18ae0 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b  mbols[i]->name);
18af0 0a 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20  .      spacer = 
18b00 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  " ";.    }.  }. 
18b10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c   fprintf(out,"]\
18b20 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  n");.}../* Print
18b30 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a   a plink chain *
18b40 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50  /.PRIVATE void P
18b50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c  linkPrint(out,pl
18b60 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74  p,tag).FILE *out
18b70 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  ;.struct plink *
18b80 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a  plp;.char *tag;.
18b90 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29  {.  while( plp )
18ba0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
18bb0 74 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65  t,"%12s%s (state
18bc0 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70   %2d) ","",tag,p
18bd0 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74  lp->cfp->stp->st
18be0 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e  atenum);.    Con
18bf0 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  figPrint(out,plp
18c00 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69  ->cfp);.    fpri
18c10 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  ntf(out,"\n");. 
18c20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65     plp = plp->ne
18c30 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  xt;.  }.}.#endif
18c40 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63  ../* Print an ac
18c50 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65  tion to the give
18c60 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
18c70 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
18c80 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77   if.** nothing w
18c90 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e  as actually prin
18ca0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e  ted..*/.int Prin
18cb0 74 41 63 74 69 6f 6e 28 0a 20 20 73 74 72 75 63  tAction(.  struc
18cc0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20  t action *ap,   
18cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 63         /* The ac
18ce0 74 69 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f  tion to print */
18cf0 0a 20 20 46 49 4c 45 20 2a 66 70 2c 20 20 20 20  .  FILE *fp,    
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d10 2a 20 50 72 69 6e 74 20 74 68 65 20 61 63 74 69  * Print the acti
18d20 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  on here */.  int
18d30 20 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20   indent         
18d40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18d50 6e 74 20 62 79 20 74 68 69 73 20 61 6d 6f 75 6e  nt by this amoun
18d60 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
18d70 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74  sult = 1;.  swit
18d80 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
18d90 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
18da0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
18db0 74 61 74 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e  tate *stp = ap->
18dc0 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 66 70 72  x.stp;.      fpr
18dd0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
18de0 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 22 2c  ft        %-7d",
18df0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
18e00 61 6d 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  ame,stp->statenu
18e10 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
18e20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18e30 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20  REDUCE: {.      
18e40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20  struct rule *rp 
18e50 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
18e60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18e70 73 20 72 65 64 75 63 65 20 20 20 20 20 20 20 25  s reduce       %
18e80 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
18e90 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75  sp->name,rp->iRu
18ea0 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50  le);.      RuleP
18eb0 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29  rint(fp, rp, -1)
18ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18ed0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 48     }.    case SH
18ee0 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20  IFTREDUCE: {.   
18ef0 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
18f00 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
18f10 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18f20 22 25 2a 73 20 73 68 69 66 74 2d 72 65 64 75 63  "%*s shift-reduc
18f30 65 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61  e %-7d",indent,a
18f40 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  p->sp->name,rp->
18f50 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75  iRule);.      Ru
18f60 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20  lePrint(fp, rp, 
18f70 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
18f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18f90 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66   ACCEPT:.      f
18fa0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61  printf(fp,"%*s a
18fb0 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70  ccept",indent,ap
18fc0 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
18fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18fe0 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  se ERROR:.      
18ff0 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
19000 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70  error",indent,ap
19010 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
19020 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19030 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se SRCONFLICT:. 
19040 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49     case RRCONFLI
19050 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  CT:.      fprint
19060 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65  f(fp,"%*s reduce
19070 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50         %-7d ** P
19080 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  arsing conflict 
19090 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64  **",.        ind
190a0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
190b0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65  ,ap->x.rp->iRule
190c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
190d0 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c      case SSCONFL
190e0 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ICT:.      fprin
190f0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
19100 20 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20          %-7d ** 
19110 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
19120 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
19130 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
19140 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  e,ap->x.stp->sta
19150 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
19160 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48  eak;.    case SH
19170 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20  _RESOLVED:.     
19180 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65   if( showPrecede
19190 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  nceConflict ){. 
191a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
191b0 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20 20  p,"%*s shift    
191c0 20 20 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70      %-7d -- drop
191d0 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ped by precedenc
191e0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
191f0 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
19200 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74  p->name,ap->x.st
19210 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
19220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19230 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20     result = 0;. 
19240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19250 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 44 5f  ak;.    case RD_
19260 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20  RESOLVED:.      
19270 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e  if( showPreceden
19280 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  ceConflict ){.  
19290 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
192a0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 37  ,"%*s reduce %-7
192b0 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20  d -- dropped by 
192c0 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20  precedence",.   
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
192e0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
192f0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65  ,ap->x.rp->iRule
19300 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19310 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
19320 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19340 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20  e NOT_USED:.    
19350 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20    result = 0;.  
19360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
19370 20 69 66 28 20 72 65 73 75 6c 74 20 26 26 20 61   if( result && a
19380 70 2d 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20 20  p->spOpt ){.    
19390 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a  fprintf(fp,"  /*
193a0 20 62 65 63 61 75 73 65 20 25 73 3d 3d 25 73 20   because %s==%s 
193b0 2a 2f 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d  */", ap->sp->nam
193c0 65 2c 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61  e, ap->spOpt->na
193d0 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
193e0 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20  n result;.}../* 
193f0 47 65 6e 65 72 61 74 65 20 74 68 65 20 22 2a 2e  Generate the "*.
19400 6f 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  out" log file */
19410 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
19420 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ut(struct lemon 
19430 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
19440 2c 20 6e 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , n;.  struct st
19450 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
19460 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
19470 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
19480 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *ap;.  struct ru
19490 6c 65 20 2a 72 70 3b 0a 20 20 46 49 4c 45 20 2a  le *rp;.  FILE *
194a0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
194b0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
194c0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66  ","wb");.  if( f
194d0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
194e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
194f0 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b  ->nxstate; i++){
19500 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
19510 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
19520 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74  fprintf(fp,"Stat
19530 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74  e %d:\n",stp->st
19540 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28  atenum);.    if(
19550 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
19560 20 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a   ) cfp=stp->bp;.
19570 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
19580 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74            cfp=st
19590 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c  p->cfp;.    whil
195a0 65 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20  e( cfp ){.      
195b0 63 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20  char buf[20];.  
195c0 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
195d0 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  ==cfp->rp->nrhs 
195e0 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e  ){.        lemon
195f0 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25  _sprintf(buf,"(%
19600 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75  d)",cfp->rp->iRu
19610 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  le);.        fpr
19620 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73  intf(fp,"    %5s
19630 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d   ",buf);.      }
19640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70  else{.        fp
19650 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20  rintf(fp,"      
19660 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a      ");.      }.
19670 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e        ConfigPrin
19680 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  t(fp,cfp);.     
19690 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
196a0 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53  );.#if 0.      S
196b0 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  etPrint(fp,cfp->
196c0 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20  fws,lemp);.     
196d0 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
196e0 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29  fp->fplp,"To  ")
196f0 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
19700 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c  nt(fp,cfp->bplp,
19710 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a  "From");.#endif.
19720 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e        if( lemp->
19730 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
19740 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65  cfp->bp;.      e
19750 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
19760 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65       cfp=cfp->ne
19770 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  xt;.    }.    fp
19780 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
19790 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
197a0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
197b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
197c0 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66  PrintAction(ap,f
197d0 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28  p,30) ) fprintf(
197e0 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  fp,"\n");.    }.
197f0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
19800 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69  \n");.  }.  fpri
19810 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d  ntf(fp, "-------
19820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
19850 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  );.  fprintf(fp,
19860 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a   "Symbols:\n");.
19870 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54    fprintf(fp, "T
19880 68 65 20 66 69 72 73 74 2d 73 65 74 20 6f 66 20  he first-set of 
19890 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 69 73  non-terminals is
198a0 20 73 68 6f 77 6e 20 61 66 74 65 72 20 74 68 65   shown after the
198b0 20 6e 61 6d 65 2e 5c 6e 5c 6e 22 29 3b 0a 20 20   name.\n\n");.  
198c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
198d0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
198e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73      int j;.    s
198f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19900 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  ;..    sp = lemp
19910 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
19920 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20    fprintf(fp, " 
19930 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73 70   %3d: %s", i, sp
19940 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
19950 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
19960 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
19970 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22 29  fprintf(fp, ":")
19980 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
19990 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20 20  lambda ){.      
199a0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20    fprintf(fp, " 
199b0 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20  <lambda>");.    
199c0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
199d0 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; j<lemp->nterm
199e0 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  inal; j++){.    
199f0 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72 73      if( sp->firs
19a00 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64 28  tset && SetFind(
19a10 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a 29  sp->firstset, j)
19a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
19a30 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22 2c  rintf(fp, " %s",
19a40 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
19a50 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
19a60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19a70 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72  }.    if( sp->pr
19a80 65 63 3e 3d 30 20 29 20 66 70 72 69 6e 74 66 28  ec>=0 ) fprintf(
19a90 66 70 2c 22 20 28 70 72 65 63 65 64 65 6e 63 65  fp," (precedence
19aa0 3d 25 64 29 22 2c 20 73 70 2d 3e 70 72 65 63 29  =%d)", sp->prec)
19ab0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
19ac0 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  , "\n");.  }.  f
19ad0 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d  printf(fp, "----
19ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b10 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
19b20 66 70 2c 20 22 53 79 6e 74 61 78 2d 6f 6e 6c 79  fp, "Syntax-only
19b30 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20   Symbols:\n");. 
19b40 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54 68   fprintf(fp, "Th
19b50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 6d 62  e following symb
19b60 6f 6c 73 20 6e 65 76 65 72 20 63 61 72 72 79 20  ols never carry 
19b70 73 65 6d 61 6e 74 69 63 20 63 6f 6e 74 65 6e 74  semantic content
19b80 2e 5c 6e 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  .\n\n");.  for(i
19b90 3d 6e 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  =n=0; i<lemp->ns
19ba0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
19bb0 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74 72 75   int w;.    stru
19bc0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
19bd0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19be0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 62 43  ;.    if( sp->bC
19bf0 6f 6e 74 65 6e 74 20 29 20 63 6f 6e 74 69 6e 75  ontent ) continu
19c00 65 3b 0a 20 20 20 20 77 20 3d 20 28 69 6e 74 29  e;.    w = (int)
19c10 73 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  strlen(sp->name)
19c20 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
19c30 20 6e 2b 77 3e 37 35 20 29 7b 0a 20 20 20 20 20   n+w>75 ){.     
19c40 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
19c50 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a  );.      n = 0;.
19c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
19c70 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
19c80 74 66 28 66 70 2c 20 22 20 22 29 3b 0a 20 20 20  tf(fp, " ");.   
19c90 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
19ca0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25    fprintf(fp, "%
19cb0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
19cc0 20 20 20 6e 20 2b 3d 20 77 3b 0a 20 20 7d 0a 20     n += w;.  }. 
19cd0 20 69 66 28 20 6e 3e 30 20 29 20 66 70 72 69 6e   if( n>0 ) fprin
19ce0 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20  tf(fp, "\n");.  
19cf0 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d  fprintf(fp, "---
19d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d30 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66  -\n");.  fprintf
19d40 28 66 70 2c 20 22 52 75 6c 65 73 3a 5c 6e 22 29  (fp, "Rules:\n")
19d50 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
19d60 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
19d70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72  ->next){.    fpr
19d80 69 6e 74 66 28 66 70 2c 20 22 25 34 64 3a 20 22  intf(fp, "%4d: "
19d90 2c 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20  , rp->iRule);.  
19da0 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 66 70 2c    rule_print(fp,
19db0 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
19dc0 66 28 66 70 2c 22 2e 22 29 3b 0a 20 20 20 20 69  f(fp,".");.    i
19dd0 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
19de0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
19df0 66 70 2c 22 20 5b 25 73 20 70 72 65 63 65 64 65  fp," [%s precede
19e00 6e 63 65 3d 25 64 5d 22 2c 0a 20 20 20 20 20 20  nce=%d]",.      
19e10 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
19e20 73 79 6d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 70  sym->name, rp->p
19e30 72 65 63 73 79 6d 2d 3e 70 72 65 63 29 3b 0a 20  recsym->prec);. 
19e40 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
19e50 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
19e60 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72   fclose(fp);.  r
19e70 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61  eturn;.}../* Sea
19e80 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rch for the file
19e90 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73   "name" which is
19ea0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
19eb0 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
19ec0 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50   exacutable */.P
19ed0 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74  RIVATE char *pat
19ee0 68 73 65 61 72 63 68 28 63 68 61 72 20 2a 61 72  hsearch(char *ar
19ef0 67 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c  gv0, char *name,
19f00 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b   int modemask).{
19f10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
19f20 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  athlist;.  char 
19f30 2a 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63  *pathbufptr;.  c
19f40 68 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20  har *pathbuf;.  
19f50 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a  char *path,*cp;.
19f60 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65    char c;..#ifde
19f70 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70  f __WIN32__.  cp
19f80 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30   = strrchr(argv0
19f90 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20  ,'\\');.#else.  
19fa0 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
19fb0 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a  v0,'/');.#endif.
19fc0 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
19fd0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
19fe0 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d   = 0;.    path =
19ff0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
1a000 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67   lemonStrlen(arg
1a010 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  v0) + lemonStrle
1a020 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20  n(name) + 2 );. 
1a030 20 20 20 69 66 28 20 70 61 74 68 20 29 20 6c 65     if( path ) le
1a040 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68  mon_sprintf(path
1a050 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e  ,"%s/%s",argv0,n
1a060 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20  ame);.    *cp = 
1a070 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
1a080 70 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e  pathlist = geten
1a090 76 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69  v("PATH");.    i
1a0a0 66 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29  f( pathlist==0 )
1a0b0 20 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f   pathlist = ".:/
1a0c0 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
1a0d0 20 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68     pathbuf = (ch
1a0e0 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
1a0f0 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69  monStrlen(pathli
1a100 73 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70  st) + 1 );.    p
1a110 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
1a120 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
1a130 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f  n(pathlist)+lemo
1a140 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20  nStrlen(name)+2 
1a150 29 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68  );.    if( (path
1a160 62 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61  buf != 0) && (pa
1a170 74 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  th!=0) ){.      
1a180 70 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74  pathbufptr = pat
1a190 68 62 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f  hbuf;.      lemo
1a1a0 6e 5f 73 74 72 63 70 79 28 70 61 74 68 62 75 66  n_strcpy(pathbuf
1a1b0 2c 20 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20  , pathlist);.   
1a1c0 20 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62     while( *pathb
1a1d0 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  uf ){.        cp
1a1e0 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 62 75   = strchr(pathbu
1a1f0 66 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20  f,':');.        
1a200 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
1a210 20 26 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53   &pathbuf[lemonS
1a220 74 72 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b  trlen(pathbuf)];
1a230 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70  .        c = *cp
1a240 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20  ;.        *cp = 
1a250 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e  0;.        lemon
1a260 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25  _sprintf(path,"%
1a270 73 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61  s/%s",pathbuf,na
1a280 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70  me);.        *cp
1a290 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66   = c;.        if
1a2a0 28 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66  ( c==0 ) pathbuf
1a2b0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
1a2c0 20 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20   else pathbuf = 
1a2d0 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[1];.        
1a2e0 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c  if( access(path,
1a2f0 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62  modemask)==0 ) b
1a300 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a310 20 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66      free(pathbuf
1a320 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ptr);.    }.  }.
1a330 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d    return path;.}
1a340 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63  ../* Given an ac
1a350 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68  tion, compute th
1a360 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
1a370 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a  for that action.
1a380 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62  ** which is to b
1a390 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74  e put in the act
1a3a0 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
1a3b0 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69   generated machi
1a3c0 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65  ne..** Return ne
1a3d0 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74  gative if no act
1a3e0 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65  ion should be ge
1a3f0 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56  nerated..*/.PRIV
1a400 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f  ATE int compute_
1a410 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65  action(struct le
1a420 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63  mon *lemp, struc
1a430 74 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a  t action *ap).{.
1a440 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69    int act;.  swi
1a450 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b  tch( ap->type ){
1a460 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a  .    case SHIFT:
1a470 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74    act = ap->x.st
1a480 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  p->statenum;    
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a4b0 61 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a  ase SHIFTREDUCE:
1a4c0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 63   {.      /* Sinc
1a4d0 65 20 61 20 53 48 49 46 54 20 69 73 20 69 6e 68  e a SHIFT is inh
1a4e0 65 72 69 65 6e 74 20 61 66 74 65 72 20 61 20 70  erient after a p
1a4f0 72 69 6f 72 20 52 45 44 55 43 45 2c 20 63 6f 6e  rior REDUCE, con
1a500 76 65 72 74 20 61 6e 79 0a 20 20 20 20 20 20 2a  vert any.      *
1a510 2a 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63  * SHIFTREDUCE ac
1a520 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 6f 6e 74  tion with a nont
1a530 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68 65 20 4c  erminal on the L
1a540 48 53 20 69 6e 74 6f 20 61 20 73 69 6d 70 6c 65  HS into a simple
1a550 0a 20 20 20 20 20 20 2a 2a 20 52 45 44 55 43 45  .      ** REDUCE
1a560 20 61 63 74 69 6f 6e 3a 20 2a 2f 0a 20 20 20 20   action: */.    
1a570 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1a580 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  dex>=lemp->nterm
1a590 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
1a5a0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52  act = lemp->minR
1a5b0 65 64 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70  educe + ap->x.rp
1a5c0 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d  ->iRule;.      }
1a5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 63  else{.        ac
1a5e0 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69  t = lemp->minShi
1a5f0 66 74 52 65 64 75 63 65 20 2b 20 61 70 2d 3e 78  ftReduce + ap->x
1a600 2e 72 70 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20  .rp->iRule;.    
1a610 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1a620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a630 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 6c 65  REDUCE: act = le
1a640 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20  mp->minReduce + 
1a650 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b  ap->x.rp->iRule;
1a660 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a670 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
1a680 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 65 72    act = lemp->er
1a690 72 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rAction;        
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a6c0 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20  ase ACCEPT: act 
1a6d0 3d 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f  = lemp->accActio
1a6e0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1a700 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1a710 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20  :     act = -1; 
1a720 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1a730 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66  urn act;.}..#def
1a740 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30  ine LINESIZE 100
1a750 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c  0./* The next cl
1a760 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65  uster of routine
1a770 73 20 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e  s are for readin
1a780 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  g the template f
1a790 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69  ile.** and writi
1a7a0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ng the results t
1a7b0 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  o the generated 
1a7c0 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65  parser */./* The
1a7d0 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   first function 
1a7e0 74 72 61 6e 73 66 65 72 73 20 64 61 74 61 20 66  transfers data f
1a7f0 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74  rom "in" to "out
1a800 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e  " until.** a lin
1a810 65 20 69 73 20 73 65 65 6e 20 77 68 69 63 68 20  e is seen which 
1a820 62 65 67 69 6e 73 20 77 69 74 68 20 22 25 25 22  begins with "%%"
1a830 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62  .  The line numb
1a840 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64  er is.** tracked
1a850 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21  ..**.** if name!
1a860 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72  =0, then any wor
1a870 64 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  d that begin wit
1a880 68 20 22 50 61 72 73 65 22 20 69 73 20 63 68 61  h "Parse" is cha
1a890 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e  nged to.** begin
1a8a0 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74   with *name inst
1a8b0 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ead..*/.PRIVATE 
1a8c0 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28 63  void tplt_xfer(c
1a8d0 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20  har *name, FILE 
1a8e0 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20  *in, FILE *out, 
1a8f0 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20  int *lineno).{. 
1a900 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
1a910 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
1a920 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20  SIZE];.  while( 
1a930 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
1a940 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65  IZE,in) && (line
1a950 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65  [0]!='%' || line
1a960 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20  [1]!='%') ){.   
1a970 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1a980 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20    iStart = 0;.  
1a990 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20    if( name ){.  
1a9a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e      for(i=0; lin
1a9b0 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e[i]; i++){.    
1a9c0 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d      if( line[i]=
1a9d0 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='P' && strncmp(
1a9e0 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22  &line[i],"Parse"
1a9f0 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,5)==0.         
1aa00 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53   && (i==0 || !IS
1aa10 41 4c 50 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29  ALPHA(line[i-1])
1aa20 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1aa30 20 20 20 20 20 20 20 69 66 28 20 69 3e 69 53 74         if( i>iSt
1aa40 61 72 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75  art ) fprintf(ou
1aa50 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72  t,"%.*s",i-iStar
1aa60 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  t,&line[iStart])
1aa70 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
1aa80 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d  ntf(out,"%s",nam
1aa90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
1aaa0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
1aab0 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
1aac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1aad0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1aae0 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65  f(out,"%s",&line
1aaf0 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d  [iStart]);.  }.}
1ab00 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75  ../* The next fu
1ab10 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1ab20 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61   template file a
1ab30 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74  nd opens it, ret
1ab40 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e  urning.** a poin
1ab50 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  ter to the opene
1ab60 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41  d file. */.PRIVA
1ab70 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70  TE FILE *tplt_op
1ab80 65 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  en(struct lemon 
1ab90 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69  *lemp).{.  stati
1aba0 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
1abb0 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
1abc0 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
1abd0 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
1abe0 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
1abf0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
1ac00 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 65  .  /* first, see
1ac10 20 69 66 20 75 73 65 72 20 73 70 65 63 69 66 69   if user specifi
1ac20 65 64 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69  ed a template fi
1ac30 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f  lename on the co
1ac40 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20  mmand line. */. 
1ac50 20 69 66 20 28 75 73 65 72 5f 74 65 6d 70 6c 61   if (user_templa
1ac60 74 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20  tename != 0) {. 
1ac70 20 20 20 69 66 28 20 61 63 63 65 73 73 28 75 73     if( access(us
1ac80 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
1ac90 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  004)==-1 ){.    
1aca0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1acb0 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
1acc0 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
1acd0 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
1ace0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s\".\n",.       
1acf0 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
1ad00 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
1ad10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1ad20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ad30 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65   }.    in = fope
1ad40 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e  n(user_templaten
1ad50 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20 20 69  ame,"rb");.    i
1ad60 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1ad70 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1ad80 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
1ad90 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
1ada0 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20  "%s\".\n",.     
1adb0 20 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65           user_te
1adc0 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
1add0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1ade0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
1adf0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
1ae00 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20  eturn in;.  }.. 
1ae10 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65   cp = strrchr(le
1ae20 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27  mp->filename,'.'
1ae30 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  );.  if( cp ){. 
1ae40 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
1ae50 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
1ae60 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69  int)(cp-lemp->fi
1ae70 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69  lename),lemp->fi
1ae80 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
1ae90 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
1aea0 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
1aeb0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1aec0 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
1aed0 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
1aee0 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
1aef0 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
1af00 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
1af10 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
1af20 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
1af30 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
1af40 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
1af50 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
1af60 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
1af70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
1af80 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
1af90 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1afa0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
1afb0 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
1afc0 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
1afd0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
1afe0 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
1aff0 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
1b000 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
1b010 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
1b020 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
1b030 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
1b040 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
1b050 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
1b060 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
1b070 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
1b080 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
1b090 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
1b0a0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
1b0b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1b0c0 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
1b0d0 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
1b0e0 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
1b0f0 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
1b100 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
1b110 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
1b120 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
1b130 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
1b140 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
1b150 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
1b160 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
1b170 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
1b180 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
1b190 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
1b1a0 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
1b1b0 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
1b1c0 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
1b1d0 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
1b1e0 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
1b1f0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
1b200 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
1b210 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
1b220 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
1b230 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
1b240 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
1b250 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
1b260 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
1b270 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
1b280 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
1b290 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
1b2a0 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
1b2b0 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
1b2c0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
1b2d0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1b2e0 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
1b2f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
1b300 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
1b310 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
1b320 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
1b330 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
1b340 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
1b350 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
1b360 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
1b370 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1b380 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 7d  p->outname);.  }
1b390 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
1b3a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1b3b0 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20  g routine emits 
1b3c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73  code for the des
1b3d0 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a  tructor for the.
1b3e0 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a  ** symbol sp.*/.
1b3f0 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75  void emit_destru
1b400 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c  ctor_code(.  FIL
1b410 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74  E *out,.  struct
1b420 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73   symbol *sp,.  s
1b430 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1b440 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  p,.  int *lineno
1b450 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20  .){. char *cp = 
1b460 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70  0;.. if( sp->typ
1b470 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
1b480 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b    cp = lemp->tok
1b490 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63  endest;.   if( c
1b4a0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1b4b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
1b4c0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1b4d0 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70  +;. }else if( sp
1b4e0 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  ->destructor ){.
1b4f0 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74     cp = sp->dest
1b500 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e  ructor;.   fprin
1b510 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
1b520 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69  *lineno)++;.   i
1b530 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1b540 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1b550 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1b560 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1b570 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e  ut,sp->destLinen
1b580 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  o,lemp->filename
1b590 29 3b 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69  );.   }. }else i
1b5a0 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
1b5b0 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
1b5c0 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66  ->vardest;.   if
1b5d0 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
1b5e0 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
1b5f0 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"{\n"); (*linen
1b600 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20  o)++;. }else{.  
1b610 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
1b620 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
1b630 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70  */. }. for(; *cp
1b640 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20  ; cp++){.   if( 
1b650 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31  *cp=='$' && cp[1
1b660 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66  ]=='$' ){.     f
1b670 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70  printf(out,"(yyp
1b680 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70  minor->yy%d)",sp
1b690 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63  ->dtnum);.     c
1b6a0 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e  p++;.     contin
1b6b0 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20  ue;.   }.   if( 
1b6c0 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1b6d0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74  neno)++;.   fput
1b6e0 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
1b6f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
1b700 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
1b710 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
1b720 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20  nenosflag) {.   
1b730 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c  (*lineno)++; tpl
1b740 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c  t_linedir(out,*l
1b750 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
1b760 61 6d 65 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74  ame);. }. fprint
1b770 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
1b780 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75  lineno)++;. retu
1b790 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
1b7a0 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
1b7b0 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
1b7c0 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
1b7d0 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
1b7e0 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1b7f0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1b800 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p, struct lemon 
1b810 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72  *lemp).{.  int r
1b820 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
1b830 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
1b840 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
1b850 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
1b860 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
1b870 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
1b880 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1b890 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
1b8a0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
1b8b0 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
1b8c0 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
1b8d0 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
1b8e0 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
1b8f0 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
1b900 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
1b910 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
1b920 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
1b930 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
1b940 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
1b950 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
1b960 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
1b970 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
1b980 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
1b990 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
1b9a0 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
1b9b0 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
1b9c0 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
1b9d0 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
1b9e0 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
1b9f0 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
1ba00 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
1ba10 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
1ba20 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
1ba30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ba40 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
1ba50 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
1ba60 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
1ba70 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
1ba80 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
1ba90 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
1baa0 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
1bab0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
1bac0 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
1bad0 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
1bae0 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b  atic char empty[
1baf0 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74  1] = { 0 };.  st
1bb00 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
1bb10 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
1bb20 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
1bb30 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
1bb40 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
1bb50 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69  ar zInt[40];.  i
1bb60 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
1bb70 20 20 20 69 66 28 20 75 73 65 64 3d 3d 30 20 26     if( used==0 &
1bb80 26 20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20  & z!=0 ) z[0] = 
1bb90 30 3b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  0;.    used = 0;
1bba0 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
1bbb0 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
1bbc0 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
1bbd0 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
1bbe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
1bbf0 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
1bc00 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
1bc10 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
1bc20 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
1bc30 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
1bc40 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
1bc50 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
1bc60 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
1bc70 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
1bc80 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
1bc90 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
1bca0 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
1bcb0 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1bcc0 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
1bcd0 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
1bce0 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
1bcf0 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
1bd00 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
1bd10 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c  =='d' ){.      l
1bd20 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e  emon_sprintf(zIn
1bd30 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
1bd40 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
1bd50 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
1bd60 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
1bd70 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
1bd80 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
1bd90 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
1bda0 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
1bdb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bdc0 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68   z[used++] = (ch
1bdd0 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ar)c;.    }.  }.
1bde0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
1bdf0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1be00 0a 2a 2a 20 57 72 69 74 65 20 61 6e 64 20 74 72  .** Write and tr
1be10 61 6e 73 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e  ansform the rp->
1be20 63 6f 64 65 20 73 74 72 69 6e 67 20 73 6f 20 74  code string so t
1be30 68 61 74 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  hat symbols are 
1be40 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70  expanded..** Pop
1be50 75 6c 61 74 65 20 74 68 65 20 72 70 2d 3e 63 6f  ulate the rp->co
1be60 64 65 50 72 65 66 69 78 20 61 6e 64 20 72 70 2d  dePrefix and rp-
1be70 3e 63 6f 64 65 53 75 66 66 69 78 20 73 74 72 69  >codeSuffix stri
1be80 6e 67 73 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ngs, as appropri
1be90 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
1bea0 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 61 6e  n 1 if the expan
1beb0 64 65 64 20 63 6f 64 65 20 72 65 71 75 69 72 65  ded code require
1bec0 73 20 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e  s that "yylhsmin
1bed0 6f 72 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  or" local variab
1bee0 6c 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69  le.** to be defi
1bef0 6e 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ned..*/.PRIVATE 
1bf00 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  int translate_co
1bf10 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
1bf20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
1bf30 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
1bf40 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
1bf50 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  i;.  int rc = 0;
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bf70 72 75 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f  rue if yylhsmino
1bf80 72 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69  r is used */.  i
1bf90 6e 74 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d  nt dontUseRhs0 =
1bfa0 20 30 3b 20 20 20 2f 2a 20 49 66 20 74 72 75 65   0;   /* If true
1bfb0 2c 20 75 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f  , use of left-mo
1bfc0 73 74 20 52 48 53 20 6c 61 62 65 6c 20 69 73 20  st RHS label is 
1bfd0 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e  illegal */.  con
1bfe0 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d  st char *zSkip =
1bff0 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72   0; /* The zOvwr
1c000 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e  t comment within
1c010 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55   rp->code, or NU
1c020 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  LL */.  char lhs
1c030 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 2f  used = 0;      /
1c040 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48  * True if the LH
1c050 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65  S element has be
1c060 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  en used */.  cha
1c070 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20 20 20  r lhsdirect;    
1c080 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4c      /* True if L
1c090 48 53 20 77 72 69 74 65 73 20 64 69 72 65 63 74  HS writes direct
1c0a0 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f  ly into stack */
1c0b0 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  .  char used[MAX
1c0c0 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75  RHS];     /* Tru
1c0d0 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
1c0e0 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
1c0f0 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a  used */.  char z
1c100 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20 20 20  Lhs[50];        
1c110 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
1c120 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20  LHS symbol into 
1c130 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  this string */. 
1c140 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39 30 30   char zOvwrt[900
1c150 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65  ];      /* Comme
1c160 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77  nt that to allow
1c170 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72 69 74   LHS to overwrit
1c180 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28  e RHS */..  for(
1c190 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1c1a0 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20   i++) used[i] = 
1c1b0 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30  0;.  lhsused = 0
1c1c0 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  ;..  if( rp->cod
1c1d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
1c1e0 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73  ic char newlines
1c1f0 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20  tr[2] = { '\n', 
1c200 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e  '\0' };.    rp->
1c210 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74  code = newlinest
1c220 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20  r;.    rp->line 
1c230 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a  = rp->ruleline;.
1c240 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1c250 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1c260 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1c270 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d  .  }...  if( rp-
1c280 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20  >nrhs==0 ){.    
1c290 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1c2a0 6e 6f 20 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20  no RHS symbols, 
1c2b0 74 68 65 6e 20 77 72 69 74 69 6e 67 20 64 69 72  then writing dir
1c2c0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 4c 48 53  ectly to the LHS
1c2d0 20 69 73 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68   is ok */.    lh
1c2e0 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d  sdirect = 1;.  }
1c2f0 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
1c300 61 6c 69 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20  alias[0]==0 ){. 
1c310 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d     /* The left-m
1c320 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 68  ost RHS symbol h
1c330 61 73 20 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48  as no value.  LH
1c340 53 20 64 69 72 65 63 74 20 69 73 20 6f 6b 2e 20  S direct is ok. 
1c350 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 65 20 68   But.    ** we h
1c360 61 76 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ave to call the 
1c370 64 69 73 74 72 75 63 74 6f 72 20 6f 6e 20 74 68  distructor on th
1c380 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 66 69 72  e RHS symbol fir
1c390 73 74 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69  st. */.    lhsdi
1c3a0 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  rect = 1;.    if
1c3b0 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
1c3c0 28 72 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70  (rp->rhs[0],lemp
1c3d0 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ) ){.      appen
1c3e0 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1c3f0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c400 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1c410 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1c420 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1c430 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1c440 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1c450 73 5b 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70  s[0]->index,1-rp
1c460 2d 3e 6e 72 68 73 29 3b 0a 20 20 20 20 20 20 72  ->nrhs);.      r
1c470 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 3d 20  p->codePrefix = 
1c480 53 74 72 73 61 66 65 28 61 70 70 65 6e 64 5f 73  Strsafe(append_s
1c490 74 72 28 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20  tr(0,0,0,0));.  
1c4a0 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1c4b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1c4c0 65 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69  e if( rp->lhsali
1c4d0 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  as==0 ){.    /* 
1c4e0 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48 53 20  There is no LHS 
1c4f0 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f  value symbol. */
1c500 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1c510 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1c520 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c  strcmp(rp->lhsal
1c530 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ias,rp->rhsalias
1c540 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  [0])==0 ){.    /
1c550 2a 20 54 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  * The LHS symbol
1c560 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f   and the left-mo
1c570 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 61 72  st RHS symbol ar
1c580 65 20 74 68 65 20 73 61 6d 65 2c 20 73 6f 0a 20  e the same, so. 
1c590 20 20 20 2a 2a 20 64 69 72 65 63 74 20 77 72 69     ** direct wri
1c5a0 74 69 6e 67 20 69 73 20 61 6c 6c 6f 77 65 64 20  ting is allowed 
1c5b0 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74  */.    lhsdirect
1c5c0 20 3d 20 31 3b 0a 20 20 20 20 6c 68 73 75 73 65   = 1;.    lhsuse
1c5d0 64 20 3d 20 31 3b 0a 20 20 20 20 75 73 65 64 5b  d = 1;.    used[
1c5e0 30 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  0] = 1;.    if( 
1c5f0 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21 3d  rp->lhs->dtnum!=
1c600 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e 75  rp->rhs[0]->dtnu
1c610 6d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72  m ){.      Error
1c620 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1c630 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1c640 0a 20 20 20 20 20 20 20 20 22 25 73 28 25 73 29  .        "%s(%s)
1c650 20 61 6e 64 20 25 73 28 25 73 29 20 73 68 61 72   and %s(%s) shar
1c660 65 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c  e the same label
1c670 20 62 75 74 20 68 61 76 65 20 22 0a 20 20 20 20   but have ".    
1c680 20 20 20 20 22 64 69 66 66 65 72 65 6e 74 20 64      "different d
1c690 61 74 61 74 79 70 65 73 2e 22 2c 0a 20 20 20 20  atatypes.",.    
1c6a0 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d      rp->lhs->nam
1c6b0 65 2c 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c  e, rp->lhsalias,
1c6c0 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61 6d   rp->rhs[0]->nam
1c6d0 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  e, rp->rhsalias[
1c6e0 30 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  0]);.      lemp-
1c6f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1c700 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c710 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f  lemon_sprintf(zO
1c720 76 77 72 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72  vwrt, "/*%s-over
1c730 77 72 69 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20  writes-%s*/",.  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70  rp->lhsalias, rp
1c760 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a  ->rhsalias[0]);.
1c770 20 20 20 20 7a 53 6b 69 70 20 3d 20 73 74 72 73      zSkip = strs
1c780 74 72 28 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76  tr(rp->code, zOv
1c790 77 72 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  wrt);.    if( zS
1c7a0 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  kip!=0 ){.      
1c7b0 2f 2a 20 54 68 65 20 63 6f 64 65 20 63 6f 6e 74  /* The code cont
1c7c0 61 69 6e 73 20 61 20 73 70 65 63 69 61 6c 20 63  ains a special c
1c7d0 6f 6d 6d 65 6e 74 20 74 68 61 74 20 69 6e 64 69  omment that indi
1c7e0 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69 73  cates that it is
1c7f0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 66   safe.      ** f
1c800 6f 72 20 74 68 65 20 4c 48 53 20 6c 61 62 65 6c  or the LHS label
1c810 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 6c 65   to overwrite le
1c820 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61 62 65  ft-most RHS labe
1c830 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64  l. */.      lhsd
1c840 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d  irect = 1;.    }
1c850 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 68 73 64  else{.      lhsd
1c860 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d  irect = 0;.    }
1c870 0a 20 20 7d 0a 20 20 69 66 28 20 6c 68 73 64 69  .  }.  if( lhsdi
1c880 72 65 63 74 20 29 7b 0a 20 20 20 20 73 70 72 69  rect ){.    spri
1c890 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70  ntf(zLhs, "yymsp
1c8a0 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22  [%d].minor.yy%d"
1c8b0 2c 31 2d 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e  ,1-rp->nrhs,rp->
1c8c0 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d  lhs->dtnum);.  }
1c8d0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1c8e0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  ;.    sprintf(zL
1c8f0 68 73 2c 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e  hs, "yylhsminor.
1c900 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64  yy%d",rp->lhs->d
1c910 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70  tnum);.  }..  ap
1c920 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1c930 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1c940 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e  nst cast is wron
1c950 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20  g but harmless, 
1c960 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75 6c  if we're careful
1c970 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63  . */.  for(cp=(c
1c980 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20  har *)rp->code; 
1c990 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
1c9a0 69 66 28 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b  if( cp==zSkip ){
1c9b0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74  .      append_st
1c9c0 72 28 7a 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b  r(zOvwrt,0,0,0);
1c9d0 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d  .      cp += lem
1c9e0 6f 6e 53 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29  onStrlen(zOvwrt)
1c9f0 2d 31 3b 0a 20 20 20 20 20 20 64 6f 6e 74 55 73  -1;.      dontUs
1ca00 65 52 68 73 30 20 3d 20 31 3b 0a 20 20 20 20 20  eRhs0 = 1;.     
1ca10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1ca20 0a 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41  .    if( ISALPHA
1ca30 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70  (*cp) && (cp==rp
1ca40 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c  ->code || (!ISAL
1ca50 4e 55 4d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63  NUM(cp[-1]) && c
1ca60 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a  p[-1]!='_')) ){.
1ca70 20 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64        char saved
1ca80 3b 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20  ;.      for(xp= 
1ca90 26 63 70 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28  &cp[1]; ISALNUM(
1caa0 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27  *xp) || *xp=='_'
1cab0 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73  ; xp++);.      s
1cac0 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20  aved = *xp;.    
1cad0 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20    *xp = 0;.     
1cae0 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
1caf0 73 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  s && strcmp(cp,r
1cb00 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20  p->lhsalias)==0 
1cb10 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
1cb20 64 5f 73 74 72 28 7a 4c 68 73 2c 30 2c 30 2c 30  d_str(zLhs,0,0,0
1cb30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  );.        cp = 
1cb40 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75  xp;.        lhsu
1cb50 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  sed = 1;.      }
1cb60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
1cb70 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
1cb80 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
1cb90 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
1cba0 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  ias[i] && strcmp
1cbb0 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  (cp,rp->rhsalias
1cbc0 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1cbd0 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
1cbe0 26 26 20 64 6f 6e 74 55 73 65 52 68 73 30 20 29  && dontUseRhs0 )
1cbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cc00 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
1cc10 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
1cc20 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  line,.          
1cc30 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
1cc40 20 75 73 65 64 20 61 66 74 65 72 20 27 25 73 27   used after '%s'
1cc50 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
1cc60 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
1cc70 73 5b 30 5d 2c 20 7a 4f 76 77 72 74 29 3b 0a 20  s[0], zOvwrt);. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d               lem
1cc90 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1cca0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1ccb0 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
1ccc0 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
1ccd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cce0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
1ccf0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
1cd00 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
1cd10 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
1cd20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
1cd30 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
1cd40 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
1cd50 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
1cd60 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1cd70 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
1cd80 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
1cd90 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
1cda0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cdb0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
1cdc0 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
1cdd0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
1cde0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ce00 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
1ce10 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1ce30 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
1ce40 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
1ce50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1ce70 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
1ce80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ce90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1cea0 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
1ceb0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
1cec0 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
1ced0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
1cee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cef0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
1cf00 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
1cf10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1cf20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cf30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1cf40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
1cf50 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
1cf60 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
1cf70 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
1cf80 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
1cf90 0a 20 20 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20  .  /* Main code 
1cfa0 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c  generation compl
1cfb0 65 74 65 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61  eted */.  cp = a
1cfc0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1cfd0 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20  0);.  if( cp && 
1cfe0 63 70 5b 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65  cp[0] ) rp->code
1cff0 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a   = Strsafe(cp);.
1d000 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1d010 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ,0,0);..  /* Che
1d020 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1d030 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e  the LHS has been
1d040 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72   used */.  if( r
1d050 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
1d060 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45  lhsused ){.    E
1d070 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
1d080 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
1d090 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65  ine,.      "Labe
1d0a0 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
1d0b0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
1d0c0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
1d0d0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70   rp->lhsalias,rp
1d0e0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  ->lhs->name,rp->
1d0f0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c  lhsalias);.    l
1d100 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1d110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1d120 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  ate destructor c
1d130 6f 64 65 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f  ode for RHS mino
1d140 72 20 76 61 6c 75 65 73 20 77 68 69 63 68 20 61  r values which a
1d150 72 65 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  re not reference
1d160 64 2e 0a 20 20 2a 2a 20 47 65 6e 65 72 61 74 65  d..  ** Generate
1d170 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1d180 66 6f 72 20 75 6e 75 73 65 64 20 6c 61 62 65 6c  for unused label
1d190 73 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  s and duplicate 
1d1a0 6c 61 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  labels..  */.  f
1d1b0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
1d1c0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  hs; i++){.    if
1d1d0 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1d1e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ] ){.      if( i
1d1f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
1d200 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t j;.        if(
1d210 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
1d220 20 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61   strcmp(rp->lhsa
1d230 6c 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61  lias,rp->rhsalia
1d240 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
1d250 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1d260 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1d270 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1d280 20 20 20 20 20 20 20 20 22 25 73 28 25 73 29 20          "%s(%s) 
1d290 68 61 73 20 74 68 65 20 73 61 6d 65 20 6c 61 62  has the same lab
1d2a0 65 6c 20 61 73 20 74 68 65 20 4c 48 53 20 62 75  el as the LHS bu
1d2b0 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
1d2c0 74 2d 6d 6f 73 74 20 22 0a 20 20 20 20 20 20 20  t-most ".       
1d2d0 20 20 20 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20       "symbol on 
1d2e0 74 68 65 20 52 48 53 2e 22 2c 0a 20 20 20 20 20  the RHS.",.     
1d2f0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
1d300 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73  ]->name, rp->rhs
1d310 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
1d320 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1d330 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1d340 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1d350 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
1d360 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
1d370 6c 69 61 73 5b 6a 5d 20 26 26 20 73 74 72 63 6d  lias[j] && strcm
1d380 70 28 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a  p(rp->rhsalias[j
1d390 5d 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ],rp->rhsalias[i
1d3a0 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1d3b0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1d3c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1d3d0 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1d3e0 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20           "Label 
1d3f0 25 73 20 75 73 65 64 20 66 6f 72 20 6d 75 6c 74  %s used for mult
1d400 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20  iple symbols on 
1d410 74 68 65 20 52 48 53 20 6f 66 20 61 20 72 75 6c  the RHS of a rul
1d420 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e.",.           
1d430 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
1d440 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
1d450 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1d460 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  +;.            b
1d470 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1d480 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1d490 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 75    }.      if( !u
1d4a0 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  sed[i] ){.      
1d4b0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1d4c0 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1d4d0 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1d4e0 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20    "Label %s for 
1d4f0 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
1d500 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
1d510 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
1d520 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d  as[i],rp->rhs[i]
1d530 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c  ->name,rp->rhsal
1d540 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ias[i]);.       
1d550 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1d560 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1d570 65 6c 73 65 20 69 66 28 20 69 3e 30 20 26 26 20  else if( i>0 && 
1d580 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72  has_destructor(r
1d590 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20  p->rhs[i],lemp) 
1d5a0 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f  ){.      append_
1d5b0 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
1d5c0 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
1d5d0 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
1d5e0 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
1d5f0 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
1d600 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68  >index,i-rp->nrh
1d610 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  s+1);.    }.  }.
1d620 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20  .  /* If unable 
1d630 74 6f 20 77 72 69 74 65 20 4c 48 53 20 76 61 6c  to write LHS val
1d640 75 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  ues directly int
1d650 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 77 72 69  o the stack, wri
1d660 74 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 76 65  te the.  ** save
1d670 64 20 4c 48 53 20 76 61 6c 75 65 20 6e 6f 77 2e  d LHS value now.
1d680 20 2a 2f 0a 20 20 69 66 28 20 6c 68 73 64 69 72   */.  if( lhsdir
1d690 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70  ect==0 ){.    ap
1d6a0 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 6d 73  pend_str("  yyms
1d6b0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
1d6c0 20 3d 20 22 2c 20 30 2c 20 31 2d 72 70 2d 3e 6e   = ", 0, 1-rp->n
1d6d0 72 68 73 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64 74  rhs, rp->lhs->dt
1d6e0 6e 75 6d 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  num);.    append
1d6f0 5f 73 74 72 28 7a 4c 68 73 2c 20 30 2c 20 30 2c  _str(zLhs, 0, 0,
1d700 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f   0);.    append_
1d710 73 74 72 28 22 3b 5c 6e 22 2c 20 30 2c 20 30 2c  str(";\n", 0, 0,
1d720 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   0);.  }..  /* S
1d730 75 66 66 69 78 20 63 6f 64 65 20 67 65 6e 65 72  uffix code gener
1d740 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 2a  ation complete *
1d750 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64 5f  /.  cp = append_
1d760 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  str(0,0,0,0);.  
1d770 69 66 28 20 63 70 20 26 26 20 63 70 5b 30 5d 20  if( cp && cp[0] 
1d780 29 7b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 53  ){.    rp->codeS
1d790 75 66 66 69 78 20 3d 20 53 74 72 73 61 66 65 28  uffix = Strsafe(
1d7a0 63 70 29 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43  cp);.    rp->noC
1d7b0 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ode = 0;.  }..  
1d7c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d7d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d7e0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1d7f0 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22   when the rule "
1d800 72 70 22 20 69 73 20 72 65 64 75 63 65 64 2e 20  rp" is reduced. 
1d810 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f   Write.** the co
1d820 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61  de to "out".  Ma
1d830 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73  ke sure lineno s
1d840 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e  tays up-to-date.
1d850 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
1d860 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46 49   emit_code(.  FI
1d870 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63  LE *out,.  struc
1d880 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74  t rule *rp,.  st
1d890 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1d8a0 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a  ,.  int *lineno.
1d8b0 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ){. const char *
1d8c0 63 70 3b 0a 0a 20 2f 2a 20 53 65 74 75 70 20 63  cp;.. /* Setup c
1d8d0 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ode prior to the
1d8e0 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65   #line directive
1d8f0 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
1d900 65 50 72 65 66 69 78 20 26 26 20 72 70 2d 3e 63  ePrefix && rp->c
1d910 6f 64 65 50 72 65 66 69 78 5b 30 5d 20 29 7b 0a  odePrefix[0] ){.
1d920 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d930 22 7b 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 50  "{%s", rp->codeP
1d940 72 65 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63  refix);.   for(c
1d950 70 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  p=rp->codePrefix
1d960 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66  ; *cp; cp++){ if
1d970 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
1d980 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a  lineno)++; }. }.
1d990 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  . /* Generate co
1d9a0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64  de to do the red
1d9b0 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69  uce action */. i
1d9c0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20  f( rp->code ){. 
1d9d0 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c    if( !lemp->nol
1d9e0 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20  inenosflag ){.  
1d9f0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
1da00 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69       tplt_linedi
1da10 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c  r(out,rp->line,l
1da20 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
1da30 20 20 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28     }.   fprintf(
1da40 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f  out,"{%s",rp->co
1da50 64 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  de);.   for(cp=r
1da60 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70  p->code; *cp; cp
1da70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c  ++){ if( *cp=='\
1da80 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
1da90 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  ; }.   fprintf(o
1daa0 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"}\n"); (*lin
1dab0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21  eno)++;.   if( !
1dac0 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
1dad0 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69  lag ){.     (*li
1dae0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70  neno)++;.     tp
1daf0 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
1db00 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74  lineno,lemp->out
1db10 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a 0a  name);.   }. }..
1db20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 62 72 65   /* Generate bre
1db30 61 6b 64 6f 77 6e 20 63 6f 64 65 20 74 68 61 74  akdown code that
1db40 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
1db50 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76  e #line directiv
1db60 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f  e */. if( rp->co
1db70 64 65 53 75 66 66 69 78 20 26 26 20 72 70 2d 3e  deSuffix && rp->
1db80 63 6f 64 65 53 75 66 66 69 78 5b 30 5d 20 29 7b  codeSuffix[0] ){
1db90 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1dba0 20 22 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 53   "%s", rp->codeS
1dbb0 75 66 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63  uffix);.   for(c
1dbc0 70 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  p=rp->codeSuffix
1dbd0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66  ; *cp; cp++){ if
1dbe0 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
1dbf0 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a  lineno)++; }. }.
1dc00 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72  . if( rp->codePr
1dc10 65 66 69 78 20 29 7b 0a 20 20 20 66 70 72 69 6e  efix ){.   fprin
1dc20 74 66 28 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b 20  tf(out, "}\n"); 
1dc30 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a  (*lineno)++;. }.
1dc40 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
1dc50 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65 66  ** Print the def
1dc60 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75  inition of the u
1dc70 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68  nion used for th
1dc80 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61 20  e parser's data 
1dc90 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75  stack..** This u
1dca0 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69  nion contains fi
1dcb0 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20 70  elds for every p
1dcc0 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79 70  ossible data typ
1dcd0 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e for tokens.** 
1dce0 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  and nonterminals
1dcf0 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73  .  In the proces
1dd00 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  s of computing a
1dd10 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73  nd printing this
1dd20 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20  .** union, also 
1dd30 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22  set the ".dtnum"
1dd40 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
1dd50 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e  terminal and non
1dd60 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
1dd70 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e  ol..*/.void prin
1dd80 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20  t_stack_union(. 
1dd90 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20   FILE *out,     
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ddb0 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  The output strea
1ddc0 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65  m */.  struct le
1ddd0 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20  mon *lemp,      
1dde0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69     /* The main i
1ddf0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
1de00 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f  r this parser */
1de10 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c  .  int *plineno,
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1de40 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
1de50 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20    int mhflag    
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de70 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61 74   True if generat
1de80 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20  ing makeheaders 
1de90 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69  output */.){.  i
1dea0 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
1deb0 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
1dec0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
1ded0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
1dee0 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
1df00 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
1df10 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
1df20 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
1df30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1df40 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
1df50 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
1df60 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
1df70 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
1df80 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
1df90 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
1dfa0 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dfc0 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
1dfd0 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
1dfe0 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e000 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1e010 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 61  */.  unsigned ha
1e020 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sh;            /
1e030 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
1e040 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
1e050 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e060 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   *name;         
1e070 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
1e080 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
1e090 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
1e0a0 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
1e0b0 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
1e0c0 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
1e0d0 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
1e0e0 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
1e0f0 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63  = (char**)calloc
1e100 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a  ( arraysize, siz
1e110 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20  eof(char*) );.  
1e120 69 66 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a  if( types==0 ){.
1e130 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e140 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1e150 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  y.\n");.    exit
1e160 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1e170 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b  =0; i<arraysize;
1e180 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d   i++) types[i] =
1e190 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74   0;.  maxdtlengt
1e1a0 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d  h = 0;.  if( lem
1e1b0 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20  p->vartype ){.  
1e1c0 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20    maxdtlength = 
1e1d0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
1e1e0 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a  ->vartype);.  }.
1e1f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1e200 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1e210 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  {.    int len;. 
1e220 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1e230 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1e240 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  bols[i];.    if(
1e250 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30   sp->datatype==0
1e260 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e270 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
1e280 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29  en(sp->datatype)
1e290 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
1e2a0 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64  xdtlength ) maxd
1e2b0 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20  tlength = len;. 
1e2c0 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68   }.  stddt = (ch
1e2d0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64  ar*)malloc( maxd
1e2e0 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b  tlength*2 + 1 );
1e2f0 0a 20 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20  .  if( stddt==0 
1e300 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1e310 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
1e320 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
1e330 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
1e340 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74  * Build a hash t
1e350 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
1e360 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20  s. The ".dtnum" 
1e370 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79  field of each sy
1e380 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c  mbol.  ** is fil
1e390 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20  led in with the 
1e3a0 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20  hash index plus 
1e3b0 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76  1.  A ".dtnum" v
1e3c0 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a  alue of 0 is.  *
1e3d0 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69  * used for termi
1e3e0 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66  nal symbols.  If
1e3f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65   there is no %de
1e400 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e  fault_type defin
1e410 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69  ed then.  ** 0 i
1e420 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74  s also used as t
1e430 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20  he .dtnum value 
1e440 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  for nonterminals
1e450 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70   which do not sp
1e460 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74  ecify.  ** a dat
1e470 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20  atype using the 
1e480 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e  %type directive.
1e490 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1e4a0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1e4b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1e4c0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1e4d0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1e4e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ;.    char *cp;.
1e4f0 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70      if( sp==lemp
1e500 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
1e510 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72    sp->dtnum = ar
1e520 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20  raysize+1;.     
1e530 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1e540 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
1e550 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e!=NONTERMINAL |
1e560 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  | (sp->datatype=
1e570 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74  =0 && lemp->vart
1e580 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ype==0) ){.     
1e590 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
1e5a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e5b0 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73      }.    cp = s
1e5c0 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
1e5d0 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
1e5e0 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b  = lemp->vartype;
1e5f0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1e600 77 68 69 6c 65 28 20 49 53 53 50 41 43 45 28 2a  while( ISSPACE(*
1e610 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  cp) ) cp++;.    
1e620 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64  while( *cp ) std
1e630 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b  dt[j++] = *cp++;
1e640 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  .    while( j>0 
1e650 26 26 20 49 53 53 50 41 43 45 28 73 74 64 64 74  && ISSPACE(stddt
1e660 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20  [j-1]) ) j--;.  
1e670 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a    stddt[j] = 0;.
1e680 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
1e690 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d  kentype && strcm
1e6a0 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74  p(stddt, lemp->t
1e6b0 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a  okentype)==0 ){.
1e6c0 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
1e6d0 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
1e6e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
1e6f0 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ash = 0;.    for
1e700 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20  (j=0; stddt[j]; 
1e710 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68  j++){.      hash
1e720 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64   = hash*53 + std
1e730 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  dt[j];.    }.   
1e740 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26 20   hash = (hash & 
1e750 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72 61  0x7fffffff)%arra
1e760 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65  ysize;.    while
1e770 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b  ( types[hash] ){
1e780 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1e790 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74  p(types[hash],st
1e7a0 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ddt)==0 ){.     
1e7b0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68     sp->dtnum = h
1e7c0 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  ash + 1;.       
1e7d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1e7e0 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20        hash++;.  
1e7f0 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 28 75      if( hash>=(u
1e800 6e 73 69 67 6e 65 64 29 61 72 72 61 79 73 69 7a  nsigned)arraysiz
1e810 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  e ) hash = 0;.  
1e820 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65    }.    if( type
1e830 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
1e840 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1e850 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
1e860 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63  types[hash] = (c
1e870 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  har*)malloc( lem
1e880 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64 74 29 2b  onStrlen(stddt)+
1e890 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  1 );.      if( t
1e8a0 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
1e8b0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1e8c0 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
1e8d0 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20  memory.\n");.   
1e8e0 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
1e8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f      }.      lemo
1e900 6e 5f 73 74 72 63 70 79 28 74 79 70 65 73 5b 68  n_strcpy(types[h
1e910 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20  ash],stddt);.   
1e920 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69   }.  }..  /* Pri
1e930 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
1e940 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e  ition of YYTOKEN
1e950 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52  TYPE and YYMINOR
1e960 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d  TYPE */.  name =
1e970 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
1e980 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
1e990 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a  e";.  lineno = *
1e9a0 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d  plineno;.  if( m
1e9b0 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
1e9c0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1e9d0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1e9e0 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
1e9f0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f  ut,"#define %sTO
1ea00 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61  KENTYPE %s\n",na
1ea10 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f  me,.    lemp->to
1ea20 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f  kentype?lemp->to
1ea30 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29  kentype:"void*")
1ea40 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
1ea50 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
1ea60 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1ea70 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1ea80 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1ea90 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  "typedef union {
1eaa0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1eab0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1eac0 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29   int yyinit;\n")
1ead0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1eae0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54  rintf(out,"  %sT
1eaf0 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22  OKENTYPE yy0;\n"
1eb00 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1eb10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
1eb20 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  rraysize; i++){.
1eb30 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d      if( types[i]
1eb40 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1eb50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1eb60 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74  "  %s yy%d;\n",t
1eb70 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69  ypes[i],i+1); li
1eb80 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65  neno++;.    free
1eb90 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a  (types[i]);.  }.
1eba0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73    if( lemp->errs
1ebb0 79 6d 20 26 26 20 6c 65 6d 70 2d 3e 65 72 72 73  ym && lemp->errs
1ebc0 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20  ym->useCnt ){.  
1ebd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1ebe0 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65   int yy%d;\n",le
1ebf0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
1ec00 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  m); lineno++;.  
1ec10 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b  }.  free(stddt);
1ec20 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a  .  free(types);.
1ec30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
1ec40 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22   YYMINORTYPE;\n"
1ec50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a  ); lineno++;.  *
1ec60 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  plineno = lineno
1ec70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ec80 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1ec90 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20  C datatype able 
1eca0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c  to represent val
1ecb0 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c  ues between.** l
1ecc0 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c  wr and upr, incl
1ecd0 75 73 69 76 65 2e 20 20 49 66 20 70 6e 42 79 74  usive.  If pnByt
1ece0 65 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 73  e!=NULL then als
1ecf0 6f 20 77 72 69 74 65 20 74 68 65 20 73 69 7a 65  o write the size
1ed00 6f 66 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 74  of.** for that t
1ed10 79 70 65 20 28 31 2c 20 32 2c 20 6f 72 20 34 29  ype (1, 2, or 4)
1ed20 20 69 6e 74 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a   into *pnByte..*
1ed30 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1ed40 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a  har *minimum_siz
1ed50 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20  e_type(int lwr, 
1ed60 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e  int upr, int *pn
1ed70 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Byte){.  const c
1ed80 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 69 6e  har *zType = "in
1ed90 74 22 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  t";.  int nByte 
1eda0 3d 20 34 3b 0a 20 20 69 66 28 20 6c 77 72 3e 3d  = 4;.  if( lwr>=
1edb0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72  0 ){.    if( upr
1edc0 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20 7a  <=255 ){.      z
1edd0 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64  Type = "unsigned
1ede0 20 63 68 61 72 22 3b 0a 20 20 20 20 20 20 6e 42   char";.      nB
1edf0 79 74 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  yte = 1;.    }el
1ee00 73 65 20 69 66 28 20 75 70 72 3c 36 35 35 33 35  se if( upr<65535
1ee10 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
1ee20 3d 20 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  = "unsigned shor
1ee30 74 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42  t int";.      nB
1ee40 79 74 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  yte = 2;.    }el
1ee50 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se{.      zType 
1ee60 3d 20 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22  = "unsigned int"
1ee70 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ;.      nByte = 
1ee80 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  4;.    }.  }else
1ee90 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26   if( lwr>=-127 &
1eea0 26 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20  & upr<=127 ){.  
1eeb0 20 20 7a 54 79 70 65 20 3d 20 22 73 69 67 6e 65    zType = "signe
1eec0 64 20 63 68 61 72 22 3b 0a 20 20 20 20 6e 42 79  d char";.    nBy
1eed0 74 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  te = 1;.  }else 
1eee0 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20  if( lwr>=-32767 
1eef0 26 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b 0a  && upr<32767 ){.
1ef00 20 20 20 20 7a 54 79 70 65 20 3d 20 22 73 68 6f      zType = "sho
1ef10 72 74 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  rt";.    nByte =
1ef20 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e   2;.  }.  if( pn
1ef30 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
1ef40 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72 6e   nByte;.  return
1ef50 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
1ef60 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
1ef70 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
1ef80 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
1ef90 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
1efa0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
1efb0 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
1efc0 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
1efd0 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
1efe0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
1eff0 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1f000 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
1f010 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
1f020 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
1f030 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
1f040 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1f050 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
1f060 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
1f070 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
1f080 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
1f090 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1f0a0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
1f0b0 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
1f0c0 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
1f0d0 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
1f0e0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
1f0f0 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
1f100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f110 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
1f120 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20    int iOrder;   
1f130 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
1f140 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69  al order of acti
1f150 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  on sets */.};../
1f160 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20  *.** Compare to 
1f170 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73  axset structures
1f180 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
1f190 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
1f1a0 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  int axset_compar
1f1b0 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1f1c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1f1d0 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
1f1e0 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78  *p1 = (struct ax
1f1f0 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74  set*)a;.  struct
1f200 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74   axset *p2 = (st
1f210 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20  ruct axset*)b;. 
1f220 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32   int c;.  c = p2
1f230 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
1f240 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63  nAction;.  if( c
1f250 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70  ==0 ){.    c = p
1f260 31 2d 3e 69 4f 72 64 65 72 20 2d 20 70 32 2d 3e  1->iOrder - p2->
1f270 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73  iOrder;.  }.  as
1f280 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31  sert( c!=0 || p1
1f290 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==p2 );.  return
1f2a0 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   c;.}../*.** Wri
1f2b0 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22  te text on "out"
1f2c0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1f2d0 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a  the rule "rp"..*
1f2e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  /.static void wr
1f2f0 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45  iteRuleText(FILE
1f300 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
1f310 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a  le *rp){.  int j
1f320 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1f330 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68  "%s ::=", rp->lh
1f340 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
1f350 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b  j=0; j<rp->nrhs;
1f360 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
1f370 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1f380 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69  p->rhs[j];.    i
1f390 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c  f( sp->type!=MUL
1f3a0 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
1f3b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f3c0 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
1f3d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f3e0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1f3f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73  fprintf(out," %s
1f400 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  ", sp->subsym[0]
1f410 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  ->name);.      f
1f420 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73  or(k=1; k<sp->ns
1f430 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ubsym; k++){.   
1f440 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1f450 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79  ,"|%s",sp->subsy
1f460 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[k]->name);.   
1f470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1f480 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43  .../* Generate C
1f490 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
1f4a0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1f4b0 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
1f4c0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
1f4d0 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66  *lemp,.  int mhf
1f4e0 6c 61 67 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  lag     /* Outpu
1f4f0 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73  t in makeheaders
1f500 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20   format if true 
1f510 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  */.){.  FILE *ou
1f520 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c  t, *in;.  char l
1f530 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ine[LINESIZE];. 
1f540 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20   int  lineno;.  
1f550 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1f560 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1f570 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74  on *ap;.  struct
1f580 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
1f590 75 63 74 20 61 63 74 74 61 62 20 2a 70 41 63 74  uct acttab *pAct
1f5a0 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  tab;.  int i, j,
1f5b0 20 6e 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a   n, sz;.  int sz
1f5c0 41 63 74 69 6f 6e 54 79 70 65 3b 20 20 20 20 20  ActionType;     
1f5d0 2f 2a 20 73 69 7a 65 6f 66 28 59 59 41 43 54 49  /* sizeof(YYACTI
1f5e0 4f 4e 54 59 50 45 29 20 2a 2f 0a 20 20 69 6e 74  ONTYPE) */.  int
1f5f0 20 73 7a 43 6f 64 65 54 79 70 65 3b 20 20 20 20   szCodeType;    
1f600 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 43     /* sizeof(YYC
1f610 4f 44 45 54 59 50 45 29 20 20 20 2a 2f 0a 20 20  ODETYPE)   */.  
1f620 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1f630 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73  ;.  int mnTknOfs
1f640 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20  t, mxTknOfst;.  
1f650 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78  int mnNtOfst, mx
1f660 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74  NtOfst;.  struct
1f670 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 6c   axset *ax;..  l
1f680 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64  emp->minShiftRed
1f690 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  uce = lemp->nsta
1f6a0 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 65 72 72 41  te;.  lemp->errA
1f6b0 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6d 69  ction = lemp->mi
1f6c0 6e 53 68 69 66 74 52 65 64 75 63 65 20 2b 20 6c  nShiftReduce + l
1f6d0 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 6c 65  emp->nrule;.  le
1f6e0 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 20 3d 20  mp->accAction = 
1f6f0 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e 20  lemp->errAction 
1f700 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6e 6f 41  + 1;.  lemp->noA
1f710 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 61 63  ction = lemp->ac
1f720 63 41 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c  cAction + 1;.  l
1f730 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 3d  emp->minReduce =
1f740 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 20   lemp->noAction 
1f750 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6d 61 78  + 1;.  lemp->max
1f760 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6d  Action = lemp->m
1f770 69 6e 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d  inReduce + lemp-
1f780 3e 6e 72 75 6c 65 3b 0a 0a 20 20 69 6e 20 3d 20  >nrule;..  in = 
1f790 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b  tplt_open(lemp);
1f7a0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1f7b0 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66  eturn;.  out = f
1f7c0 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1f7d0 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20  c","wb");.  if( 
1f7e0 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63  out==0 ){.    fc
1f7f0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65  lose(in);.    re
1f800 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65  turn;.  }.  line
1f810 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78  no = 1;.  tplt_x
1f820 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1f830 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1f840 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1f850 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c  he include code,
1f860 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c   if any */.  tpl
1f870 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1f880 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26  ,lemp->include,&
1f890 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d  lineno);.  if( m
1f8a0 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
1f8b0 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66 69 6c  r *incName = fil
1f8c0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
1f8d0 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69   ".h");.    fpri
1f8e0 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64  ntf(out,"#includ
1f8f0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69 6e 63  e \"%s\"\n", inc
1f900 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Name); lineno++;
1f910 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e 61 6d  .    free(incNam
1f920 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
1f930 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1f940 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1f950 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
1f960 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
1f970 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
1f980 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f  mhflag ){.    co
1f990 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78  nst char *prefix
1f9a0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1f9b0 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1f9c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1f9d0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
1f9e0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1f9f0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1fa00 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65  prefix;.    else
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
1fa30 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1fa40 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
1fa50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
1fa60 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1fa70 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
1fa80 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
1fa90 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1faa0 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  );.      lineno+
1fab0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  +;.    }.    fpr
1fac0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1fad0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1fae0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1faf0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1fb00 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1fb10 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 64  * Generate the d
1fb20 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69  efines */.  fpri
1fb30 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fb40 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e   YYCODETYPE %s\n
1fb50 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
1fb60 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70  ize_type(0, lemp
1fb70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20 26 73 7a 43 6f  ->nsymbol, &szCo
1fb80 64 65 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f  deType)); lineno
1fb90 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1fba0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
1fbb0 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
1fbc0 6e 73 79 6d 62 6f 6c 29 3b 20 20 6c 69 6e 65 6e  nsymbol);  linen
1fbd0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1fbe0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
1fbf0 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
1fc00 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1fc10 5f 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6d 61  _type(0,lemp->ma
1fc20 78 41 63 74 69 6f 6e 2c 26 73 7a 41 63 74 69 6f  xAction,&szActio
1fc30 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b  nType)); lineno+
1fc40 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77  +;.  if( lemp->w
1fc50 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66  ildcard ){.    f
1fc60 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fc70 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25  ine YYWILDCARD %
1fc80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d  d\n",.       lem
1fc90 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64  p->wildcard->ind
1fca0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1fcb0 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b   }.  print_stack
1fcc0 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
1fcd0 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b  &lineno,mhflag);
1fce0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1fcf0 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b  "#ifndef YYSTACK
1fd00 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e  DEPTH\n"); linen
1fd10 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
1fd20 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20  >stacksize ){.  
1fd30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fd40 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45  define YYSTACKDE
1fd50 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e  PTH %s\n",lemp->
1fd60 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e  stacksize);  lin
1fd70 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
1fd80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1fd90 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
1fda0 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20  DEPTH 100\n");  
1fdb0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1fdc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65  fprintf(out, "#e
1fdd0 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1fde0 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  ++;.  if( mhflag
1fdf0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1fe00 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1fe10 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1fe20 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c  ;.  }.  name = l
1fe30 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
1fe40 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
1fe50 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72  ;.  if( lemp->ar
1fe60 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30  g && lemp->arg[0
1fe70 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c 65 6d  ] ){.    i = lem
1fe80 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61  onStrlen(lemp->a
1fe90 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  rg);.    while( 
1fea0 69 3e 3d 31 20 26 26 20 49 53 53 50 41 43 45 28  i>=1 && ISSPACE(
1feb0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20  lemp->arg[i-1]) 
1fec0 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  ) i--;.    while
1fed0 28 20 69 3e 3d 31 20 26 26 20 28 49 53 41 4c 4e  ( i>=1 && (ISALN
1fee0 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  UM(lemp->arg[i-1
1fef0 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b  ]) || lemp->arg[
1ff00 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d  i-1]=='_') ) i--
1ff10 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1ff20 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1ff30 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61  _SDECL %s;\n",na
1ff40 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
1ff50 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1ff60 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ff70 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c  ne %sARG_PDECL ,
1ff80 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d  %s\n",name,lemp-
1ff90 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  >arg);  lineno++
1ffa0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1ffb0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1ffc0 5f 50 41 52 41 4d 20 2c 25 73 5c 6e 22 2c 6e 61  _PARAM ,%s\n",na
1ffd0 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
1ffe0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1fff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
20000 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
20010 43 48 20 25 73 3d 79 79 70 50 61 72 73 65 72 2d  CH %s=yypParser-
20020 3e 25 73 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  >%s;\n",.       
20030 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
20040 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
20050 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
20060 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
20070 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
20080 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
20090 65 72 2d 3e 25 73 3d 25 73 3b 5c 6e 22 2c 0a 20  er->%s=%s;\n",. 
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  name,&lemp->arg[
200c0 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  i],&lemp->arg[i]
200d0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
200e0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
200f0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20100 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e  %sARG_SDECL\n",n
20110 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
20120 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20130 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50  "#define %sARG_P
20140 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  DECL\n",name); l
20150 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
20160 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20170 65 20 25 73 41 52 47 5f 50 41 52 41 4d 5c 6e 22  e %sARG_PARAM\n"
20180 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
20190 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
201a0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
201b0 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b  _FETCH\n",name);
201c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
201d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
201e0 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c  ine %sARG_STORE\
201f0 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
20200 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
20210 6d 70 2d 3e 63 74 78 20 26 26 20 6c 65 6d 70 2d  mp->ctx && lemp-
20220 3e 63 74 78 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >ctx[0] ){.    i
20230 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
20240 65 6d 70 2d 3e 63 74 78 29 3b 0a 20 20 20 20 77  emp->ctx);.    w
20250 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 49 53  hile( i>=1 && IS
20260 53 50 41 43 45 28 6c 65 6d 70 2d 3e 63 74 78 5b  SPACE(lemp->ctx[
20270 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
20280 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
20290 28 49 53 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 63  (ISALNUM(lemp->c
202a0 74 78 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  tx[i-1]) || lemp
202b0 2d 3e 63 74 78 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->ctx[i-1]=='_')
202c0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
202d0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
202e0 20 25 73 43 54 58 5f 53 44 45 43 4c 20 25 73 3b   %sCTX_SDECL %s;
202f0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 63  \n",name,lemp->c
20300 74 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  tx);  lineno++;.
20310 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20320 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f 50  "#define %sCTX_P
20330 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
20340 2c 6c 65 6d 70 2d 3e 63 74 78 29 3b 20 20 6c 69  ,lemp->ctx);  li
20350 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
20360 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20370 20 25 73 43 54 58 5f 50 41 52 41 4d 20 2c 25 73   %sCTX_PARAM ,%s
20380 5c 6e 22 2c 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e  \n",name,&lemp->
20390 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  ctx[i]);  lineno
203a0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
203b0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43  out,"#define %sC
203c0 54 58 5f 46 45 54 43 48 20 25 73 3d 79 79 70 50  TX_FETCH %s=yypP
203d0 61 72 73 65 72 2d 3e 25 73 3b 5c 6e 22 2c 0a 20  arser->%s;\n",. 
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 63 74 78 2c 26  name,lemp->ctx,&
20400 6c 65 6d 70 2d 3e 63 74 78 5b 69 5d 29 3b 20 20  lemp->ctx[i]);  
20410 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
20420 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
20430 6e 65 20 25 73 43 54 58 5f 53 54 4f 52 45 20 79  ne %sCTX_STORE y
20440 79 70 50 61 72 73 65 72 2d 3e 25 73 3d 25 73 3b  ypParser->%s=%s;
20450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20460 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70        name,&lemp
20470 2d 3e 63 74 78 5b 69 5d 2c 26 6c 65 6d 70 2d 3e  ->ctx[i],&lemp->
20480 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  ctx[i]);  lineno
20490 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
204a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
204b0 65 66 69 6e 65 20 25 73 43 54 58 5f 53 44 45 43  efine %sCTX_SDEC
204c0 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  L\n",name); line
204d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
204e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
204f0 73 43 54 58 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sCTX_PDECL\n",na
20500 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
20510 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
20520 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f 50 41  #define %sCTX_PA
20530 52 41 4d 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  RAM\n",name); li
20540 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
20550 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20560 20 25 73 43 54 58 5f 46 45 54 43 48 5c 6e 22 2c   %sCTX_FETCH\n",
20570 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
20580 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20590 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f  ,"#define %sCTX_
205a0 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20  STORE\n",name); 
205b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
205c0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
205d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
205e0 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
205f0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
20600 65 6d 70 2d 3e 65 72 72 73 79 6d 20 26 26 20 6c  emp->errsym && l
20610 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65  emp->errsym->use
20620 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  Cnt ){.    fprin
20630 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20640 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64  YYERRORSYMBOL %d
20650 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
20660 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
20670 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
20680 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
20690 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c  RRSYMDT yy%d\n",
206a0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
206b0 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  num); lineno++;.
206c0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
206d0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
206e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
206f0 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42  "#define YYFALLB
20700 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65  ACK 1\n");  line
20710 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  no++;.  }..  /* 
20720 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
20730 6f 6e 20 74 61 62 6c 65 2c 20 62 75 74 20 64 6f  on table, but do
20740 20 6e 6f 74 20 6f 75 74 70 75 74 20 69 74 20 79   not output it y
20750 65 74 2e 20 20 54 68 65 20 61 63 74 69 6f 6e 0a  et.  The action.
20760 20 20 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20    ** table must 
20770 62 65 20 63 6f 6d 70 75 74 65 64 20 62 65 66 6f  be computed befo
20780 72 65 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  re generating th
20790 65 20 59 59 4e 53 54 41 54 45 20 6d 61 63 72 6f  e YYNSTATE macro
207a0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 77 65   because.  ** we
207b0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 68 6f   need to know ho
207c0 77 20 6d 61 6e 79 20 73 74 61 74 65 73 20 63 61  w many states ca
207d0 6e 20 62 65 20 65 6c 69 6d 69 6e 61 74 65 64 2e  n be eliminated.
207e0 0a 20 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74  .  */.  ax = (st
207f0 72 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61  ruct axset *) ca
20800 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 78 73 74 61  lloc(lemp->nxsta
20810 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b  te*2, sizeof(ax[
20820 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d  0]));.  if( ax==
20830 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
20840 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
20850 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
20860 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66  exit(1);.  }.  f
20870 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
20880 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  nxstate; i++){. 
20890 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
208a0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78  orted[i];.    ax
208b0 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
208c0 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
208d0 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
208e0 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
208f0 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
20900 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
20910 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
20920 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
20930 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
20940 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
20950 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
20960 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
20970 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
20980 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 20   mnNtOfst = 0;. 
20990 20 2f 2a 20 49 6e 20 61 6e 20 65 66 66 6f 72 74   /* In an effort
209a0 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
209b0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 73 69   action table si
209c0 7a 65 2c 20 75 73 65 20 74 68 65 20 68 65 75 72  ze, use the heur
209d0 69 73 74 69 63 0a 20 20 2a 2a 20 6f 66 20 70 6c  istic.  ** of pl
209e0 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73  acing the larges
209f0 74 20 61 63 74 69 6f 6e 20 73 65 74 73 20 66 69  t action sets fi
20a00 72 73 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  rst */.  for(i=0
20a10 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
20a20 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e  e*2; i++) ax[i].
20a30 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71 73  iOrder = i;.  qs
20a40 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78  ort(ax, lemp->nx
20a50 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
20a60 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f  ax[0]), axset_co
20a70 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61  mpare);.  pActta
20a80 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
20a90 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20  (lemp->nsymbol, 
20aa0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29  lemp->nterminal)
20ab0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
20ac0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26  emp->nxstate*2 &
20ad0 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e  & ax[i].nAction>
20ae0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  0; i++){.    stp
20af0 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20   = ax[i].stp;.  
20b00 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b    if( ax[i].isTk
20b10 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  n ){.      for(a
20b20 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
20b30 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
20b40 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
20b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
20b60 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70  >sp->index>=lemp
20b70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
20b80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20b90 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
20ba0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
20bb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
20bc0 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
20bd0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
20be0 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
20bf0 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
20c00 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
20c10 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54   }.      stp->iT
20c20 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  knOfst = acttab_
20c30 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 2c 20  insert(pActtab, 
20c40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  1);.      if( st
20c50 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b  p->iTknOfst<mnTk
20c60 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73  nOfst ) mnTknOfs
20c70 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
20c80 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
20c90 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e  ->iTknOfst>mxTkn
20ca0 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74  Ofst ) mxTknOfst
20cb0 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
20cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20cd0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
20ce0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
20cf0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
20d00 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
20d10 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
20d20 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
20d30 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
20d40 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
20d50 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
20d60 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e  nsymbol ) contin
20d70 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
20d80 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
20d90 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
20da0 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
20db0 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
20dc0 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
20dd0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
20de0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
20df0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
20e00 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73       stp->iNtOfs
20e10 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
20e20 74 28 70 41 63 74 74 61 62 2c 20 30 29 3b 0a 20  t(pActtab, 0);. 
20e30 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
20e40 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
20e50 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
20e60 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
20e70 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
20e80 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
20e90 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
20ea0 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30  fst;.    }.#if 0
20eb0 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20 66    /* Uncomment f
20ec0 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20 68 6f  or a trace of ho
20ed0 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  w the yy_action[
20ee0 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f 75  ] table fills ou
20ef0 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20 6a  t */.    { int j
20f00 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f 72  j, nn;.      for
20f10 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63  (jj=nn=0; jj<pAc
20f20 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a  ttab->nAction; j
20f30 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
20f40 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74 69  ( pActtab->aActi
20f50 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20  on[jj].action<0 
20f60 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) nn++;.      }.
20f70 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34        printf("%4
20f80 64 3a 20 53 74 61 74 65 20 25 33 64 20 25 73 20  d: State %3d %s 
20f90 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35 64  n: %2d size: %5d
20fa0 20 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c 6e   freespace: %d\n
20fb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20fc0 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  i, stp->statenum
20fd0 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20  , ax[i].isTkn ? 
20fe0 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20 20  "Token" : "Var  
20ff0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21000 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70  ax[i].nAction, p
21010 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c  Acttab->nAction,
21020 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   nn);.    }.#end
21030 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78  if.  }.  free(ax
21040 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72 75  );..  /* Mark ru
21050 6c 65 73 20 74 68 61 74 20 61 72 65 20 61 63 74  les that are act
21060 75 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20 72  ually used for r
21070 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61 66  educe actions af
21080 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74  ter all.  ** opt
21090 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65 20  imizations have 
210a0 62 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20 2a  been applied.  *
210b0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
210c0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
210d0 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65 73  ->next) rp->does
210e0 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
210f0 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
21100 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
21110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
21120 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
21130 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
21140 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
21150 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
21160 44 55 43 45 20 7c 7c 20 61 70 2d 3e 74 79 70 65  DUCE || ap->type
21170 3d 3d 53 48 49 46 54 52 45 44 55 43 45 20 29 7b  ==SHIFTREDUCE ){
21180 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e 72  .        ap->x.r
21190 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d 20  p->doesReduce = 
211a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
211b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73  .  }..  /* Finis
211c0 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65 20  h rendering the 
211d0 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74 68  constants now th
211e0 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  at the action ta
211f0 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ble has.  ** bee
21200 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20  n computed */.  
21210 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
21220 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20 20  fine YYNSTATE   
21230 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
21240 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b 20  lemp->nxstate); 
21250 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
21260 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
21270 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20 20  e YYNRULE       
21280 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
21290 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
212a0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
212b0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
212c0 54 4f 4b 45 4e 20 20 20 20 20 20 20 20 20 20 20  TOKEN           
212d0 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 74    %d\n",lemp->nt
212e0 65 72 6d 69 6e 61 6c 29 3b 20 6c 69 6e 65 6e 6f  erminal); lineno
212f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
21300 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41  t,"#define YY_MA
21310 58 5f 53 48 49 46 54 20 20 20 20 20 20 20 20 20  X_SHIFT         
21320 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74  %d\n",lemp->nxst
21330 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ate-1); lineno++
21340 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69  ;.  i = lemp->mi
21350 6e 53 68 69 66 74 52 65 64 75 63 65 3b 0a 20 20  nShiftReduce;.  
21360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
21370 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 53 48 49 46  fine YY_MIN_SHIF
21380 54 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22 2c  TREDUCE   %d\n",
21390 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  i); lineno++;.  
213a0 69 20 2b 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  i += lemp->nrule
213b0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
213c0 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f  "#define YY_MAX_
213d0 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64  SHIFTREDUCE   %d
213e0 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e  \n", i-1); linen
213f0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
21400 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 45  ut,"#define YY_E
21410 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 20  RROR_ACTION     
21420 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 65 72   %d\n", lemp->er
21430 72 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f  rAction); lineno
21440 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
21450 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43  t,"#define YY_AC
21460 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20  CEPT_ACTION     
21470 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 61 63 63  %d\n", lemp->acc
21480 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b  Action); lineno+
21490 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
214a0 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f  ,"#define YY_NO_
214b0 41 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 25  ACTION         %
214c0 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6e 6f 41 63  d\n", lemp->noAc
214d0 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tion); lineno++;
214e0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
214f0 23 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 52  #define YY_MIN_R
21500 45 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c  EDUCE        %d\
21510 6e 22 2c 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  n", lemp->minRed
21520 75 63 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  uce); lineno++;.
21530 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52    i = lemp->minR
21540 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  educe + lemp->nr
21550 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  ule;.  fprintf(o
21560 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
21570 41 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 20  AX_REDUCE       
21580 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69   %d\n", i-1); li
21590 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78  neno++;.  tplt_x
215a0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
215b0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
215c0 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70 75 74  .  /* Now output
215d0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
215e0 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  e and its associ
215f0 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates:.  **.  ** 
21600 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20   yy_action[]    
21610 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62      A single tab
21620 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  le containing al
21630 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  l actions..  ** 
21640 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
21650 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74      A table cont
21660 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61  aining the looka
21670 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e  head for each en
21680 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20  try in.  **     
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64  yy_action.  Used
216b0 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20   to detect hash 
216c0 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a  collisions..  **
216d0 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b    yy_shift_ofst[
216e0 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74  ]    For each st
216f0 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20  ate, the offset 
21700 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66  into yy_action f
21710 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  or.  **         
21720 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
21730 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a  ting terminals..
21740 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f    **  yy_reduce_
21750 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63  ofst[]   For eac
21760 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
21770 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
21780 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72  shifting non-ter
217b0 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72  minals after a r
217c0 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f  educe..  **  yy_
217d0 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20  default[]       
217e0 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66  Default action f
217f0 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20  or each state.. 
21800 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
21810 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
21820 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e  able */.  lemp->
21830 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e 20 3d  nactiontab = n =
21840 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73   acttab_action_s
21850 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
21860 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
21870 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70  += n*szActionTyp
21880 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
21890 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54  ,"#define YY_ACT
218a0 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e  TAB_COUNT (%d)\n
218b0 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", n); lineno++;
218c0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
218d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
218e0 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74  CTIONTYPE yy_act
218f0 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ion[] = {\n"); l
21900 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
21910 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
21920 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20  .    int action 
21930 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f  = acttab_yyactio
21940 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20  n(pActtab, i);. 
21950 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
21960 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ) action = lemp-
21970 3e 6e 6f 41 63 74 69 6f 6e 3b 0a 20 20 20 20 69  >noAction;.    i
21980 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
21990 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
219a0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
219b0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
219c0 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  ", action);.    
219d0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
219e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
219f0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
21a00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
21a10 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
21a20 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
21a30 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
21a40 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
21a50 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
21a60 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f  utput the yy_loo
21a70 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a  kahead table */.
21a80 20 20 6c 65 6d 70 2d 3e 6e 6c 6f 6f 6b 61 68 65    lemp->nlookahe
21a90 61 64 74 61 62 20 3d 20 6e 20 3d 20 61 63 74 74  adtab = n = actt
21aa0 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a  ab_lookahead_siz
21ab0 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 6c 65  e(pActtab);.  le
21ac0 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
21ad0 20 6e 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20   n*szCodeType;. 
21ae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
21af0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44  atic const YYCOD
21b00 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
21b10 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
21b20 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
21b30 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
21b40 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
21b50 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
21b60 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
21b70 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
21b80 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
21b90 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
21ba0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
21bb0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
21bc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21bd0 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
21be0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
21bf0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
21c00 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
21c10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
21c20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
21c30 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
21c40 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
21c50 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
21c60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
21c70 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
21c80 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
21c90 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e   */.  n = lemp->
21ca0 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  nxstate;.  while
21cb0 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
21cc0 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
21cd0 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
21ce0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
21cf0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
21d00 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20 20  Y_SHIFT_COUNT   
21d10 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
21d20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
21d30 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
21d40 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20  e YY_SHIFT_MIN  
21d50 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54      (%d)\n", mnT
21d60 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b  knOfst); lineno+
21d70 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
21d80 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48  , "#define YY_SH
21d90 49 46 54 5f 4d 41 58 20 20 20 20 20 20 28 25 64  IFT_MAX      (%d
21da0 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29  )\n", mxTknOfst)
21db0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
21dc0 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
21dd0 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73  ic const %s yy_s
21de0 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  hift_ofst[] = {\
21df0 6e 22 2c 0a 20 20 20 20 20 20 20 6d 69 6e 69 6d  n",.       minim
21e00 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
21e10 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e 74  knOfst, lemp->nt
21e20 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e 61  erminal+lemp->na
21e30 63 74 69 6f 6e 74 61 62 2c 20 26 73 7a 29 29 3b  ctiontab, &sz));
21e40 0a 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  .       lineno++
21e50 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
21e60 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66  ize += n*sz;.  f
21e70 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
21e80 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
21e90 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
21ea0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
21eb0 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54    ofst = stp->iT
21ec0 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  knOfst;.    if( 
21ed0 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
21ee0 29 20 6f 66 73 74 20 3d 20 6c 65 6d 70 2d 3e 6e  ) ofst = lemp->n
21ef0 61 63 74 69 6f 6e 74 61 62 3b 0a 20 20 20 20 69  actiontab;.    i
21f00 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
21f10 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
21f20 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
21f30 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
21f40 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  ", ofst);.    if
21f50 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
21f60 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
21f70 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
21f80 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
21f90 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
21fa0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
21fb0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
21fc0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
21fd0 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
21fe0 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63  put the yy_reduc
21ff0 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a  e_ofst[] table *
22000 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78  /.  n = lemp->nx
22010 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
22020 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
22030 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73  ted[n-1]->iNtOfs
22040 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
22050 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
22060 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
22070 45 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29  EDUCE_COUNT (%d)
22080 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
22090 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
220a0 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
220b0 52 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64  REDUCE_MIN   (%d
220c0 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b  )\n", mnNtOfst);
220d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
220e0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
220f0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58  ne YY_REDUCE_MAX
22100 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74     (%d)\n", mxNt
22110 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
22120 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
22130 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
22140 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
22150 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20  ] = {\n",.      
22160 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
22170 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31  _type(mnNtOfst-1
22180 2c 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29  , mxNtOfst, &sz)
22190 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c  ); lineno++;.  l
221a0 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
221b0 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d  = n*sz;.  for(i=
221c0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
221d0 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20      int ofst;.  
221e0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
221f0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73  rted[i];.    ofs
22200 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
22210 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d  ;.    if( ofst==
22220 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74  NO_OFFSET ) ofst
22230 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b   = mnNtOfst - 1;
22240 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
22250 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
22260 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
22270 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
22280 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
22290 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
222a0 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
222b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
222c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
222d0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
222e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
222f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
22300 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
22310 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
22320 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65  /* Output the de
22330 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62  fault action tab
22340 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
22350 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
22360 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  st YYACTIONTYPE 
22370 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b  yy_default[] = {
22380 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
22390 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74    n = lemp->nxst
223a0 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62  ate;.  lemp->tab
223b0 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63  lesize += n*szAc
223c0 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28  tionType;.  for(
223d0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
223e0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
223f0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
22400 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
22410 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
22420 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 69   */ ", i);.    i
22430 66 28 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64  f( stp->iDfltRed
22440 75 63 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 66  uce<0 ){.      f
22450 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
22460 64 2c 22 2c 20 6c 65 6d 70 2d 3e 65 72 72 41 63  d,", lemp->errAc
22470 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tion);.    }else
22480 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
22490 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74  out, " %4d,", st
224a0 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 2b  p->iDfltReduce +
224b0 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65   lemp->minReduce
224c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
224d0 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
224e0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
224f0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
22500 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
22510 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
22520 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
22530 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
22540 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
22550 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
22560 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
22570 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
22580 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
22590 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61   table of fallba
225a0 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  ck tokens..  */.
225b0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
225c0 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
225d0 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e  int mx = lemp->n
225e0 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20  terminal - 1;.  
225f0 20 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26    while( mx>0 &&
22600 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d   lemp->symbols[m
22610 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20  x]->fallback==0 
22620 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c  ){ mx--; }.    l
22630 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
22640 3d 20 28 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54  = (mx+1)*szCodeT
22650 79 70 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ype;.    for(i=0
22660 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
22670 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
22680 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
22690 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
226a0 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
226b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
226c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
226d0 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
226e0 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
226f0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
22700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
22710 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
22720 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
22730 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
22740 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
22750 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
22760 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
22770 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22780 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
22790 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
227a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
227b0 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
227c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
227d0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
227e0 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
227f0 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
22800 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
22810 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
22820 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bol; i++){.    l
22830 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e  emon_sprintf(lin
22840 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70  e,"\"%s\",",lemp
22850 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
22860 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  me);.    fprintf
22870 28 6f 75 74 2c 22 20 20 2f 2a 20 25 34 64 20 2a  (out,"  /* %4d *
22880 2f 20 5c 22 25 73 5c 22 2c 5c 6e 22 2c 69 2c 20  / \"%s\",\n",i, 
22890 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
228a0 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
228b0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
228c0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
228d0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
228e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
228f0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
22900 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
22910 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
22920 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
22930 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
22940 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54   the grammar.  T
22950 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
22960 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
22970 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
22980 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
22990 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
229a0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
229b0 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
229c0 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
229d0 69 52 75 6c 65 3d 3d 69 20 29 3b 0a 20 20 20 20  iRule==i );.    
229e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
229f0 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
22a00 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
22a10 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
22a20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
22a30 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
22a40 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
22a50 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
22a60 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
22a70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
22a80 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
22a90 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
22aa0 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
22ab0 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
22ac0 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
22ad0 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
22ae0 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
22af0 65 20 70 61 72 73 65 72 2e 0a 20 20 2a 2a 20 28  e parser..  ** (
22b00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
22b10 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65  generate the %de
22b20 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73  structor actions
22b30 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ).  */.  if( lem
22b40 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a  p->tokendest ){.
22b50 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
22b60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22b70 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
22b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
22b90 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
22ba0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
22bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
22bc0 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54  0 || sp->type!=T
22bd0 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e  ERMINAL ) contin
22be0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
22bf0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
22c00 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
22c10 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65    /* TERMINAL De
22c20 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b  structor */\n");
22c30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
22c40 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
22c50 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
22c60 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
22c70 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
22c80 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
22c90 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
22ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22cb0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
22cc0 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mbol && lemp->sy
22cd0 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d  mbols[i]->type!=
22ce0 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a  TERMINAL; i++);.
22cf0 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e      if( i<lemp->
22d00 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
22d10 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
22d20 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
22d30 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
22d40 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
22d50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
22d60 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
22d70 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
22d80 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76   }.  if( lemp->v
22d90 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74  ardest ){.    st
22da0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c  ruct symbol *dfl
22db0 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  t_sp = 0;.    in
22dc0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
22dd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
22de0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
22df0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
22e00 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
22e10 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
22e20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
22e30 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
22e40 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73  L ||.          s
22e50 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73  p->index<=0 || s
22e60 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
22e70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22e80 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20     if( once ){. 
22e90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
22ea0 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65  ut, "      /* De
22eb0 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e  fault NON-TERMIN
22ec0 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
22ed0 5c 6e 22 29 3b 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  \n");lineno++;. 
22ee0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
22ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
22f00 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
22f10 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
22f20 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
22f30 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
22f40 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
22f50 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
22f60 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
22f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
22f80 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
22f90 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
22fa0 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
22fb0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
22fc0 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
22fd0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
22fe0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
22ff0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
23000 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
23010 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
23020 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
23030 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
23040 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
23050 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  AL || sp->destru
23060 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor==0 ) contin
23070 75 65 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  ue;.    if( sp->
23080 64 65 73 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63  destLineno<0 ) c
23090 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72  ontinue;  /* Alr
230a0 65 61 64 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a  eady emitted */.
230b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
230c0 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
230d0 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69   %s */\n", sp->i
230e0 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ndex, sp->name);
230f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20   lineno++;..    
23100 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69  /* Combine dupli
23110 63 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73  cate destructors
23120 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63   into a single c
23130 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ase */.    for(j
23140 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73  =i+1; j<lemp->ns
23150 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ymbol; j++){.   
23160 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
23170 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79   *sp2 = lemp->sy
23180 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20  mbols[j];.      
23190 69 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e  if( sp2 && sp2->
231a0 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26  type!=TERMINAL &
231b0 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  & sp2->destructo
231c0 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  r.          && s
231d0 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64  p2->dtnum==sp->d
231e0 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26  tnum.          &
231f0 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73  & strcmp(sp->des
23200 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73  tructor,sp2->des
23210 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20  tructor)==0 ){. 
23220 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
23230 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
23240 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  : /* %s */\n",. 
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d  sp2->index, sp2-
23270 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
23280 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e  ;.         sp2->
23290 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b  destLineno = -1;
232a0 20 20 2f 2a 20 41 76 6f 69 64 20 65 6d 69 74 74    /* Avoid emitt
232b0 69 6e 67 20 74 68 69 73 20 64 65 73 74 72 75 63  ing this destruc
232c0 74 6f 72 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  tor again */.   
232d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
232e0 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
232f0 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
23300 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
23310 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72  lineno);.    fpr
23320 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
23330 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
23340 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
23350 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
23360 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
23370 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
23380 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
23390 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
233a0 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f  e parser stack o
233b0 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70  verflows */.  tp
233c0 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
233d0 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  p,lemp->overflow
233e0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
233f0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
23400 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
23410 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
23420 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72  e the table of r
23430 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ule information.
23440 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
23450 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
23460 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
23470 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d  at rules are num
23480 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74  ber.  ** sequent
23490 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20  ually beginning 
234a0 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66  with 0..  */.  f
234b0 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
234c0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
234d0 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
234e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
234f0 20 7b 20 25 34 64 2c 20 25 34 64 20 7d 2c 20 2f   { %4d, %4d }, /
23500 2a 20 28 25 64 29 20 22 2c 72 70 2d 3e 6c 68 73  * (%d) ",rp->lhs
23510 2d 3e 69 6e 64 65 78 2c 2d 72 70 2d 3e 6e 72 68  ->index,-rp->nrh
23520 73 2c 69 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70  s,i);.    rule_p
23530 72 69 6e 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  rint(out, rp);. 
23540 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
23550 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
23560 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
23570 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
23580 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
23590 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
235a0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69  de which executi
235b0 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52  on during each R
235c0 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  EDUCE action */.
235d0 20 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72    i = 0;.  for(r
235e0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
235f0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
23600 20 20 20 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61      i += transla
23610 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70  te_code(lemp, rp
23620 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 20 29  );.  }.  if( i )
23630 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
23640 74 2c 22 20 20 20 20 20 20 20 20 59 59 4d 49 4e  t,"        YYMIN
23650 4f 52 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f  ORTYPE yylhsmino
23660 72 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  r;\n"); lineno++
23670 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74  ;.  }.  /* First
23680 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74   output rules ot
23690 68 65 72 20 74 68 61 6e 20 74 68 65 20 64 65 66  her than the def
236a0 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20  ault: rule */.  
236b0 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
236c0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
236d0 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  xt){.    struct 
236e0 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20  rule *rp2;      
236f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65           /* Othe
23700 72 20 72 75 6c 65 73 20 77 69 74 68 20 74 68 65  r rules with the
23710 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a   same action */.
23720 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
23730 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e  Emitted ) contin
23740 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
23750 6e 6f 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  noCode ){.      
23760 2f 2a 20 4e 6f 20 43 20 63 6f 64 65 20 61 63 74  /* No C code act
23770 69 6f 6e 73 2c 20 73 6f 20 74 68 69 73 20 77 69  ions, so this wi
23780 6c 6c 20 62 65 20 70 61 72 74 20 6f 66 20 74 68  ll be part of th
23790 65 20 22 64 65 66 61 75 6c 74 3a 22 20 72 75 6c  e "default:" rul
237a0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  e */.      conti
237b0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  nue;.    }.    f
237c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
237d0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c    case %d: /* ",
237e0 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20   rp->iRule);.   
237f0 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
23800 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
23810 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e  intf(out, " */\n
23820 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
23830 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65    for(rp2=rp->ne
23840 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32  xt; rp2; rp2=rp2
23850 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
23860 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70  f( rp2->code==rp
23870 2d 3e 63 6f 64 65 20 26 26 20 72 70 32 2d 3e 63  ->code && rp2->c
23880 6f 64 65 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63  odePrefix==rp->c
23890 6f 64 65 50 72 65 66 69 78 0a 20 20 20 20 20 20  odePrefix.      
238a0 20 20 20 20 20 20 20 26 26 20 72 70 32 2d 3e 63         && rp2->c
238b0 6f 64 65 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63  odeSuffix==rp->c
238c0 6f 64 65 53 75 66 66 69 78 20 29 7b 0a 20 20 20  odeSuffix ){.   
238d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
238e0 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
238f0 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c   /* ", rp2->iRul
23900 65 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  e);.        writ
23910 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72  eRuleText(out, r
23920 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  p2);.        fpr
23930 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79  intf(out," */ yy
23940 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e  testcase(yyrulen
23950 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d  o==%d);\n", rp2-
23960 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b  >iRule); lineno+
23970 2b 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e  +;.        rp2->
23980 63 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b  codeEmitted = 1;
23990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
239a0 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74     emit_code(out
239b0 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  ,rp,lemp,&lineno
239c0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
239d0 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61  ut,"        brea
239e0 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
239f0 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d  ;.    rp->codeEm
23a00 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  itted = 1;.  }. 
23a10 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74   /* Finally, out
23a20 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a  put the default:
23a30 20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73   rule.  We choos
23a40 65 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  e as the default
23a50 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79  : all.  ** empty
23a60 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66   actions. */.  f
23a70 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
23a80 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20    default:\n"); 
23a90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
23aa0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
23ab0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
23ac0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  .    if( rp->cod
23ad0 65 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69  eEmitted ) conti
23ae0 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
23af0 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20   rp->noCode );. 
23b00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
23b10 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c        /* (%d) ",
23b20 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20   rp->iRule);.   
23b30 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
23b40 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 69 66 28  ut, rp);.    if(
23b50 20 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20   rp->doesReduce 
23b60 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
23b70 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73  (out, " */ yytes
23b80 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
23b90 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75  %d);\n", rp->iRu
23ba0 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  le); lineno++;. 
23bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23bc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 28  fprintf(out, " (
23bd0 4f 50 54 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a  OPTIMIZED OUT) *
23be0 2f 20 61 73 73 65 72 74 28 79 79 72 75 6c 65 6e  / assert(yyrulen
23bf0 6f 21 3d 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20  o!=%d);\n",.    
23c00 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 52            rp->iR
23c10 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ule); lineno++;.
23c20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
23c30 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
23c40 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
23c50 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
23c60 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
23c70 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
23c80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
23c90 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
23ca0 73 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69  s if a parse fai
23cb0 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ls */.  tplt_pri
23cc0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
23cd0 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e  ->failure,&linen
23ce0 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
23cf0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
23d00 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
23d10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23d20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
23d30 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72  hen a syntax err
23d40 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74  or occurs */.  t
23d50 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
23d60 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26  mp,lemp->error,&
23d70 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
23d80 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
23d90 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
23da0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
23db0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
23dc0 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72  tes when the par
23dd0 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20  ser accepts its 
23de0 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f  input */.  tplt_
23df0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
23e00 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e  emp->accept,&lin
23e10 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
23e20 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23e30 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23e40 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61   /* Append any a
23e50 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65  ddition code the
23e60 20 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f   user desires */
23e70 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
23e80 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74  t,lemp,lemp->ext
23e90 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b  racode,&lineno);
23ea0 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ..  fclose(in);.
23eb0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
23ec0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47   return;.}../* G
23ed0 65 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72  enerate a header
23ee0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
23ef0 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70  rser */.void Rep
23f00 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74  ortHeader(struct
23f10 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
23f20 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
23f30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
23f40 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c  prefix;.  char l
23f50 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ine[LINESIZE];. 
23f60 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49   char pattern[LI
23f70 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69  NESIZE];.  int i
23f80 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  ;..  if( lemp->t
23f90 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65  okenprefix ) pre
23fa0 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65  fix = lemp->toke
23fb0 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20  nprefix;.  else 
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a     prefix = "";.
23fe0 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e    in = file_open
23ff0 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29  (lemp,".h","rb")
24000 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20  ;.  if( in ){.  
24010 20 20 69 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a    int nextChar;.
24020 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
24030 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26  emp->nterminal &
24040 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  & fgets(line,LIN
24050 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b  ESIZE,in); i++){
24060 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  .      lemon_spr
24070 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64  intf(pattern,"#d
24080 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33  efine %s%-30s %3
24090 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
240a0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
240b0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
240c0 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
240d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e    if( strcmp(lin
240e0 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65  e,pattern) ) bre
240f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  ak;.    }.    ne
24100 78 74 43 68 61 72 20 3d 20 66 67 65 74 63 28 69  xtChar = fgetc(i
24110 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
24120 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c  n);.    if( i==l
24130 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26  emp->nterminal &
24140 26 20 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20  & nextChar==EOF 
24150 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  ){.      /* No c
24160 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c  hange in the fil
24170 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74  e.  Don't rewrit
24180 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  e it. */.      r
24190 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
241a0 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
241b0 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62  en(lemp,".h","wb
241c0 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  ");.  if( out ){
241d0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
241e0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
241f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   i++){.      fpr
24200 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
24210 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22  e %s%-30s %3d\n"
24220 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
24230 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
24240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c  );.    }.    fcl
24250 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  ose(out);.  }.  
24260 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
24270 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66  duce the size of
24280 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
24290 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  es, if possible,
242a0 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a   by making use.*
242b0 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a  * of defaults..*
242c0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
242d0 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68  sion, we take th
242e0 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20  e most frequent 
242f0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e  REDUCE action an
24300 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65  d make.** it the
24310 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70   default.  Excep
24320 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  t, there is no d
24330 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69  efault if the wi
24340 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ldcard token.** 
24350 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f  is a possible lo
24360 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69  ok-ahead..*/.voi
24370 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
24380 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
24390 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
243a0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
243b0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
243c0 20 2a 61 70 32 2c 20 2a 6e 65 78 74 61 70 3b 0a   *ap2, *nextap;.
243d0 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
243e0 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b  p, *rp2, *rbest;
243f0 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b  .  int nbest, n;
24400 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
24410 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20  usesWildcard;.. 
24420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
24430 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
24440 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
24450 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
24460 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
24470 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  est = 0;.    use
24480 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a  sWildcard = 0;..
24490 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
244a0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
244b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
244c0 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
244d0 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d  && ap->sp==lemp-
244e0 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
244f0 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72       usesWildcar
24500 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
24510 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
24520 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
24530 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
24540 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
24550 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72   if( rp->lhsStar
24560 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
24570 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
24580 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
24590 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
245a0 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
245b0 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
245c0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
245d0 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
245e0 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
245f0 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
24600 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
24610 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
24620 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
24630 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
24640 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
24650 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
24660 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
24670 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
24680 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
24690 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
246a0 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61  /* Do not make a
246b0 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20   default if the 
246c0 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  number of rules 
246d0 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  to default.    *
246e0 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73  * is not at leas
246f0 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69  t 1 or if the wi
24700 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20  ldcard token is 
24710 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  a possible.    *
24720 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  * lookahead..   
24730 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73   */.    if( nbes
24740 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63  t<1 || usesWildc
24750 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ard ) continue;.
24760 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
24770 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45   matching REDUCE
24780 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20   actions into a 
24790 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a  single default *
247a0 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  /.    for(ap=stp
247b0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
247c0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
247d0 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
247e0 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d  CE && ap->x.rp==
247f0 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rbest ) break;. 
24800 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24810 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73   ap );.    ap->s
24820 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  p = Symbol_new("
24830 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20  {default}");.   
24840 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74   for(ap=ap->next
24850 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
24860 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
24870 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
24880 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
24890 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e  t ) ap->type = N
248a0 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  OT_USED;.    }. 
248b0 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
248c0 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
248d0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  );..    for(ap=s
248e0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
248f0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
24900 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48  if( ap->type==SH
24910 49 46 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  IFT ) break;.   
24920 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
24930 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
24940 2e 72 70 21 3d 72 62 65 73 74 20 29 20 62 72 65  .rp!=rbest ) bre
24950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
24960 28 20 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( ap==0 ){.     
24970 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63 65   stp->autoReduce
24980 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 74 70 2d   = 1;.      stp-
24990 3e 70 44 66 6c 74 52 65 64 75 63 65 20 3d 20 72  >pDfltReduce = r
249a0 62 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  best;.    }.  }.
249b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63  .  /* Make a sec
249c0 6f 6e 64 20 70 61 73 73 20 6f 76 65 72 20 61 6c  ond pass over al
249d0 6c 20 73 74 61 74 65 73 20 61 6e 64 20 61 63 74  l states and act
249e0 69 6f 6e 73 2e 20 20 43 6f 6e 76 65 72 74 0a 20  ions.  Convert. 
249f0 20 2a 2a 20 65 76 65 72 79 20 61 63 74 69 6f 6e   ** every action
24a00 20 74 68 61 74 20 69 73 20 61 20 53 48 49 46 54   that is a SHIFT
24a10 20 74 6f 20 61 6e 20 61 75 74 6f 52 65 64 75 63   to an autoReduc
24a20 65 20 73 74 61 74 65 20 69 6e 74 6f 0a 20 20 2a  e state into.  *
24a30 2a 20 61 20 53 48 49 46 54 52 45 44 55 43 45 20  * a SHIFTREDUCE 
24a40 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 66  action..  */.  f
24a50 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
24a60 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
24a70 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
24a80 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
24a90 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
24aa0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
24ab0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
24ac0 65 20 2a 70 4e 65 78 74 53 74 61 74 65 3b 0a 20  e *pNextState;. 
24ad0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
24ae0 65 21 3d 53 48 49 46 54 20 29 20 63 6f 6e 74 69  e!=SHIFT ) conti
24af0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  nue;.      pNext
24b00 53 74 61 74 65 20 3d 20 61 70 2d 3e 78 2e 73 74  State = ap->x.st
24b10 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  p;.      if( pNe
24b20 78 74 53 74 61 74 65 2d 3e 61 75 74 6f 52 65 64  xtState->autoRed
24b30 75 63 65 20 26 26 20 70 4e 65 78 74 53 74 61 74  uce && pNextStat
24b40 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 21 3d  e->pDfltReduce!=
24b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 2d  0 ){.        ap-
24b60 3e 74 79 70 65 20 3d 20 53 48 49 46 54 52 45 44  >type = SHIFTRED
24b70 55 43 45 3b 0a 20 20 20 20 20 20 20 20 61 70 2d  UCE;.        ap-
24b80 3e 78 2e 72 70 20 3d 20 70 4e 65 78 74 53 74 61  >x.rp = pNextSta
24b90 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 3b  te->pDfltReduce;
24ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24bb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
24bc0 49 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e  IFTREDUCE action
24bd0 20 73 70 65 63 69 66 69 65 73 20 61 20 72 75 6c   specifies a rul
24be0 65 20 74 68 61 74 20 68 61 73 20 61 20 73 69 6e  e that has a sin
24bf0 67 6c 65 20 52 48 53 20 74 65 72 6d 0a 20 20 2a  gle RHS term.  *
24c00 2a 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  * (meaning that 
24c10 74 68 65 20 53 48 49 46 54 52 45 44 55 43 45 20  the SHIFTREDUCE 
24c20 77 69 6c 6c 20 6c 61 6e 64 20 62 61 63 6b 20 69  will land back i
24c30 6e 20 74 68 65 20 73 74 61 74 65 20 77 68 65 72  n the state wher
24c40 65 20 69 74 0a 20 20 2a 2a 20 73 74 61 72 74 65  e it.  ** starte
24c50 64 29 20 61 6e 64 20 69 66 20 74 68 65 72 65 20  d) and if there 
24c60 69 73 20 6e 6f 20 43 2d 63 6f 64 65 20 61 73 73  is no C-code ass
24c70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
24c80 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 2c 0a   reduce action,.
24c90 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
24ca0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63 6f   go ahead and co
24cb0 6e 76 65 72 74 20 74 68 65 20 61 63 74 69 6f 6e  nvert the action
24cc0 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
24cd0 61 73 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69  as the.  ** acti
24ce0 6f 6e 20 66 6f 72 20 74 68 65 20 52 48 53 20 6f  on for the RHS o
24cf0 66 20 74 68 65 20 72 75 6c 65 2e 0a 20 20 2a 2f  f the rule..  */
24d00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
24d10 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
24d20 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
24d30 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
24d40 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
24d50 20 61 70 3b 20 61 70 3d 6e 65 78 74 61 70 29 7b   ap; ap=nextap){
24d60 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20  .      nextap = 
24d70 61 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20  ap->next;.      
24d80 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 53 48  if( ap->type!=SH
24d90 49 46 54 52 45 44 55 43 45 20 29 20 63 6f 6e 74  IFTREDUCE ) cont
24da0 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
24db0 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
24dc0 20 69 66 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 3d   if( rp->noCode=
24dd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24de0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 72 68       if( rp->nrh
24df0 73 21 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  s!=1 ) continue;
24e00 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20  .#if 1.      /* 
24e10 4f 6e 6c 79 20 61 70 70 6c 79 20 74 68 69 73 20  Only apply this 
24e20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
24e30 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 2e 20 20  non-terminals.  
24e40 49 74 20 77 6f 75 6c 64 20 62 65 20 4f 4b 20 74  It would be OK t
24e50 6f 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 79  o.      ** apply
24e60 20 69 74 20 74 6f 20 74 65 72 6d 69 6e 61 6c 20   it to terminal 
24e70 73 79 6d 62 6f 6c 73 20 74 6f 6f 2c 20 62 75 74  symbols too, but
24e80 20 74 68 61 74 20 6d 61 6b 65 73 20 74 68 65 20   that makes the 
24e90 70 61 72 73 65 72 20 74 61 62 6c 65 73 0a 20 20  parser tables.  
24ea0 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 2a      ** larger. *
24eb0 2f 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  /.      if( ap->
24ec0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
24ed0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
24ee0 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  inue;.#endif.   
24ef0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
24f00 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
24f10 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6d   means the optim
24f20 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 61  ization can be a
24f30 70 70 6c 69 65 64 20 2a 2f 0a 20 20 20 20 20 20  pplied */.      
24f40 6e 65 78 74 61 70 20 3d 20 61 70 3b 0a 20 20 20  nextap = ap;.   
24f50 20 20 20 66 6f 72 28 61 70 32 3d 73 74 70 2d 3e     for(ap2=stp->
24f60 61 70 3b 20 61 70 32 20 26 26 20 28 61 70 32 3d  ap; ap2 && (ap2=
24f70 3d 61 70 20 7c 7c 20 61 70 32 2d 3e 73 70 21 3d  =ap || ap2->sp!=
24f80 72 70 2d 3e 6c 68 73 29 3b 20 61 70 32 3d 61 70  rp->lhs); ap2=ap
24f90 32 2d 3e 6e 65 78 74 29 7b 7d 0a 20 20 20 20 20  2->next){}.     
24fa0 20 61 73 73 65 72 74 28 20 61 70 32 21 3d 30 20   assert( ap2!=0 
24fb0 29 3b 0a 20 20 20 20 20 20 61 70 2d 3e 73 70 4f  );.      ap->spO
24fc0 70 74 20 3d 20 61 70 32 2d 3e 73 70 3b 0a 20 20  pt = ap2->sp;.  
24fd0 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 61      ap->type = a
24fe0 70 32 2d 3e 74 79 70 65 3b 0a 20 20 20 20 20 20  p2->type;.      
24ff0 61 70 2d 3e 78 20 3d 20 61 70 32 2d 3e 78 3b 0a  ap->x = ap2->x;.
25000 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
25010 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
25020 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69  states for sorti
25030 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
25040 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20  e smaller state 
25050 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69  is the.** one wi
25060 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d  th the most non-
25070 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
25080 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20  .  If they have 
25090 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
250a0 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  ** of non-termin
250b0 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e  al actions, then
250c0 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20   the smaller is 
250d0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
250e0 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61   most.** token a
250f0 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
25100 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72  c int stateResor
25110 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  tCompare(const v
25120 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
25130 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20  id *b){.  const 
25140 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41  struct state *pA
25150 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
25160 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63  t state**)a;.  c
25170 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
25180 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pB = *(const 
25190 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62  struct state**)b
251a0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20  ;.  int n;..  n 
251b0 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70  = pB->nNtAct - p
251c0 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28  A->nNtAct;.  if(
251d0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d   n==0 ){.    n =
251e0 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70   pB->nTknAct - p
251f0 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  A->nTknAct;.    
25200 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
25210 20 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e    n = pB->staten
25220 75 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75  um - pA->statenu
25230 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  m;.    }.  }.  a
25240 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20  ssert( n!=0 );. 
25250 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
25260 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e  *.** Renumber an
25270 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20  d resort states 
25280 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
25290 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
252a0 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68  s.** occur at th
252b0 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20  e end.  Except, 
252c0 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20  keep state 0 as 
252d0 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
252e0 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  .*/.void ResortS
252f0 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
25300 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
25310 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
25320 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
25330 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
25340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
25350 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
25360 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
25370 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
25380 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
25390 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
253a0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65      stp->iDfltRe
253b0 64 75 63 65 20 3d 20 2d 31 3b 20 2f 2a 20 49 6e  duce = -1; /* In
253c0 69 74 20 64 66 6c 74 20 61 63 74 69 6f 6e 20 74  it dflt action t
253d0 6f 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72 22  o "syntax error"
253e0 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b   */.    stp->iTk
253f0 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  nOfst = NO_OFFSE
25400 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f  T;.    stp->iNtO
25410 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
25420 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
25430 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
25440 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  next){.      int
25450 20 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75   iAction = compu
25460 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61  te_action(lemp,a
25470 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 41  p);.      if( iA
25480 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  ction>=0 ){.    
25490 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
254a0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
254b0 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  minal ){.       
254c0 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b     stp->nTknAct+
254d0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
254e0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
254f0 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  ex<lemp->nsymbol
25500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
25510 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20  p->nNtAct++;.   
25520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74        assert( st
25540 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d 3d 30  p->autoReduce==0
25550 20 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74 52 65   || stp->pDfltRe
25560 64 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70 20 29  duce==ap->x.rp )
25570 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  ;.          stp-
25580 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 69  >iDfltReduce = i
25590 41 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Action;.        
255a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
255b0 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d    }.  qsort(&lem
255c0 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65  p->sorted[1], le
255d0 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69  mp->nstate-1, si
255e0 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65  zeof(lemp->sorte
255f0 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73  d[0]),.        s
25600 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
25610 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
25620 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
25630 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
25640 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e  orted[i]->staten
25650 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65  um = i;.  }.  le
25660 6d 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65  mp->nxstate = le
25670 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
25680 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61  ile( lemp->nxsta
25690 74 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f  te>1 && lemp->so
256a0 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61  rted[lemp->nxsta
256b0 74 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63  te-1]->autoReduc
256c0 65 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e  e ){.    lemp->n
256d0 78 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a  xstate--;.  }.}.
256e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
256f0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
25700 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a  le "set.c" *****
25710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
25730 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70  ./*.** Set manip
25740 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ulation routines
25750 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
25760 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
25770 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
25780 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65  size = 0;../* Se
25790 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a  t the set size *
257a0 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69  /.void SetSize(i
257b0 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n).{.  size =
257c0 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
257d0 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
257e0 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76  /.char *SetNew(v
257f0 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  oid){.  char *s;
25800 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61  .  s = (char*)ca
25810 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a  lloc( size, 1);.
25820 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
25830 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
25840 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
25850 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
25860 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
25870 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61  ;.}../* Dealloca
25880 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64  te a set */.void
25890 20 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73   SetFree(char *s
258a0 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d  ).{.  free(s);.}
258b0 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65  ../* Add a new e
258c0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65  lement to the se
258d0 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  t.  Return TRUE 
258e0 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77  if the element w
258f0 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20  as added.** and 
25900 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20  FALSE if it was 
25910 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a  already there. *
25920 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
25930 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20  r *s, int e).{. 
25940 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72   int rv;.  asser
25950 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a  t( e>=0 && e<siz
25960 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d  e );.  rv = s[e]
25970 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
25980 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
25990 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
259a0 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
259b0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
259c0 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
259d0 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
259e0 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29  r *s1, char *s2)
259f0 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67  .{.  int i, prog
25a00 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73  ress;.  progress
25a10 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
25a20 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20   i<size; i++){. 
25a30 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20     if( s2[i]==0 
25a40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25a50 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a  if( s1[i]==0 ){.
25a60 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
25a70 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20   1;.      s1[i] 
25a80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
25a90 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73   return progress
25aa0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
25ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
25ac0 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
25ad0 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
25ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25af0 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65  /./*.** All code
25b00 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61   in this file ha
25b10 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63  s been automatic
25b20 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a  ally generated.*
25b30 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69  * from a specifi
25b40 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  cation in the fi
25b50 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
25b60 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20     "table.q".** 
25b70 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69  by the associati
25b80 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75  ve array code bu
25b90 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22  ilding program "
25ba0 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f  aagen"..** Do no
25bb0 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65  t edit this file
25bc0 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74  !  Instead, edit
25bd0 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69   the specificati
25be0 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  on.** file, then
25bf0 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f   rerun aagen..*/
25c00 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
25c10 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65  processing table
25c20 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
25c30 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
25c40 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73  .*/..PRIVATE uns
25c50 69 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f  igned strhash(co
25c60 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20  nst char *x).{. 
25c70 20 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b   unsigned h = 0;
25c80 0a 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68  .  while( *x ) h
25c90 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29   = h*13 + *(x++)
25ca0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
25cb0 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  ./* Works like s
25cc0 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20  trdup, sort of. 
25cd0 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69   Save a string i
25ce0 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72  n malloced memor
25cf0 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73  y, but.** keep s
25d00 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c  trings in a tabl
25d10 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61  e so that the sa
25d20 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  me string is not
25d30 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e   in more.** than
25d40 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63   one place..*/.c
25d50 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
25d60 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79  fe(const char *y
25d70 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
25d80 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79   *z;.  char *cpy
25d90 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
25da0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
25db0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
25dc0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
25dd0 63 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c  cpy=(char *)mall
25de0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
25df0 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20  y)+1 ))!=0 ){.  
25e00 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63    lemon_strcpy(c
25e10 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63  py,y);.    z = c
25e20 70 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f  py;.    Strsafe_
25e30 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20  insert(z);.  }. 
25e40 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b   MemoryCheck(z);
25e50 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
25e60 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
25e70 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
25e80 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
25e90 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
25ea0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
25eb0 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
25ec0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b  */.struct s_x1 {
25ed0 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
25ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25ef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
25f00 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
25f30 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
25f40 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
25f50 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
25f80 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fa0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
25fb0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
25fc0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
25fd0 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x1node *tbl;  /*
25fe0 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
25ff0 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
26000 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x1node **ht;
26010 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
26020 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
26030 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
26040 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
26050 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
26060 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
26070 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
26080 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
26090 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
260a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
260b0 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e  s_x1node {.  con
260c0 73 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  st char *data;  
260d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
260e0 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
260f0 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
26100 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
26110 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
26120 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
26130 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
26140 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
26150 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
26160 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
26170 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
26180 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
26190 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
261a0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
261b0 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
261c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
261d0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
261e0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
261f0 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  e_init(void){.  
26200 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e  if( x1a ) return
26210 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63  ;.  x1a = (struc
26220 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x1*)malloc( 
26230 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
26240 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61  x1) );.  if( x1a
26250 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a   ){.    x1a->siz
26260 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31  e = 1024;.    x1
26270 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
26280 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31    x1a->tbl = (x1
26290 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32  node*)calloc(102
262a0 34 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  4, sizeof(x1node
262b0 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
262c0 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31  e*));.    if( x1
262d0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
262e0 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
262f0 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
26300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
26310 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
26320 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
26330 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
26340 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
26350 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
26360 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
26370 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
26380 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
26390 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
263a0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
263b0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
263c0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
263d0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
263e0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
263f0 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
26400 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
26410 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f   *data).{.  x1no
26420 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
26430 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
26440 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d   ph;..  if( x1a=
26450 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26460 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61   ph = strhash(da
26470 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
26480 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
26490 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
264a0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
264b0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
264c0 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
264d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
264e0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
264f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
26500 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
26510 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
26520 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
26530 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
26540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
26550 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
26560 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
26570 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x1a->count>=
26580 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x1a->size ){.   
26590 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
265a0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
265b0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
265c0 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20  t i,arrSize;.   
265d0 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
265e0 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
265f0 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78  ze = arrSize = x
26600 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
26610 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
26620 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
26630 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
26640 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  e*)calloc(arrSiz
26650 65 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  e, sizeof(x1node
26660 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
26670 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72  e*));.    if( ar
26680 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
26690 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
266a0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
266b0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
266c0 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  ay.ht = (x1node*
266d0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72  *)&(array.tbl[ar
266e0 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  rSize]);.    for
266f0 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b  (i=0; i<arrSize;
26700 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
26710 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
26720 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
26730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
26740 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
26750 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
26760 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
26770 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
26780 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
26790 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
267a0 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
267b0 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
267c0 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
267d0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
267e0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
267f0 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
26800 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
26810 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
26820 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
26830 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
26840 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
26850 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
26860 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
26870 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
26880 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d   }.    free(x1a-
26890 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20  >tbl);.    *x1a 
268a0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
268b0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
268c0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
268d0 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
268e0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d  );.  np = &(x1a-
268f0 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x1a->count+
26900 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
26910 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31  = data;.  if( x1
26920 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e  a->ht[h] ) x1a->
26930 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
26940 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
26950 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b  >next = x1a->ht[
26960 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d  h];.  x1a->ht[h]
26970 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
26980 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d  m = &(x1a->ht[h]
26990 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
269a0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
269b0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
269c0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
269d0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
269e0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
269f0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73  uch key. */.cons
26a00 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  t char *Strsafe_
26a10 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20  find(const char 
26a20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  *key).{.  unsign
26a30 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a  ed h;.  x1node *
26a40 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  np;..  if( x1a==
26a50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26a60 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
26a70 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
26a80 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
26a90 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
26aa0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
26ab0 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29  mp(np->data,key)
26ac0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26ad0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
26ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
26af0 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
26b00 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
26b10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74  ointer to the (t
26b20 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65  erminal or nonte
26b30 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22  rminal) symbol "
26b40 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  x"..** Create a 
26b50 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68  new symbol if th
26b60 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
26b70 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65  time "x" has bee
26b80 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63  n seen..*/.struc
26b90 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
26ba0 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20  _new(const char 
26bb0 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  *x).{.  struct s
26bc0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70  ymbol *sp;..  sp
26bd0 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
26be0 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29  );.  if( sp==0 )
26bf0 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75  {.    sp = (stru
26c00 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c  ct symbol *)call
26c10 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
26c20 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20  uct symbol) );. 
26c30 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
26c40 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65  p);.    sp->name
26c50 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20   = Strsafe(x);. 
26c60 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53     sp->type = IS
26c70 55 50 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d  UPPER(*x) ? TERM
26c80 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e  INAL : NONTERMIN
26c90 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65  AL;.    sp->rule
26ca0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61   = 0;.    sp->fa
26cb0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
26cc0 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20  sp->prec = -1;. 
26cd0 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55     sp->assoc = U
26ce0 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73  NK;.    sp->firs
26cf0 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70  tset = 0;.    sp
26d00 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
26d10 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e  _FALSE;.    sp->
26d20 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
26d30 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65      sp->destLine
26d40 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  no = 0;.    sp->
26d50 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
26d60 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30    sp->useCnt = 0
26d70 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.    Symbol_ins
26d80 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29  ert(sp,sp->name)
26d90 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43  ;.  }.  sp->useC
26da0 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73  nt++;.  return s
26db0 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  p;.}../* Compare
26dc0 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72   two symbols for
26dd0 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
26de0 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
26df0 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72  ive,.** zero, or
26e00 20 70 6f 73 69 74 69 76 65 20 69 66 20 61 20 69   positive if a i
26e10 73 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75  s less then, equ
26e20 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
26e30 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a  r.** than b..**.
26e40 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20  ** Symbols that 
26e50 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72  begin with upper
26e60 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74   case letters (t
26e70 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65  erminals or toke
26e80 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74  ns).** must sort
26e90 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20   before symbols 
26ea0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
26eb0 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65  lower case lette
26ec0 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69  rs.** (non-termi
26ed0 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54  nals).  And MULT
26ee0 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c  ITERMINAL symbol
26ef0 73 20 28 63 72 65 61 74 65 64 20 75 73 69 6e 67  s (created using
26f00 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63   the.** %token_c
26f10 6c 61 73 73 20 64 69 72 65 63 74 69 76 65 29 20  lass directive) 
26f20 6d 75 73 74 20 73 6f 72 74 20 61 74 20 74 68 65  must sort at the
26f30 20 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72   very end. Other
26f40 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74   than.** that, t
26f50 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f  he order does no
26f60 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  t matter..**.** 
26f70 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65  We find experime
26f80 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76  ntally that leav
26f90 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  ing the symbols 
26fa0 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
26fb0 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20  l.** order (the 
26fc0 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61  order they appea
26fd0 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  red in the gramm
26fe0 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74  ar file) gives t
26ff0 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70  he.** smallest p
27000 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20  arser tables in 
27010 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53  SQLite..*/.int S
27020 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20  ymbolcmpp(const 
27030 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20  void *_a, const 
27040 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  void *_b).{.  co
27050 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
27060 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73  l *a = *(const s
27070 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
27080 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   _a;.  const str
27090 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20  uct symbol *b = 
270a0 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
270b0 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20  ymbol **) _b;.  
270c0 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65  int i1 = a->type
270d0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
270e0 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : a->name[0]
270f0 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
27100 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65  int i2 = b->type
27110 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
27120 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : b->name[0]
27130 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
27140 72 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20  return i1==i2 ? 
27150 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e  a->index - b->in
27160 64 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d  dex : i1 - i2;.}
27170 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
27180 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
27190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
271a0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
271b0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
271c0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
271d0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32  ..*/.struct s_x2
271e0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27200 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
27210 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
27220 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
27230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
27240 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
27250 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
27260 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
27290 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
272a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
272b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
272c0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
272d0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
272e0 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x2node *tbl;  
272f0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
27300 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
27310 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68  uct s_x2node **h
27320 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
27330 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
27340 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
27350 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
27360 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
27370 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
27380 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
27390 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
273a0 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a  y of type "x2"..
273b0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
273c0 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73  t s_x2node {.  s
273d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
273e0 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ta;     /* The d
273f0 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
27400 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
27410 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
27420 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
27430 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
27440 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
27450 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
27460 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
27470 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
27480 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
27490 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x2node;../* Ther
274a0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
274b0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
274c0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
274d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
274e0 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
274f0 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  2 *x2a;../* Allo
27500 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
27510 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
27520 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
27530 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 32  (void){.  if( x2
27540 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32  a ) return;.  x2
27550 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32  a = (struct s_x2
27560 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
27570 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b  (struct s_x2) );
27580 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20  .  if( x2a ){.  
27590 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x2a->size = 12
275a0 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e  8;.    x2a->coun
275b0 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e  t = 0;.    x2a->
275c0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63  tbl = (x2node*)c
275d0 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f  alloc(128, sizeo
275e0 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
275f0 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x2node*));.  
27600 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
27610 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
27620 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
27630 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
27640 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
27650 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
27660 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
27670 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
27680 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
27690 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
276a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
276b0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
276c0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
276d0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
276e0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
276f0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
27700 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
27710 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
27720 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
27730 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
27740 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20  t symbol *data, 
27750 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
27760 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
27770 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
27780 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20   unsigned ph;.. 
27790 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
277a0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
277b0 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  trhash(key);.  h
277c0 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
277d0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32  ze-1);.  np = x2
277e0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
277f0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
27800 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c   strcmp(np->key,
27810 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
27820 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
27830 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
27840 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
27850 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
27860 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
27870 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
27880 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
27890 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
278a0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
278b0 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63    }.  if( x2a->c
278c0 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20  ount>=x2a->size 
278d0 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
278e0 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
278f0 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
27900 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a      int i,arrSiz
27910 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
27920 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x2 array;.    ar
27930 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69  ray.size = arrSi
27940 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
27950 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
27960 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
27970 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
27980 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x2node*)calloc(
27990 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
279a0 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
279b0 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x2node*));.    
279c0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
279d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
279e0 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
279f0 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
27a00 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
27a10 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  2node**)&(array.
27a20 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20  tbl[arrSize]);. 
27a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
27a40 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  rSize; i++) arra
27a50 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
27a60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
27a70 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
27a80 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
27a90 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
27aa0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
27ab0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
27ac0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
27ad0 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a  ->key) & (arrSiz
27ae0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
27af0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
27b00 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
27b10 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
27b20 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
27b30 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
27b40 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
27b50 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
27b60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
27b70 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
27b80 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
27b90 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
27ba0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
27bb0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
27bc0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
27bd0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
27be0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
27bf0 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
27c00 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
27c10 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
27c20 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
27c30 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
27c40 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
27c50 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
27c60 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
27c70 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
27c80 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
27c90 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
27ca0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
27cb0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
27cc0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
27cd0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
27ce0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
27cf0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
27d00 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
27d10 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
27d20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
27d30 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
27d40 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
27d50 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
27d60 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
27d70 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
27d80 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73  Symbol_find(cons
27d90 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
27da0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
27db0 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  2node *np;..  if
27dc0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
27dd0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
27de0 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e  sh(key) & (x2a->
27df0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
27e00 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
27e10 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
27e20 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
27e30 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
27e40 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
27e50 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
27e60 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
27e70 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
27e80 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61  rn the n-th data
27e90 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
27ea0 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f n is out of ra
27eb0 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  nge. */.struct s
27ec0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
27ed0 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72  h(int n).{.  str
27ee0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
27ef0 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
27f00 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
27f10 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
27f20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
27f30 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
27f40 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
27f50 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
27f60 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
27f70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
27f80 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
27f90 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
27fa0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
27fb0 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
27fc0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
27fd0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
27fe0 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
27ff0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
28000 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
28010 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
28020 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
28030 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
28040 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
28050 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
28060 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
28070 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
28080 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
28090 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
280a0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53  ay;.  int i,arrS
280b0 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d  ize;.  if( x2a==
280c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
280d0 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63  arrSize = x2a->c
280e0 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
280f0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
28100 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
28110 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
28120 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66  symbol *));.  if
28130 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
28140 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
28150 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
28160 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x2a->tbl[i].d
28170 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
28180 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43  n array;.}../* C
28190 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69  ompare two confi
281a0 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74  gurations */.int
281b0 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74   Configcmp(const
281c0 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20   char *_a,const 
281d0 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  char *_b).{.  co
281e0 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69  nst struct confi
281f0 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63  g *a = (struct c
28200 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63  onfig *) _a;.  c
28210 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66  onst struct conf
28220 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20  ig *b = (struct 
28230 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20  config *) _b;.  
28240 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e  int x;.  x = a->
28250 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72  rp->index - b->r
28260 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  p->index;.  if( 
28270 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f  x==0 ) x = a->do
28280 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65  t - b->dot;.  re
28290 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f  turn x;.}../* Co
282a0 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73  mpare two states
282b0 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
282c0 73 74 61 74 65 63 6d 70 28 73 74 72 75 63 74 20  statecmp(struct 
282d0 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63  config *a, struc
282e0 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20  t config *b).{. 
282f0 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72   int rc;.  for(r
28300 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20  c=0; rc==0 && a 
28310 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20  && b;  a=a->bp, 
28320 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63  b=b->bp){.    rc
28330 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
28340 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
28350 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
28360 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d  rc = a->dot - b-
28370 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >dot;.  }.  if( 
28380 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
28390 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20   a ) rc = 1;.   
283a0 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31   if( b ) rc = -1
283b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
283c0 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  c;.}../* Hash a 
283d0 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45  state */.PRIVATE
283e0 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68   unsigned stateh
283f0 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ash(struct confi
28400 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  g *a).{.  unsign
28410 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  ed h=0;.  while(
28420 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
28430 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
28440 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
28450 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
28460 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
28470 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
28480 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
28490 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
284a0 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
284b0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
284c0 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e  e *newstate;.  n
284d0 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63  ewstate = (struc
284e0 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63  t state *)calloc
284f0 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
28500 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65  t state) );.  Me
28510 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61  moryCheck(newsta
28520 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  te);.  return ne
28530 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68  wstate;.}../* Th
28540 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
28550 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
28560 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
28570 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
28580 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
28590 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
285a0 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
285b0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
285c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
285d0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
285e0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
28610 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
28620 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
28630 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
28650 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
28660 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
28670 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28680 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
28690 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
286a0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
286b0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
286c0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
286d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
286e0 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
286f0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
28700 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
28710 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
28720 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
28730 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
28740 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
28750 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
28760 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
28770 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
28780 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
28790 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
287a0 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287c0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
287d0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
287e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
287f0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
28800 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
28810 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
28820 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
28830 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
28840 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
28850 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
28860 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
28870 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
28880 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
28890 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
288a0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
288b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
288c0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
288d0 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
288e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
288f0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
28900 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
28910 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78  t(void){.  if( x
28920 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
28930 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
28940 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
28950 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
28960 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
28970 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
28980 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
28990 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
289a0 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
289b0 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65  calloc(128, size
289c0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
289d0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x3node*));. 
289e0 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d     if( x3a->tbl=
289f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
28a00 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61  (x3a);.      x3a
28a10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28a20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
28a30 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78      x3a->ht = (x
28a40 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74  3node**)&(x3a->t
28a50 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
28a60 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
28a70 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20  i++) x3a->ht[i] 
28a80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
28a90 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
28aa0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
28ab0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28ac0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
28ad0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
28ae0 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
28af0 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
28b00 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
28b10 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ate_insert(struc
28b20 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73  t state *data, s
28b30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
28b40 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y).{.  x3node *n
28b50 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
28b60 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
28b70 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
28b80 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
28b90 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b   statehash(key);
28ba0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
28bb0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
28bc0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
28bd0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
28be0 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
28bf0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
28c00 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
28c10 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
28c20 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
28c30 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
28c40 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
28c50 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
28c60 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
28c70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
28c80 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
28c90 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
28ca0 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d  x3a->count>=x3a-
28cb0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
28cc0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
28cd0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
28ce0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
28cf0 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72  arrSize;.    str
28d00 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a  uct s_x3 array;.
28d10 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
28d20 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e   arrSize = x3a->
28d30 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
28d40 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
28d50 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
28d60 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63  tbl = (x3node*)c
28d70 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
28d80 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
28d90 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
28da0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
28db0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
28dc0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
28dd0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
28de0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
28df0 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
28e00 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a  array.tbl[arrSiz
28e10 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
28e20 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b  ; i<arrSize; i++
28e30 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
28e40 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
28e50 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
28e60 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
28e70 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
28e80 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
28e90 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
28ea0 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
28eb0 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
28ec0 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
28ed0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
28ee0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
28ef0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
28f00 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
28f10 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
28f20 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
28f30 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
28f40 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
28f50 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
28f60 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
28f70 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
28f80 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
28f90 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
28fa0 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
28fb0 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
28fc0 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
28fd0 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c     free(x3a->tbl
28fe0 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72  );.    *x3a = ar
28ff0 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
29000 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
29010 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
29020 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
29030 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c   np = &(x3a->tbl
29040 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x3a->count++]);
29050 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
29060 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
29070 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e  ata;.  if( x3a->
29080 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b  ht[h] ) x3a->ht[
29090 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
290a0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
290b0 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  xt = x3a->ht[h];
290c0 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x3a->ht[h] = 
290d0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
290e0 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x3a->ht[h]);.
290f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
29100 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
29110 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
29120 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
29130 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
29140 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
29150 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
29160 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e  state *State_fin
29170 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
29180 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  *key).{.  unsign
29190 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a  ed h;.  x3node *
291a0 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  np;..  if( x3a==
291b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
291c0 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
291d0 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  y) & (x3a->size-
291e0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
291f0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
29200 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
29210 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
29220 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
29230 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
29240 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
29250 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
29260 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
29270 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
29280 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
29290 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
292a0 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
292b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
292c0 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
292d0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
292e0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
292f0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
29300 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
29310 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
29320 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 76 6f  State_arrayof(vo
29330 69 64 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  id).{.  struct s
29340 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20  tate **array;.  
29350 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20  int i,arrSize;. 
29360 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
29370 74 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a  turn 0;.  arrSiz
29380 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x3a->count;.
29390 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
293a0 74 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f  t state **)callo
293b0 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
293c0 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  f(struct state *
293d0 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20  ));.  if( array 
293e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
293f0 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
29400 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e  array[i] = x3a->
29410 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
29420 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
29430 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f  .}../* Hash a co
29440 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
29450 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20  RIVATE unsigned 
29460 63 6f 6e 66 69 67 68 61 73 68 28 73 74 72 75 63  confighash(struc
29470 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
29480 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20   unsigned h=0;. 
29490 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
294a0 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
294b0 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  ->dot;.  return 
294c0 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  h;.}../* There i
294d0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
294e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
294f0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
29500 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
29510 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
29520 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x4"..*/.struct 
29530 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x4 {.  int siz
29540 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29550 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
29560 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
29570 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
295a0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
295b0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
295e0 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
295f0 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
29600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29610 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
29620 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
29630 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62  uct s_x4node *tb
29640 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
29650 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
29660 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
29670 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
29680 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
29690 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
296a0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
296b0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
296c0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
296d0 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
296e0 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
296f0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
29700 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  4"..*/.typedef s
29710 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b  truct s_x4node {
29720 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
29730 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
29740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29750 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
29760 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x4node *next;
29770 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
29780 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
29790 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
297a0 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x4node **from;
297b0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
297c0 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a  nk */.} x4node;.
297d0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
297e0 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
297f0 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
29800 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
29810 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
29820 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a  ruct s_x4 *x4a;.
29830 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
29840 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
29850 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  rray */.void Con
29860 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f  figtable_init(vo
29870 69 64 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29  id){.  if( x4a )
29880 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d   return;.  x4a =
29890 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d   (struct s_x4*)m
298a0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
298b0 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20  ruct s_x4) );.  
298c0 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78  if( x4a ){.    x
298d0 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20  4a->size = 64;. 
298e0 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20     x4a->count = 
298f0 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20  0;.    x4a->tbl 
29900 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x4node*)callo
29910 63 28 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e  c(64, sizeof(x4n
29920 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
29930 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
29940 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
29950 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
29960 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
29970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29980 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
29990 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
299a0 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
299b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
299c0 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
299d0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
299e0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
299f0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
29a00 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
29a10 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
29a20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
29a30 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
29a40 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
29a50 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
29a60 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
29a70 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
29a80 63 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a  config *data).{.
29a90 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x4node *np;.  
29aa0 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
29ab0 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
29ac0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
29ad0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66  n 0;.  ph = conf
29ae0 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  ighash(data);.  
29af0 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
29b00 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
29b10 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
29b20 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
29b30 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e  ( Configcmp((con
29b40 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64  st char *) np->d
29b50 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20  ata,(const char 
29b60 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  *) data)==0 ){. 
29b70 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
29b80 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
29b90 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
29ba0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
29bb0 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
29bc0 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
29bd0 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
29be0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
29bf0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
29c00 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
29c10 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
29c20 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
29c30 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
29c40 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
29c50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72   */.    int i,ar
29c60 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  rSize;.    struc
29c70 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
29c80 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61    array.size = a
29c90 72 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  rrSize = x4a->si
29ca0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
29cb0 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
29cc0 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
29cd0 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c  l = (x4node*)cal
29ce0 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
29cf0 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
29d00 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
29d10 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
29d20 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
29d30 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
29d40 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
29d50 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
29d60 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
29d70 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d  ray.tbl[arrSize]
29d80 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
29d90 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
29da0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
29db0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29dc0 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
29dd0 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
29de0 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
29df0 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
29e00 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
29e10 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
29e20 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
29e30 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
29e40 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
29e50 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
29e60 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
29e70 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
29e80 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
29e90 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
29ea0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
29eb0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
29ec0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
29ed0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
29ee0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
29ef0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
29f00 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
29f10 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
29f20 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
29f30 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
29f40 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
29f50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
29f60 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
29f70 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
29f80 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
29f90 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
29fa0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
29fb0 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
29fc0 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
29fd0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
29fe0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
29ff0 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
2a000 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
2a010 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
2a020 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
2a030 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
2a040 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2a050 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
2a060 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
2a070 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
2a080 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
2a090 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
2a0a0 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
2a0b0 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ble_find(struct 
2a0c0 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
2a0d0 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65   int h;.  x4node
2a0e0 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61   *np;..  if( x4a
2a0f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2a100 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
2a110 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69  (key) & (x4a->si
2a120 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
2a130 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
2a140 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
2a150 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73   Configcmp((cons
2a160 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61  t char *) np->da
2a170 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta,(const char *
2a180 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  ) key)==0 ) brea
2a190 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
2a1a0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
2a1b0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
2a1c0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f   : 0;.}../* Remo
2a1d0 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  ve all data from
2a1e0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73   the table.  Pas
2a1f0 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74  s each data to t
2a200 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a  he function "f".
2a210 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f  ** as it is remo
2a220 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62  ved.  ("f" may b
2a230 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20  e null to avoid 
2a240 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76  this step.) */.v
2a250 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
2a260 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74  clear(int(*f)(st
2a270 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a  ruct config *)).
2a280 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2a290 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
2a2a0 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
2a2b0 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
2a2c0 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
2a2d0 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
2a2e0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
2a2f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
2a300 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
2a310 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
2a320 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
2a330 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.