/ Hex Artifact Content
Login

Artifact 33892e2a243865f73e6c6e7cecce3c6eb4bb95db4a3d9d86d146c8064feb92fd:


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 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
166d0 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
166e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
166f0 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
16700 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
16710 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
16720 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
16730 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
16740 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
16750 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
16760 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
16770 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
16780 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
16790 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
167a0 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
167b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
167c0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
167d0 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
167e0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
167f0 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
16800 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
16810 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
16820 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
16830 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
16840 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
16850 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
16860 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
16870 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
16880 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
16890 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
168a0 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
168b0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
168c0 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
168d0 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
168e0 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
168f0 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
16900 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20 63   ISSPACE(c) ){ c
16910 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
16920 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
16930 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
16940 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
16950 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
16960 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
16970 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
16980 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
16990 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
169a0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
169b0 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
169c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
169d0 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
169e0 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
169f0 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
16a00 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
16a10 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
16a20 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
16a30 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
16a40 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
16a50 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
16a60 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
16a70 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
16a80 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
16a90 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
16aa0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
16ab0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
16ac0 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
16ad0 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
16ae0 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
16af0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16b00 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
16b10 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
16b20 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
16b30 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
16b40 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
16b50 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
16b60 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b80 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
16b90 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
16ba0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16bb0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
16bc0 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
16bd0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16be0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
16bf0 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
16c00 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
16c10 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
16c20 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
16c30 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
16c40 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
16c50 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
16c60 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
16c70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
16c80 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
16c90 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
16ca0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
16cb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16cc0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
16cd0 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
16ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
16cf0 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
16d00 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
16d10 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
16d20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
16d30 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
16d40 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
16d50 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
16d60 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
16d70 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
16d80 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16d90 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
16da0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
16db0 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
16dc0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
16dd0 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
16de0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16df0 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16e00 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
16e10 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16e20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
16e30 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
16e40 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
16e50 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
16e60 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16e70 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
16e80 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
16e90 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
16ea0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16eb0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16ec0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
16ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
16ee0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16ef0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16f00 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16f10 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
16f20 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
16f30 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
16f40 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
16f50 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
16f60 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
16f70 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
16f80 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
16f90 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
16fa0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16fb0 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
16fc0 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
16fd0 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
16fe0 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
16ff0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
17000 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
17010 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
17020 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
17030 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
17040 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
17050 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
17060 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
17070 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
17080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17090 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
170a0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
170b0 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
170c0 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
170d0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
170f0 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
17100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17120 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
17130 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
17140 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
17150 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
17160 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
17170 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
17180 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
17190 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
171a0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
171b0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
171c0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
171d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
171e0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
171f0 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
17200 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c 4e   }else if( ISALN
17210 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  UM(c) ){        
17220 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
17230 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
17240 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
17250 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
17260 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
17270 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
17280 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17290 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
172a0 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
172b0 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
172c0 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
172d0 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
172e0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
172f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
17300 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
17310 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70 5b  ) && ISALPHA(cp[
17320 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
17330 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
17340 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
17350 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
17360 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
17370 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17380 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
173b0 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
173c0 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
173d0 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
173e0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
173f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
17400 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
17410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
17430 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
17440 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
17450 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
17460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17470 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
17480 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
17490 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
174a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
174b0 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
174c0 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
174d0 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
174e0 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
17500 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
17510 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
17520 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
17530 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
17540 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
17550 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
17560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17570 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
17580 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
17590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175a0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
175b0 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
175c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
175d0 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
175e0 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
175f0 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
17600 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
17610 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
17620 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
17630 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
17640 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
17650 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
17660 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69  k *Plink_new(voi
17670 64 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  d){.  struct pli
17680 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20  nk *newlink;..  
17690 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
176a0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
176b0 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
176c0 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
176d0 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
176e0 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c  uct plink *)call
176f0 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
17700 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b  struct plink) );
17710 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66  .    if( plink_f
17720 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
17730 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17740 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c  rr,.      "Unabl
17750 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
17760 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66  mory for a new f
17770 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
17780 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b  ation link.\n");
17790 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
177a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
177b0 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
177c0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
177d0 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b  i].next = &plink
177e0 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  _freelist[i+1];.
177f0 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
17800 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
17810 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e   0;.  }.  newlin
17820 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  k = plink_freeli
17830 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
17840 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
17850 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
17860 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d  eturn newlink;.}
17870 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b  ../* Add a plink
17880 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74   to a plink list
17890 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61   */.void Plink_a
178a0 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  dd(struct plink 
178b0 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63  **plpp, struct c
178c0 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
178d0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
178e0 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b  wlink;.  newlink
178f0 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a   = Plink_new();.
17900 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20    newlink->next 
17910 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
17920 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65   = newlink;.  ne
17930 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70  wlink->cfp = cfp
17940 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
17950 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
17960 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
17970 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
17980 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
17990 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
179a0 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c   **to, struct pl
179b0 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73  ink *from).{.  s
179c0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
179d0 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72  tpl;.  while( fr
179e0 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  om ){.    nextpl
179f0 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20   = from->next;. 
17a00 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20     from->next = 
17a10 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66  *to;.    *to = f
17a20 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20  rom;.    from = 
17a30 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nextpl;.  }.}../
17a40 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70  * Delete every p
17a50 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
17a60 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64   */.void Plink_d
17a70 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
17a80 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72  nk *plp).{.  str
17a90 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
17aa0 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
17ab0 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
17ac0 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
17ad0 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
17ae0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
17af0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
17b00 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
17b10 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
17b40 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
17b70 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
17b80 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
17b90 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
17ba0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
17bb0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
17bc0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
17bd0 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
17be0 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
17bf0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
17c00 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
17c10 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
17c20 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
17c30 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
17c40 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
17c50 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
17c60 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75  le_makename(stru
17c70 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
17c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
17c90 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61  ix).{.  char *na
17ca0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
17cb0 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
17cc0 20 3d 20 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d   = lemp->filenam
17cd0 65 3b 0a 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20  e;.  int sz;..  
17ce0 69 66 28 20 6f 75 74 70 75 74 44 69 72 20 29 7b  if( outputDir ){
17cf0 0a 20 20 20 20 63 70 20 3d 20 73 74 72 72 63 68  .    cp = strrch
17d00 72 28 66 69 6c 65 6e 61 6d 65 2c 20 27 2f 27 29  r(filename, '/')
17d10 3b 0a 20 20 20 20 69 66 28 20 63 70 20 29 20 66  ;.    if( cp ) f
17d20 69 6c 65 6e 61 6d 65 20 3d 20 63 70 20 2b 20 31  ilename = cp + 1
17d30 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 6c 65 6d  ;.  }.  sz = lem
17d40 6f 6e 53 74 72 6c 65 6e 28 66 69 6c 65 6e 61 6d  onStrlen(filenam
17d50 65 29 3b 0a 20 20 73 7a 20 2b 3d 20 6c 65 6d 6f  e);.  sz += lemo
17d60 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29 3b  nStrlen(suffix);
17d70 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72  .  if( outputDir
17d80 20 29 20 73 7a 20 2b 3d 20 6c 65 6d 6f 6e 53 74   ) sz += lemonSt
17d90 72 6c 65 6e 28 6f 75 74 70 75 74 44 69 72 29 20  rlen(outputDir) 
17da0 2b 20 31 3b 0a 20 20 73 7a 20 2b 3d 20 35 3b 0a  + 1;.  sz += 5;.
17db0 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29    name = (char*)
17dc0 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b 0a 20 20  malloc( sz );.  
17dd0 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
17de0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17df0 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
17e00 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
17e10 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
17e20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
17e30 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 69  name[0] = 0;.  i
17e40 66 28 20 6f 75 74 70 75 74 44 69 72 20 29 7b 0a  f( outputDir ){.
17e50 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
17e60 28 6e 61 6d 65 2c 20 6f 75 74 70 75 74 44 69 72  (name, outputDir
17e70 29 3b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  );.    lemon_str
17e80 63 61 74 28 6e 61 6d 65 2c 20 22 2f 22 29 3b 0a  cat(name, "/");.
17e90 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63    }.  lemon_strc
17ea0 61 74 28 6e 61 6d 65 2c 66 69 6c 65 6e 61 6d 65  at(name,filename
17eb0 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  );.  cp = strrch
17ec0 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  r(name,'.');.  i
17ed0 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b  f( cp ) *cp = 0;
17ee0 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  .  lemon_strcat(
17ef0 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20  name,suffix);.  
17f00 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a  return name;.}..
17f10 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77  /* Open a file w
17f20 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64  ith a name based
17f30 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   on the name of 
17f40 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a  the input file,.
17f50 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64 69  ** but with a di
17f60 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66 69  fferent (specifi
17f70 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ed) suffix, and 
17f80 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
17f90 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61  .** to the strea
17fa0 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  m */.PRIVATE FIL
17fb0 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20  E *file_open(.  
17fc0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17fd0 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp,.  const char
17fe0 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73   *suffix,.  cons
17ff0 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a  t char *mode.){.
18000 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
18010 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
18020 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
18030 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
18040 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
18050 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
18060 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
18070 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
18080 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
18090 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
180a0 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
180b0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
180c0 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
180d0 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
180e0 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
180f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
18100 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
18110 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
18120 50 72 69 6e 74 20 74 68 65 20 74 65 78 74 20 6f  Print the text o
18130 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76 6f 69 64  f a rule.*/.void
18140 20 72 75 6c 65 5f 70 72 69 6e 74 28 46 49 4c 45   rule_print(FILE
18150 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
18160 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 69  le *rp){.  int i
18170 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  , j;.  fprintf(o
18180 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e 6c 68 73  ut, "%s",rp->lhs
18190 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a 20 20 20  ->name);.  /*   
181a0 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
181b0 73 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  s ) fprintf(out,
181c0 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c  "(%s)",rp->lhsal
181d0 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70 72 69 6e  ias); */.  fprin
181e0 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22 29 3b 0a  tf(out," ::=");.
181f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
18200 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
18210 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
18220 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
18230 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
18240 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
18250 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
18260 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
18270 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
18280 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  );.      for(j=1
18290 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
182a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
182b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22  printf(out,"|%s"
182c0 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  , sp->subsym[j]-
182d0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
182e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
182f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
18300 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
18310 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 28 20     }.    /* if( 
18320 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18330 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28  ) fprintf(out,"(
18340 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61  %s)",rp->rhsalia
18350 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d 0a 7d 0a  s[i]); */.  }.}.
18360 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
18370 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
18380 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
18390 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
183a0 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f  s.** on rules */
183b0 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74  .void Reprint(st
183c0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
183d0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
183e0 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
183f0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
18400 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
18410 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
18420 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
18430 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
18440 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
18450 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
18460 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
18470 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
18480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
18490 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
184a0 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
184b0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
184c0 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
184d0 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
184e0 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
184f0 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
18500 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
18510 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
18520 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
18530 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
18540 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
18550 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
18560 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
18570 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
18580 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
18590 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
185a0 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
185b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
185c0 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
185d0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
185e0 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
185f0 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
18600 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
18610 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
18620 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
18630 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
18640 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
18650 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
18660 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
18670 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72  rp->next){.    r
18680 75 6c 65 5f 70 72 69 6e 74 28 73 74 64 6f 75 74  ule_print(stdout
18690 2c 20 72 70 29 3b 0a 20 20 20 20 70 72 69 6e 74  , rp);.    print
186a0 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
186b0 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
186c0 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
186d0 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
186e0 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e  .    /* if( rp->
186f0 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c  code ) printf("\
18700 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64  n    %s",rp->cod
18710 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  e); */.    print
18720 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f("\n");.  }.}..
18730 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  /* Print a singl
18740 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e rule..*/.void 
18750 52 75 6c 65 50 72 69 6e 74 28 46 49 4c 45 20 2a  RulePrint(FILE *
18760 66 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  fp, struct rule 
18770 2a 72 70 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  *rp, int iCursor
18780 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  ){.  struct symb
18790 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c  ol *sp;.  int i,
187a0 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70   j;.  fprintf(fp
187b0 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68  ,"%s ::=",rp->lh
187c0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
187d0 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73  i=0; i<=rp->nrhs
187e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
187f0 69 3d 3d 69 43 75 72 73 6f 72 20 29 20 66 70 72  i==iCursor ) fpr
18800 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20  intf(fp," *");. 
18810 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
18820 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  hs ) break;.    
18830 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
18840 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
18850 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
18860 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
18870 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e  f(fp," %s", sp->
18880 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29  subsym[0]->name)
18890 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ;.      for(j=1;
188a0 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
188b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  j++){.        fp
188c0 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73  rintf(fp,"|%s",s
188d0 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61  p->subsym[j]->na
188e0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
188f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
18900 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20  rintf(fp," %s", 
18910 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
18920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
18930 20 74 68 65 20 72 75 6c 65 20 66 6f 72 20 61 20   the rule for a 
18940 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
18950 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69  /.void ConfigPri
18960 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72  nt(FILE *fp, str
18970 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29  uct config *cfp)
18980 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70  {.  RulePrint(fp
18990 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66 70 2d 3e  , cfp->rp, cfp->
189a0 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64 65 66  dot);.}../* #def
189b0 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20  ine TEST */.#if 
189c0 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74  0./* Print a set
189d0 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
189e0 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65   SetPrint(out,se
189f0 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75  t,lemp).FILE *ou
18a00 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74  t;.char *set;.st
18a10 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18a20 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ;.{.  int i;.  c
18a30 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73  har *spacer;.  s
18a40 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70  pacer = "";.  fp
18a50 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b  rintf(out,"%12s[
18a60 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ","");.  for(i=0
18a70 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
18a80 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nal; i++){.    i
18a90 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69  f( SetFind(set,i
18aa0 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
18ab0 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70  tf(out,"%s%s",sp
18ac0 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  acer,lemp->symbo
18ad0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
18ae0 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22      spacer = " "
18af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
18b00 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29  rintf(out,"]\n")
18b10 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
18b20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50  plink chain */.P
18b30 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e  RIVATE void Plin
18b40 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74  kPrint(out,plp,t
18b50 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  ag).FILE *out;.s
18b60 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
18b70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20  ;.char *tag;.{. 
18b80 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
18b90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
18ba0 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32  %12s%s (state %2
18bb0 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d  d) ","",tag,plp-
18bc0 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65  >cfp->stp->state
18bd0 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  num);.    Config
18be0 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63  Print(out,plp->c
18bf0 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fp);.    fprintf
18c00 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  (out,"\n");.    
18c10 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b  plp = plp->next;
18c20 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
18c30 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f  * Print an actio
18c40 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  n to the given f
18c50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
18c60 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
18c70 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20  .** nothing was 
18c80 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64  actually printed
18c90 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63  ..*/.int PrintAc
18ca0 74 69 6f 6e 28 0a 20 20 73 74 72 75 63 74 20 61  tion(.  struct a
18cb0 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20 20 20  ction *ap,      
18cc0 20 20 20 20 2f 2a 20 54 68 65 20 61 63 74 69 6f      /* The actio
18cd0 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20  n to print */.  
18ce0 46 49 4c 45 20 2a 66 70 2c 20 20 20 20 20 20 20  FILE *fp,       
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
18d00 72 69 6e 74 20 74 68 65 20 61 63 74 69 6f 6e 20  rint the action 
18d10 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  here */.  int in
18d20 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  dent            
18d30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e 74 20        /* Indent 
18d40 62 79 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 2a  by this amount *
18d50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  /.){.  int resul
18d60 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
18d70 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
18d80 20 63 61 73 65 20 53 48 49 46 54 3a 20 7b 0a 20   case SHIFT: {. 
18d90 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
18da0 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78 2e 73  e *stp = ap->x.s
18db0 74 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  tp;.      fprint
18dc0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
18dd0 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e 64         %-7d",ind
18de0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
18df0 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  ,stp->statenum);
18e00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18e10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44    }.    case RED
18e20 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 74 72  UCE: {.      str
18e30 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d 20 61  uct rule *rp = a
18e40 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 66  p->x.rp;.      f
18e50 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
18e60 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64  educe       %-7d
18e70 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
18e80 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65 29  >name,rp->iRule)
18e90 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72 69 6e  ;.      RulePrin
18ea0 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a 20  t(fp, rp, -1);. 
18eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ec0 7d 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  }.    case SHIFT
18ed0 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20  REDUCE: {.      
18ee0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20  struct rule *rp 
18ef0 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
18f00 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18f10 73 20 73 68 69 66 74 2d 72 65 64 75 63 65 20 25  s shift-reduce %
18f20 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
18f30 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75  sp->name,rp->iRu
18f40 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50  le);.      RuleP
18f50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29  rint(fp, rp, -1)
18f60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18f70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 41 43     }.    case AC
18f80 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69  CEPT:.      fpri
18f90 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65  ntf(fp,"%*s acce
18fa0 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  pt",indent,ap->s
18fb0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
18fc0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18fd0 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72  ERROR:.      fpr
18fe0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72  intf(fp,"%*s err
18ff0 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  or",indent,ap->s
19000 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
19010 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19020 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  SRCONFLICT:.    
19030 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a  case RRCONFLICT:
19040 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
19050 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20  p,"%*s reduce   
19060 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72 73      %-7d ** Pars
19070 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
19080 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74  ,.        indent
19090 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
190a0 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ->x.rp->iRule);.
190b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
190c0 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43 54   case SSCONFLICT
190d0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
190e0 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20  fp,"%*s shift   
190f0 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72       %-7d ** Par
19100 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
19110 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  ",.        inden
19120 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
19130 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
19140 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
19150 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
19160 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66  SOLVED:.      if
19170 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  ( showPrecedence
19180 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  Conflict ){.    
19190 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
191a0 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20 20  %*s shift       
191b0 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-7d -- dropped
191c0 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
191d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191e0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
191f0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
19200 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
19210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19220 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
19230 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19240 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
19250 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
19260 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
19270 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
19280 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
19290 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64 20 2d  *s reduce %-7d -
192a0 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
192b0 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
192c0 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
192d0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
192e0 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ->x.rp->iRule);.
192f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19300 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
19320 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
19330 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
19340 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
19350 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
19360 28 20 72 65 73 75 6c 74 20 26 26 20 61 70 2d 3e  ( result && ap->
19370 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66 70 72  spOpt ){.    fpr
19380 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20 62 65  intf(fp,"  /* be
19390 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a 2f 22  cause %s==%s */"
193a0 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 20  , ap->sp->name, 
193b0 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d 65 29  ap->spOpt->name)
193c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
193d0 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
193e0 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74  erate the "*.out
193f0 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
19400 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
19410 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
19420 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  mp).{.  int i, n
19430 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
19440 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
19450 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
19460 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
19470 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
19480 2a 72 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  *rp;.  FILE *fp;
19490 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70  ..  fp = file_op
194a0 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22  en(lemp,".out","
194b0 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  wb");.  if( fp==
194c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
194d0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
194e0 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  xstate; i++){.  
194f0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
19500 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72  rted[i];.    fpr
19510 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25  intf(fp,"State %
19520 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65  d:\n",stp->state
19530 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  num);.    if( le
19540 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
19550 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
19560 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
19570 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
19580 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
19590 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
195a0 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
195b0 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
195c0 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
195d0 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70          lemon_sp
195e0 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22  rintf(buf,"(%d)"
195f0 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75 6c 65 29  ,cfp->rp->iRule)
19600 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
19610 66 28 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c  f(fp,"    %5s ",
19620 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  buf);.      }els
19630 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
19640 74 66 28 66 70 2c 22 20 20 20 20 20 20 20 20 20  tf(fp,"         
19650 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ");.      }.   
19660 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66     ConfigPrint(f
19670 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70  p,cfp);.      fp
19680 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
19690 23 69 66 20 30 0a 20 20 20 20 20 20 53 65 74 50  #if 0.      SetP
196a0 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73  rint(fp,cfp->fws
196b0 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c  ,lemp);.      Pl
196c0 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
196d0 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20  >fplp,"To  ");. 
196e0 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28       PlinkPrint(
196f0 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72  fp,cfp->bplp,"Fr
19700 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  om");.#endif.   
19710 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
19720 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70  isflag ) cfp=cfp
19730 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65  ->bp;.      else
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b    cfp=cfp->next;
19760 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
19770 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
19780 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
19790 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
197a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72 69  ){.      if( Pri
197b0 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33  ntAction(ap,fp,3
197c0 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  0) ) fprintf(fp,
197d0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
197e0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
197f0 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  );.  }.  fprintf
19800 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  (fp, "----------
19810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 5c 6e 22 29 3b 0a  ----------\n");.
19840 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 53    fprintf(fp, "S
19850 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66  ymbols:\n");.  f
19860 70 72 69 6e 74 66 28 66 70 2c 20 22 54 68 65 20  printf(fp, "The 
19870 66 69 72 73 74 2d 73 65 74 20 6f 66 20 6e 6f 6e  first-set of non
19880 2d 74 65 72 6d 69 6e 61 6c 73 20 69 73 20 73 68  -terminals is sh
19890 6f 77 6e 20 61 66 74 65 72 20 74 68 65 20 6e 61  own after the na
198a0 6d 65 2e 5c 6e 5c 6e 22 29 3b 0a 20 20 66 6f 72  me.\n\n");.  for
198b0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
198c0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
198d0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75   int j;.    stru
198e0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
198f0 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
19900 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66  ymbols[i];.    f
19910 70 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33  printf(fp, "  %3
19920 64 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e  d: %s", i, sp->n
19930 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70  ame);.    if( sp
19940 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
19950 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
19960 69 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20  intf(fp, ":");. 
19970 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
19980 62 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  bda ){.        f
19990 70 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61  printf(fp, " <la
199a0 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d  mbda>");.      }
199b0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
199c0 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  j<lemp->ntermina
199d0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
199e0 20 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65   if( sp->firstse
199f0 74 20 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d  t && SetFind(sp-
19a00 3e 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b  >firstset, j) ){
19a10 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
19a20 74 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65  tf(fp, " %s", le
19a30 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e  mp->symbols[j]->
19a40 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
19a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a60 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e     if( sp->prec>
19a70 3d 30 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  =0 ) fprintf(fp,
19a80 22 20 28 70 72 65 63 65 64 65 6e 63 65 3d 25 64  " (precedence=%d
19a90 29 22 2c 20 73 70 2d 3e 70 72 65 63 29 3b 0a 20  )", sp->prec);. 
19aa0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
19ab0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69  \n");.  }.  fpri
19ac0 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d  ntf(fp, "-------
19ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 5c 6e 22  -------------\n"
19b00 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  );.  fprintf(fp,
19b10 20 22 53 79 6e 74 61 78 2d 6f 6e 6c 79 20 53 79   "Syntax-only Sy
19b20 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 70  mbols:\n");.  fp
19b30 72 69 6e 74 66 28 66 70 2c 20 22 54 68 65 20 66  rintf(fp, "The f
19b40 6f 6c 6c 6f 77 69 6e 67 20 73 79 6d 62 6f 6c 73  ollowing symbols
19b50 20 6e 65 76 65 72 20 63 61 72 72 79 20 73 65 6d   never carry sem
19b60 61 6e 74 69 63 20 63 6f 6e 74 65 6e 74 2e 5c 6e  antic content.\n
19b70 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  \n");.  for(i=n=
19b80 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
19b90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
19ba0 74 20 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t w;.    struct 
19bb0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
19bc0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
19bd0 20 20 20 69 66 28 20 73 70 2d 3e 62 43 6f 6e 74     if( sp->bCont
19be0 65 6e 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ent ) continue;.
19bf0 20 20 20 20 77 20 3d 20 28 69 6e 74 29 73 74 72      w = (int)str
19c00 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
19c10 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 2b     if( n>0 && n+
19c20 77 3e 37 35 20 29 7b 0a 20 20 20 20 20 20 66 70  w>75 ){.      fp
19c30 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
19c40 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
19c50 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29   }.    if( n>0 )
19c60 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
19c70 66 70 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20  fp, " ");.      
19c80 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n++;.    }.    f
19c90 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c  printf(fp, "%s",
19ca0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
19cb0 6e 20 2b 3d 20 77 3b 0a 20 20 7d 0a 20 20 69 66  n += w;.  }.  if
19cc0 28 20 6e 3e 30 20 29 20 66 70 72 69 6e 74 66 28  ( n>0 ) fprintf(
19cd0 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 66 70 72  fp, "\n");.  fpr
19ce0 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
19cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 5c 6e  --------------\n
19d20 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
19d30 2c 20 22 52 75 6c 65 73 3a 5c 6e 22 29 3b 0a 20  , "Rules:\n");. 
19d40 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
19d50 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
19d60 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ext){.    fprint
19d70 66 28 66 70 2c 20 22 25 34 64 3a 20 22 2c 20 72  f(fp, "%4d: ", r
19d80 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 72  p->iRule);.    r
19d90 75 6c 65 5f 70 72 69 6e 74 28 66 70 2c 20 72 70  ule_print(fp, rp
19da0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  );.    fprintf(f
19db0 70 2c 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  p,".");.    if( 
19dc0 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 7b 0a 20  rp->precsym ){. 
19dd0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
19de0 22 20 5b 25 73 20 70 72 65 63 65 64 65 6e 63 65  " [%s precedence
19df0 3d 25 64 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  =%d]",.         
19e00 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
19e10 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 70 72 65 63  ->name, rp->prec
19e20 73 79 6d 2d 3e 70 72 65 63 29 3b 0a 20 20 20 20  sym->prec);.    
19e30 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
19e40 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63  ,"\n");.  }.  fc
19e50 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75  lose(fp);.  retu
19e60 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68  rn;.}../* Search
19e70 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e   for the file "n
19e80 61 6d 65 22 20 77 68 69 63 68 20 69 73 20 69 6e  ame" which is in
19e90 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
19ea0 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78  ory as.** the ex
19eb0 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56  acutable */.PRIV
19ec0 41 54 45 20 63 68 61 72 20 2a 70 61 74 68 73 65  ATE char *pathse
19ed0 61 72 63 68 28 63 68 61 72 20 2a 61 72 67 76 30  arch(char *argv0
19ee0 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e  , char *name, in
19ef0 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20 20  t modemask).{.  
19f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
19f10 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61  list;.  char *pa
19f20 74 68 62 75 66 70 74 72 3b 0a 20 20 63 68 61 72  thbufptr;.  char
19f30 20 2a 70 61 74 68 62 75 66 3b 0a 20 20 63 68 61   *pathbuf;.  cha
19f40 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63  r *path,*cp;.  c
19f50 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f  har c;..#ifdef _
19f60 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20  _WIN32__.  cp = 
19f70 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c  strrchr(argv0,'\
19f80 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20  \');.#else.  cp 
19f90 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
19fa0 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  '/');.#endif.  i
19fb0 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d  f( cp ){.    c =
19fc0 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20   *cp;.    *cp = 
19fd0 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  0;.    path = (c
19fe0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65  har *)malloc( le
19ff0 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 30 29  monStrlen(argv0)
1a000 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e   + lemonStrlen(n
1a010 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20  ame) + 2 );.    
1a020 69 66 28 20 70 61 74 68 20 29 20 6c 65 6d 6f 6e  if( path ) lemon
1a030 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25  _sprintf(path,"%
1a040 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65  s/%s",argv0,name
1a050 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a  );.    *cp = c;.
1a060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74    }else{.    pat
1a070 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22  hlist = getenv("
1a080 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
1a090 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61  pathlist==0 ) pa
1a0a0 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e  thlist = ".:/bin
1a0b0 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20  :/usr/bin";.    
1a0c0 70 61 74 68 62 75 66 20 3d 20 28 63 68 61 72 20  pathbuf = (char 
1a0d0 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  *) malloc( lemon
1a0e0 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29  Strlen(pathlist)
1a0f0 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68   + 1 );.    path
1a100 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
1a110 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70  c( lemonStrlen(p
1a120 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74  athlist)+lemonSt
1a130 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a  rlen(name)+2 );.
1a140 20 20 20 20 69 66 28 20 28 70 61 74 68 62 75 66      if( (pathbuf
1a150 20 21 3d 20 30 29 20 26 26 20 28 70 61 74 68 21   != 0) && (path!
1a160 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74  =0) ){.      pat
1a170 68 62 75 66 70 74 72 20 3d 20 70 61 74 68 62 75  hbufptr = pathbu
1a180 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  f;.      lemon_s
1a190 74 72 63 70 79 28 70 61 74 68 62 75 66 2c 20 70  trcpy(pathbuf, p
1a1a0 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  athlist);.      
1a1b0 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20  while( *pathbuf 
1a1c0 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  ){.        cp = 
1a1d0 73 74 72 63 68 72 28 70 61 74 68 62 75 66 2c 27  strchr(pathbuf,'
1a1e0 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
1a1f0 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
1a200 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c  athbuf[lemonStrl
1a210 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20  en(pathbuf)];.  
1a220 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20        c = *cp;. 
1a230 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a         *cp = 0;.
1a240 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70          lemon_sp
1a250 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25  rintf(path,"%s/%
1a260 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d 65 29  s",pathbuf,name)
1a270 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20  ;.        *cp = 
1a280 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  c;.        if( c
1a290 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b 30 5d  ==0 ) pathbuf[0]
1a2a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 6c   = 0;.        el
1a2b0 73 65 20 70 61 74 68 62 75 66 20 3d 20 26 63 70  se pathbuf = &cp
1a2c0 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [1];.        if(
1a2d0 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64   access(path,mod
1a2e0 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61  emask)==0 ) brea
1a2f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1a300 20 66 72 65 65 28 70 61 74 68 62 75 66 70 74 72   free(pathbufptr
1a310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1a320 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f  eturn path;.}../
1a330 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f  * Given an actio
1a340 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69  n, compute the i
1a350 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1a360 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20   that action.** 
1a370 77 68 69 63 68 20 69 73 20 74 6f 20 62 65 20 70  which is to be p
1a380 75 74 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e  ut in the action
1a390 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65   table of the ge
1a3a0 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e  nerated machine.
1a3b0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
1a3c0 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e  ive if no action
1a3d0 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72   should be gener
1a3e0 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ated..*/.PRIVATE
1a3f0 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74   int compute_act
1a400 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ion(struct lemon
1a410 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 61   *lemp, struct a
1a420 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20 69  ction *ap).{.  i
1a430 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68  nt act;.  switch
1a440 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20  ( ap->type ){.  
1a450 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 20 61    case SHIFT:  a
1a460 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e  ct = ap->x.stp->
1a470 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20  statenum;       
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a4a0 20 53 48 49 46 54 52 45 44 55 43 45 3a 20 7b 0a   SHIFTREDUCE: {.
1a4b0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 61        /* Since a
1a4c0 20 53 48 49 46 54 20 69 73 20 69 6e 68 65 72 69   SHIFT is inheri
1a4d0 65 6e 74 20 61 66 74 65 72 20 61 20 70 72 69 6f  ent after a prio
1a4e0 72 20 52 45 44 55 43 45 2c 20 63 6f 6e 76 65 72  r REDUCE, conver
1a4f0 74 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 53  t any.      ** S
1a500 48 49 46 54 52 45 44 55 43 45 20 61 63 74 69 6f  HIFTREDUCE actio
1a510 6e 20 77 69 74 68 20 61 20 6e 6f 6e 74 65 72 6d  n with a nonterm
1a520 69 6e 61 6c 20 6f 6e 20 74 68 65 20 4c 48 53 20  inal on the LHS 
1a530 69 6e 74 6f 20 61 20 73 69 6d 70 6c 65 0a 20 20  into a simple.  
1a540 20 20 20 20 2a 2a 20 52 45 44 55 43 45 20 61 63      ** REDUCE ac
1a550 74 69 6f 6e 3a 20 2a 2f 0a 20 20 20 20 20 20 69  tion: */.      i
1a560 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1a570 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
1a580 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 61 63 74  l ){.        act
1a590 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75   = lemp->minRedu
1a5a0 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e 69  ce + ap->x.rp->i
1a5b0 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Rule;.      }els
1a5c0 65 7b 0a 20 20 20 20 20 20 20 20 61 63 74 20 3d  e{.        act =
1a5d0 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52   lemp->minShiftR
1a5e0 65 64 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70  educe + ap->x.rp
1a5f0 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d  ->iRule;.      }
1a600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44    }.    case RED
1a620 55 43 45 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d  UCE: act = lemp-
1a630 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20 61 70 2d  >minReduce + ap-
1a640 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b 20 20 20  >x.rp->iRule;   
1a650 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a660 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61    case ERROR:  a
1a670 63 74 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41 63  ct = lemp->errAc
1a680 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a6b0 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c   ACCEPT: act = l
1a6c0 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 3b 20  emp->accAction; 
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1a6f0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
1a700 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65     act = -1; bre
1a710 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1a720 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65   act;.}..#define
1a730 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f   LINESIZE 1000./
1a740 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74  * The next clust
1a750 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  er of routines a
1a760 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74  re for reading t
1a770 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
1a780 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20  .** and writing 
1a790 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
1a7a0 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  he generated par
1a7b0 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69  ser */./* The fi
1a7c0 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61  rst function tra
1a7d0 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d  nsfers data from
1a7e0 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75   "in" to "out" u
1a7f0 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69  ntil.** a line i
1a800 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65 67  s seen which beg
1a810 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20 20  ins with "%%".  
1a820 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  The line number 
1a830 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a  is.** tracked..*
1a840 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c  *.** if name!=0,
1a850 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74   then any word t
1a860 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
1a870 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67 65  Parse" is change
1a880 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69  d to.** begin wi
1a890 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64  th *name instead
1a8a0 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
1a8b0 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72  d tplt_xfer(char
1a8c0 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e   *name, FILE *in
1a8d0 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74  , FILE *out, int
1a8e0 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e   *lineno).{.  in
1a8f0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63  t i, iStart;.  c
1a900 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1a910 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  E];.  while( fge
1a920 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
1a930 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d  ,in) && (line[0]
1a940 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d  !='%' || line[1]
1a950 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a  !='%') ){.    (*
1a960 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69  lineno)++;.    i
1a970 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  Start = 0;.    i
1a980 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  f( name ){.     
1a990 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69   for(i=0; line[i
1a9a0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
1a9b0 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50   if( line[i]=='P
1a9c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69  ' && strncmp(&li
1a9d0 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29  ne[i],"Parse",5)
1a9e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
1a9f0 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c 50   (i==0 || !ISALP
1aa00 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20  HA(line[i-1])). 
1aa10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1aa20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74      if( i>iStart
1aa30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1aa40 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26  %.*s",i-iStart,&
1aa50 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
1aa60 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1aa70 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b  (out,"%s",name);
1aa80 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
1aa90 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74  4;.          iSt
1aaa0 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20  art = i+1;.     
1aab0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1aac0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
1aad0 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53  ut,"%s",&line[iS
1aae0 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart]);.  }.}../
1aaf0 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74  * The next funct
1ab00 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65  ion finds the te
1ab10 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20  mplate file and 
1ab20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e  opens it, return
1ab30 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ing.** a pointer
1ab40 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1ab50 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
1ab60 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28  FILE *tplt_open(
1ab70 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1ab80 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63  mp).{.  static c
1ab90 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  har templatename
1aba0 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b  [] = "lempar.c";
1abb0 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30 30  .  char buf[1000
1abc0 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ];.  FILE *in;. 
1abd0 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b   char *tpltname;
1abe0 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
1abf0 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69 66  /* first, see if
1ac00 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
1ac10 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e  a template filen
1ac20 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ame on the comma
1ac30 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66  nd line. */.  if
1ac40 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e   (user_templaten
1ac50 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20  ame != 0) {.    
1ac60 69 66 28 20 61 63 63 65 73 73 28 75 73 65 72 5f  if( access(user_
1ac70 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
1ac80 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  )==-1 ){.      f
1ac90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
1aca0 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
1acb0 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
1acc0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
1acd0 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73  .\n",.        us
1ace0 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  er_templatename)
1acf0 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
1ad00 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1ad10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ad20 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75      in = fopen(u
1ad30 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
1ad40 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20  ,"rb");.    if( 
1ad50 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  in==0 ){.      f
1ad60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
1ad70 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65  an't open the te
1ad80 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
1ad90 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1ada0 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
1adb0 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
1adc0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
1add0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1ade0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1adf0 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70  rn in;.  }..  cp
1ae00 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d   = strrchr(lemp-
1ae10 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a  >filename,'.');.
1ae20 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
1ae30 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75  lemon_sprintf(bu
1ae40 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
1ae50 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
1ae60 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
1ae70 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
1ae80 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
1ae90 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
1aea0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
1aeb0 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
1aec0 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
1aed0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
1aee0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63  ;.  }else if( ac
1aef0 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d  cess(templatenam
1af00 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  e,004)==0 ){.   
1af10 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70   tpltname = temp
1af20 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73  latename;.  }els
1af30 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  e{.    tpltname 
1af40 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d  = pathsearch(lem
1af50 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74  p->argv0,templat
1af60 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20  ename,0);.  }.  
1af70 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20  if( tpltname==0 
1af80 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1af90 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
1afa0 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
1afb0 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
1afc0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
1afd0 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b    templatename);
1afe0 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
1aff0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
1b000 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  n 0;.  }.  in = 
1b010 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22  fopen(tpltname,"
1b020 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
1b030 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
1b040 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
1b050 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
1b060 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
1b070 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
1b080 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1b090 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
1b0a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1b0b0 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
1b0c0 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69   a #line directi
1b0d0 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f  ve line to the o
1b0e0 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50  utput file. */.P
1b0f0 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
1b100 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f  _linedir(FILE *o
1b110 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20  ut, int lineno, 
1b120 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a  char *filename).
1b130 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
1b140 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
1b150 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
1b160 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
1b170 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
1b180 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
1b190 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
1b1a0 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
1b1b0 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
1b1c0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
1b1d0 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
1b1e0 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
1b1f0 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
1b200 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
1b210 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
1b220 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
1b230 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45   tplt_print(FILE
1b240 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65   *out, struct le
1b250 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20  mon *lemp, char 
1b260 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e  *str, int *linen
1b270 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d  o).{.  if( str==
1b280 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
1b290 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20  ile( *str ){.   
1b2a0 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b   putc(*str,out);
1b2b0 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
1b2c0 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
1b2d0 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20  +;.    str++;.  
1b2e0 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21  }.  if( str[-1]!
1b2f0 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74  ='\n' ){.    put
1b300 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20  c('\n',out);.   
1b310 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1b320 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e  }.  if (!lemp->n
1b330 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a  olinenosflag) {.
1b340 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
1b350 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
1b360 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
1b370 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  outname);.  }.  
1b380 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
1b390 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
1b3a0 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64  outine emits cod
1b3b0 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75  e for the destru
1b3c0 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ctor for the.** 
1b3d0 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69  symbol sp.*/.voi
1b3e0 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f  d emit_destructo
1b3f0 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a  r_code(.  FILE *
1b400 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73 79  out,.  struct sy
1b410 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72 75  mbol *sp,.  stru
1b420 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a  ct lemon *lemp,.
1b430 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b    int *lineno.){
1b440 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a  . char *cp = 0;.
1b450 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d  . if( sp->type==
1b460 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63  TERMINAL ){.   c
1b470 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  p = lemp->tokend
1b480 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
1b490 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
1b4a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22  printf(out,"{\n"
1b4b0 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
1b4c0 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64   }else if( sp->d
1b4d0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
1b4e0 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  cp = sp->destruc
1b4f0 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  tor;.   fprintf(
1b500 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
1b510 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20  neno)++;.   if( 
1b520 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
1b530 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c  flag ){.     (*l
1b540 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74  ineno)++;.     t
1b550 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1b560 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c 6c  sp->destLineno,l
1b570 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
1b580 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20     }. }else if( 
1b590 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
1b5a0 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76  .   cp = lemp->v
1b5b0 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63  ardest;.   if( c
1b5c0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1b5d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
1b5e0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1b5f0 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73  +;. }else{.   as
1b600 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43  sert( 0 );  /* C
1b610 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a  annot happen */.
1b620 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63   }. for(; *cp; c
1b630 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70  p++){.   if( *cp
1b640 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='$' && cp[1]==
1b650 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69  '$' ){.     fpri
1b660 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e  ntf(out,"(yypmin
1b670 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64  or->yy%d)",sp->d
1b680 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b  tnum);.     cp++
1b690 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  ;.     continue;
1b6a0 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70  .   }.   if( *cp
1b6b0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1b6c0 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a  o)++;.   fputc(*
1b6d0 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72  cp,out);. }. fpr
1b6e0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
1b6f0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66  (*lineno)++;. if
1b700 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
1b710 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 28 2a 6c  osflag) {.   (*l
1b720 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
1b730 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
1b740 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
1b750 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f  );. }. fprintf(o
1b760 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"}\n"); (*lin
1b770 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e 3b  eno)++;. return;
1b780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b790 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
1b7a0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 79   if the given sy
1b7b0 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72  mbol has a destr
1b7c0 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61  uctor..*/.int ha
1b7d0 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74 72  s_destructor(str
1b7e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20  uct symbol *sp, 
1b7f0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1b800 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b  mp).{.  int ret;
1b810 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .  if( sp->type=
1b820 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
1b830 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b   ret = lemp->tok
1b840 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c  endest!=0;.  }el
1b850 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65  se{.    ret = le
1b860 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c  mp->vardest!=0 |
1b870 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
1b880 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  !=0;.  }.  retur
1b890 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
1b8a0 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61  Append text to a
1b8b0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1b8c0 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20  ocated string.  
1b8d0 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68  If zText is 0 th
1b8e0 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  en.** reset the 
1b8f0 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70  string to be emp
1b900 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79  ty again.  Alway
1b910 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d  s return the com
1b920 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66  plete text.** of
1b930 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69   the string (whi
1b940 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ch is overwritte
1b950 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  n with each call
1b960 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73  )..**.** n bytes
1b970 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74   of zText are st
1b980 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74  ored.  If n==0 t
1b990 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74  hen all of zText
1b9a0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1b9b0 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  .** \000 termina
1b9c0 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20  tor is stored.  
1b9d0 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69  zText can contai
1b9e0 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74  n up to two inst
1b9f0 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20  ances of.** %d. 
1ba00 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   The values of p
1ba10 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69  1 and p2 are wri
1ba20 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69  tten into the fi
1ba30 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a  rst and second.*
1ba40 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  * %d..**.** If n
1ba50 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70  ==-1, then the p
1ba60 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
1ba70 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  r is overwritten
1ba80 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  ..*/.PRIVATE cha
1ba90 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 6f  r *append_str(co
1baa0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
1bab0 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20   int n, int p1, 
1bac0 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74 69  int p2){.  stati
1bad0 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d 20  c char empty[1] 
1bae0 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74 69  = { 0 };.  stati
1baf0 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  c char *z = 0;. 
1bb00 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f   static int allo
1bb10 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ced = 0;.  stati
1bb20 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a  c int used = 0;.
1bb30 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20    int c;.  char 
1bb40 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28 20  zInt[40];.  if( 
1bb50 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zText==0 ){.    
1bb60 69 66 28 20 75 73 65 64 3d 3d 30 20 26 26 20 7a  if( used==0 && z
1bb70 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20 30 3b 0a  !=0 ) z[0] = 0;.
1bb80 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20      used = 0;.  
1bb90 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a    return z;.  }.
1bba0 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20    if( n<=0 ){.  
1bbb0 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
1bbc0 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20     used += n;.  
1bbd0 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64      assert( used
1bbe0 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
1bbf0 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e   n = lemonStrlen
1bc00 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69  (zText);.  }.  i
1bc10 66 28 20 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65  f( (int) (n+size
1bc20 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29  of(zInt)*2+used)
1bc30 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20   >= alloced ){. 
1bc40 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b     alloced = n +
1bc50 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20   sizeof(zInt)*2 
1bc60 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20  + used + 200;.  
1bc70 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 72    z = (char *) r
1bc80 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63  ealloc(z,  alloc
1bc90 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ed);.  }.  if( z
1bca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 65 6d 70  ==0 ) return emp
1bcb0 74 79 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  ty;.  while( n--
1bcc0 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d 20   > 0 ){.    c = 
1bcd0 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20  *(zText++);.    
1bce0 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e  if( c=='%' && n>
1bcf0 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27  0 && zText[0]=='
1bd00 64 27 20 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  d' ){.      lemo
1bd10 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20  n_sprintf(zInt, 
1bd20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20  "%d", p1);.     
1bd30 20 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20   p1 = p2;.      
1bd40 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 26 7a 5b  lemon_strcpy(&z[
1bd50 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20  used], zInt);.  
1bd60 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f      used += lemo
1bd70 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d  nStrlen(&z[used]
1bd80 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b  );.      zText++
1bd90 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
1bda0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b   }else{.      z[
1bdb0 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68 61 72 29  used++] = (char)
1bdc0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  c;.    }.  }.  z
1bdd0 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65  [used] = 0;.  re
1bde0 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
1bdf0 20 57 72 69 74 65 20 61 6e 64 20 74 72 61 6e 73   Write and trans
1be00 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e 63 6f 64  form the rp->cod
1be10 65 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74  e string so that
1be20 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 65 78 70   symbols are exp
1be30 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70 75 6c 61  anded..** Popula
1be40 74 65 20 74 68 65 20 72 70 2d 3e 63 6f 64 65 50  te the rp->codeP
1be50 72 65 66 69 78 20 61 6e 64 20 72 70 2d 3e 63 6f  refix and rp->co
1be60 64 65 53 75 66 66 69 78 20 73 74 72 69 6e 67 73  deSuffix strings
1be70 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
1be80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
1be90 20 69 66 20 74 68 65 20 65 78 70 61 6e 64 65 64   if the expanded
1bea0 20 63 6f 64 65 20 72 65 71 75 69 72 65 73 20 74   code requires t
1beb0 68 61 74 20 22 79 79 6c 68 73 6d 69 6e 6f 72 22  hat "yylhsminor"
1bec0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 0a   local variable.
1bed0 2a 2a 20 74 6f 20 62 65 20 64 65 66 69 6e 65 64  ** to be defined
1bee0 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
1bef0 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
1bf00 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1bf10 6d 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  mp, struct rule 
1bf20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70  *rp){.  char *cp
1bf30 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  , *xp;.  int i;.
1bf40 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1bf50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1bf60 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f 72 20 69   if yylhsminor i
1bf70 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  s used */.  int 
1bf80 64 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 30 3b  dontUseRhs0 = 0;
1bf90 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 75     /* If true, u
1bfa0 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20  se of left-most 
1bfb0 52 48 53 20 6c 61 62 65 6c 20 69 73 20 69 6c 6c  RHS label is ill
1bfc0 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  egal */.  const 
1bfd0 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d 20 30 3b  char *zSkip = 0;
1bfe0 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72 74 20 63   /* The zOvwrt c
1bff0 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e 20 72 70  omment within rp
1c000 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c 20  ->code, or NULL 
1c010 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65  */.  char lhsuse
1c020 64 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  d = 0;      /* T
1c030 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 65  rue if the LHS e
1c040 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20  lement has been 
1c050 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 6c  used */.  char l
1c060 68 73 64 69 72 65 63 74 3b 20 20 20 20 20 20 20  hsdirect;       
1c070 20 2f 2a 20 54 72 75 65 20 69 66 20 4c 48 53 20   /* True if LHS 
1c080 77 72 69 74 65 73 20 64 69 72 65 63 74 6c 79 20  writes directly 
1c090 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f 0a 20 20  into stack */.  
1c0a0 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53  char used[MAXRHS
1c0b0 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ];     /* True f
1c0c0 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d  or each RHS elem
1c0d0 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65  ent which is use
1c0e0 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 68 73  d */.  char zLhs
1c0f0 5b 35 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [50];         /*
1c100 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4c 48 53   Convert the LHS
1c110 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20 74 68 69   symbol into thi
1c120 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  s string */.  ch
1c130 61 72 20 7a 4f 76 77 72 74 5b 39 30 30 5d 3b 20  ar zOvwrt[900]; 
1c140 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
1c150 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77 20 4c 48  that to allow LH
1c160 53 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 52  S to overwrite R
1c170 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  HS */..  for(i=0
1c180 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
1c190 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a  +) used[i] = 0;.
1c1a0 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a    lhsused = 0;..
1c1b0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
1c1c0 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
1c1d0 63 68 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b  char newlinestr[
1c1e0 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30  2] = { '\n', '\0
1c1f0 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64  ' };.    rp->cod
1c200 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a  e = newlinestr;.
1c210 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72      rp->line = r
1c220 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 20  p->ruleline;.   
1c230 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b   rp->noCode = 1;
1c240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 70  .  }else{.    rp
1c250 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20  ->noCode = 0;.  
1c260 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d 3e 6e 72  }...  if( rp->nr
1c270 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  hs==0 ){.    /* 
1c280 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1c290 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65  RHS symbols, the
1c2a0 6e 20 77 72 69 74 69 6e 67 20 64 69 72 65 63 74  n writing direct
1c2b0 6c 79 20 74 6f 20 74 68 65 20 4c 48 53 20 69 73  ly to the LHS is
1c2c0 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69   ok */.    lhsdi
1c2d0 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rect = 1;.  }els
1c2e0 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  e if( rp->rhsali
1c2f0 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  as[0]==0 ){.    
1c300 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  /* The left-most
1c310 20 52 48 53 20 73 79 6d 62 6f 6c 20 68 61 73 20   RHS symbol has 
1c320 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48 53 20 64  no value.  LHS d
1c330 69 72 65 63 74 20 69 73 20 6f 6b 2e 20 20 42 75  irect is ok.  Bu
1c340 74 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  t.    ** we have
1c350 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 64 69 73   to call the dis
1c360 74 72 75 63 74 6f 72 20 6f 6e 20 74 68 65 20 52  tructor on the R
1c370 48 53 20 73 79 6d 62 6f 6c 20 66 69 72 73 74 2e  HS symbol first.
1c380 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63   */.    lhsdirec
1c390 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 68  t = 1;.    if( h
1c3a0 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70  as_destructor(rp
1c3b0 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70 29 20 29  ->rhs[0],lemp) )
1c3c0 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73  {.      append_s
1c3d0 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  tr(0,0,0,0);.   
1c3e0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20     append_str(" 
1c3f0 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79   yy_destructor(y
1c400 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d  ypParser,%d,&yym
1c410 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e  sp[%d].minor);\n
1c420 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ", 0,.          
1c430 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 30         rp->rhs[0
1c440 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70 2d 3e 6e  ]->index,1-rp->n
1c450 72 68 73 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e  rhs);.      rp->
1c460 63 6f 64 65 50 72 65 66 69 78 20 3d 20 53 74 72  codePrefix = Str
1c470 73 61 66 65 28 61 70 70 65 6e 64 5f 73 74 72 28  safe(append_str(
1c480 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20 20 20 20  0,0,0,0));.     
1c490 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1c4a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1c4b0 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 3d  f( rp->lhsalias=
1c4c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1c4d0 72 65 20 69 73 20 6e 6f 20 4c 48 53 20 76 61 6c  re is no LHS val
1c4e0 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f 0a 20 20  ue symbol. */.  
1c4f0 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1c500 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1c510 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73  cmp(rp->lhsalias
1c520 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d  ,rp->rhsalias[0]
1c530 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  )==0 ){.    /* T
1c540 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 61 6e  he LHS symbol an
1c550 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  d the left-most 
1c560 52 48 53 20 73 79 6d 62 6f 6c 20 61 72 65 20 74  RHS symbol are t
1c570 68 65 20 73 61 6d 65 2c 20 73 6f 0a 20 20 20 20  he same, so.    
1c580 2a 2a 20 64 69 72 65 63 74 20 77 72 69 74 69 6e  ** direct writin
1c590 67 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  g is allowed */.
1c5a0 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20      lhsdirect = 
1c5b0 31 3b 0a 20 20 20 20 6c 68 73 75 73 65 64 20 3d  1;.    lhsused =
1c5c0 20 31 3b 0a 20 20 20 20 75 73 65 64 5b 30 5d 20   1;.    used[0] 
1c5d0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  = 1;.    if( rp-
1c5e0 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21 3d 72 70 2d  >lhs->dtnum!=rp-
1c5f0 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e 75 6d 20 29  >rhs[0]->dtnum )
1c600 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67  {.      ErrorMsg
1c610 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1c620 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1c630 20 20 20 20 20 20 22 25 73 28 25 73 29 20 61 6e        "%s(%s) an
1c640 64 20 25 73 28 25 73 29 20 73 68 61 72 65 20 74  d %s(%s) share t
1c650 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 62 75  he same label bu
1c660 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
1c670 20 22 64 69 66 66 65 72 65 6e 74 20 64 61 74 61   "different data
1c680 74 79 70 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  types.",.       
1c690 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 20   rp->lhs->name, 
1c6a0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70  rp->lhsalias, rp
1c6b0 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61 6d 65 2c 20  ->rhs[0]->name, 
1c6c0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29  rp->rhsalias[0])
1c6d0 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
1c6e0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  rorcnt++;.    }.
1c6f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d    }else{.    lem
1c700 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77 72  on_sprintf(zOvwr
1c710 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72 69  t, "/*%s-overwri
1c720 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20 20  tes-%s*/",.     
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d               rp-
1c740 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72  >lhsalias, rp->r
1c750 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20  hsalias[0]);.   
1c760 20 7a 53 6b 69 70 20 3d 20 73 74 72 73 74 72 28   zSkip = strstr(
1c770 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72 74  rp->code, zOvwrt
1c780 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6b 69 70  );.    if( zSkip
1c790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1c7a0 54 68 65 20 63 6f 64 65 20 63 6f 6e 74 61 69 6e  The code contain
1c7b0 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d  s a special comm
1c7c0 65 6e 74 20 74 68 61 74 20 69 6e 64 69 63 61 74  ent that indicat
1c7d0 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
1c7e0 66 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  fe.      ** for 
1c7f0 74 68 65 20 4c 48 53 20 6c 61 62 65 6c 20 74 6f  the LHS label to
1c800 20 6f 76 65 72 77 72 69 74 65 20 6c 65 66 74 2d   overwrite left-
1c810 6d 6f 73 74 20 52 48 53 20 6c 61 62 65 6c 2e 20  most RHS label. 
1c820 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65  */.      lhsdire
1c830 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ct = 1;.    }els
1c840 65 7b 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65  e{.      lhsdire
1c850 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ct = 0;.    }.  
1c860 7d 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65 63  }.  if( lhsdirec
1c870 74 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  t ){.    sprintf
1c880 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25 64  (zLhs, "yymsp[%d
1c890 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31 2d  ].minor.yy%d",1-
1c8a0 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68 73  rp->nrhs,rp->lhs
1c8b0 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c 73  ->dtnum);.  }els
1c8c0 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1c8d0 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c     sprintf(zLhs,
1c8e0 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79 25   "yylhsminor.yy%
1c8f0 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75  d",rp->lhs->dtnu
1c900 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e  m);.  }..  appen
1c910 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1c920 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74  .  /* This const
1c930 20 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62   cast is wrong b
1c940 75 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20  ut harmless, if 
1c950 77 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a  we're careful. *
1c960 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72  /.  for(cp=(char
1c970 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70   *)rp->code; *cp
1c980 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; cp++){.    if(
1c990 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20 20   cp==zSkip ){.  
1c9a0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a      append_str(z
1c9b0 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20 20  Ovwrt,0,0,0);.  
1c9c0 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e 53      cp += lemonS
1c9d0 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31 3b  trlen(zOvwrt)-1;
1c9e0 0a 20 20 20 20 20 20 64 6f 6e 74 55 73 65 52 68  .      dontUseRh
1c9f0 73 30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  s0 = 1;.      co
1ca00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1ca10 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63    if( ISALPHA(*c
1ca20 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
1ca30 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d  ode || (!ISALNUM
1ca40 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
1ca50 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
1ca60 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
1ca70 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
1ca80 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70  [1]; ISALNUM(*xp
1ca90 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
1caa0 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
1cab0 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
1cac0 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
1cad0 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
1cae0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
1caf0 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
1cb00 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
1cb10 74 72 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a  tr(zLhs,0,0,0);.
1cb20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
1cb30 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64  .        lhsused
1cb40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1cb50 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
1cb60 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
1cb70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1cb80 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1cb90 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70  [i] && strcmp(cp
1cba0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
1cbb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cbc0 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
1cbd0 64 6f 6e 74 55 73 65 52 68 73 30 20 29 7b 0a 20  dontUseRhs0 ){. 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72               Err
1cbf0 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1cc00 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1cc10 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1cc20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73      "Label %s us
1cc30 65 64 20 61 66 74 65 72 20 27 25 73 27 2e 22 2c  ed after '%s'.",
1cc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc50 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30    rp->rhsalias[0
1cc60 5d 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20  ], zOvwrt);.    
1cc70 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e            lemp->
1cc80 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
1cc90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1cca0 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26  ( cp!=rp->code &
1ccb0 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b  & cp[-1]=='@' ){
1ccc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
1ccd0 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e  * If the argumen
1cce0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1ccf0 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74   @X then substit
1cd00 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  uted.           
1cd10 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20     ** the token 
1cd20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74  number of X, not
1cd30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20   the value of X 
1cd40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1cd50 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d   append_str("yym
1cd60 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31  sp[%d].major",-1
1cd70 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29  ,i-rp->nrhs+1,0)
1cd80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1cd90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1cda0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1cdb0 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
1cdc0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1cdd0 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20   int dtnum;.    
1cde0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70            if( sp
1cdf0 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
1ce00 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
1ce10 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
1ce20 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
1ce30 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1ce40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1ce60 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20  m = sp->dtnum;. 
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
1ce90 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25  end_str("yymsp[%
1cea0 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  d].minor.yy%d",0
1ceb0 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64  ,i-rp->nrhs+1, d
1cec0 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  tnum);.         
1ced0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1cee0 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
1cef0 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20        used[i] = 
1cf00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
1cf10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1cf20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1cf30 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20    }.      *xp = 
1cf40 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  saved;.    }.   
1cf50 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20   append_str(cp, 
1cf60 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a  1, 0, 0);.  } /*
1cf70 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20   End loop */..  
1cf80 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20 67 65 6e  /* Main code gen
1cf90 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65  eration complete
1cfa0 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65  d */.  cp = appe
1cfb0 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
1cfc0 0a 20 20 69 66 28 20 63 70 20 26 26 20 63 70 5b  .  if( cp && cp[
1cfd0 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d 20  0] ) rp->code = 
1cfe0 53 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20 61  Strsafe(cp);.  a
1cff0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1d000 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  0);..  /* Check 
1d010 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
1d020 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73   LHS has been us
1d030 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e  ed */.  if( rp->
1d040 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
1d050 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f  used ){.    Erro
1d060 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1d070 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1d080 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c  ,.      "Label \
1d090 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25  "%s\" for \"%s(%
1d0a0 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
1d0b0 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70  ed.",.        rp
1d0c0 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
1d0d0 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
1d0e0 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70  alias);.    lemp
1d0f0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1d100 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d110 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65   destructor code
1d120 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20 76   for RHS minor v
1d130 61 6c 75 65 73 20 77 68 69 63 68 20 61 72 65 20  alues which are 
1d140 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  not referenced..
1d150 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 65 72    ** Generate er
1d160 72 6f 72 20 6d 65 73 73 61 67 65 73 20 66 6f 72  ror messages for
1d170 20 75 6e 75 73 65 64 20 6c 61 62 65 6c 73 20 61   unused labels a
1d180 6e 64 20 64 75 70 6c 69 63 61 74 65 20 6c 61 62  nd duplicate lab
1d190 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  els..  */.  for(
1d1a0 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1d1b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   i++){.    if( r
1d1c0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29  p->rhsalias[i] )
1d1d0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  {.      if( i>0 
1d1e0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
1d1f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1d200 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74  ->lhsalias && st
1d210 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61  rcmp(rp->lhsalia
1d220 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  s,rp->rhsalias[i
1d230 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1d240 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1d250 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1d260 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1d270 20 20 20 20 20 22 25 73 28 25 73 29 20 68 61 73       "%s(%s) has
1d280 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20   the same label 
1d290 61 73 20 74 68 65 20 4c 48 53 20 62 75 74 20 69  as the LHS but i
1d2a0 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d 6d  s not the left-m
1d2b0 6f 73 74 20 22 0a 20 20 20 20 20 20 20 20 20 20  ost ".          
1d2c0 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68 65    "symbol on the
1d2d0 20 52 48 53 2e 22 2c 0a 20 20 20 20 20 20 20 20   RHS.",.        
1d2e0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
1d2f0 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69  name, rp->rhsali
1d300 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  as);.          l
1d310 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1d320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d330 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
1d340 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1d350 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
1d360 73 5b 6a 5d 20 26 26 20 73 74 72 63 6d 70 28 72  s[j] && strcmp(r
1d370 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 2c 72  p->rhsalias[j],r
1d380 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d  p->rhsalias[i])=
1d390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d3a0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1d3b0 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1d3c0 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1d3d0 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20        "Label %s 
1d3e0 75 73 65 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c  used for multipl
1d3f0 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65  e symbols on the
1d400 20 52 48 53 20 6f 66 20 61 20 72 75 6c 65 2e 22   RHS of a rule."
1d410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d420 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1d430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
1d440 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1d450 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1d460 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1d470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d480 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 64  .      if( !used
1d490 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  [i] ){.        E
1d4a0 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
1d4b0 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
1d4c0 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ine,.          "
1d4d0 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
1d4e0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
1d4f0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
1d500 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
1d510 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
1d520 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
1d530 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  [i]);.        le
1d540 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1d550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d560 65 20 69 66 28 20 69 3e 30 20 26 26 20 68 61 73  e if( i>0 && has
1d570 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1d580 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[i],lemp) ){.
1d590 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1d5a0 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1d5b0 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1d5c0 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1d5d0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1d5e0 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e    rp->rhs[i]->in
1d5f0 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  dex,i-rp->nrhs+1
1d600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d610 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  /* If unable to 
1d620 77 72 69 74 65 20 4c 48 53 20 76 61 6c 75 65 73  write LHS values
1d630 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
1d640 68 65 20 73 74 61 63 6b 2c 20 77 72 69 74 65 20  he stack, write 
1d650 74 68 65 0a 20 20 2a 2a 20 73 61 76 65 64 20 4c  the.  ** saved L
1d660 48 53 20 76 61 6c 75 65 20 6e 6f 77 2e 20 2a 2f  HS value now. */
1d670 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74  .  if( lhsdirect
1d680 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 65 6e  ==0 ){.    appen
1d690 64 5f 73 74 72 28 22 20 20 79 79 6d 73 70 5b 25  d_str("  yymsp[%
1d6a0 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 20 3d 20  d].minor.yy%d = 
1d6b0 22 2c 20 30 2c 20 31 2d 72 70 2d 3e 6e 72 68 73  ", 0, 1-rp->nrhs
1d6c0 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  , rp->lhs->dtnum
1d6d0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74  );.    append_st
1d6e0 72 28 7a 4c 68 73 2c 20 30 2c 20 30 2c 20 30 29  r(zLhs, 0, 0, 0)
1d6f0 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  ;.    append_str
1d700 28 22 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29  (";\n", 0, 0, 0)
1d710 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 66 66  ;.  }..  /* Suff
1d720 69 78 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ix code generati
1d730 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  on complete */. 
1d740 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72   cp = append_str
1d750 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28  (0,0,0,0);.  if(
1d760 20 63 70 20 26 26 20 63 70 5b 30 5d 20 29 7b 0a   cp && cp[0] ){.
1d770 20 20 20 20 72 70 2d 3e 63 6f 64 65 53 75 66 66      rp->codeSuff
1d780 69 78 20 3d 20 53 74 72 73 61 66 65 28 63 70 29  ix = Strsafe(cp)
1d790 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65  ;.    rp->noCode
1d7a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
1d7b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d7c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d7d0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1d7e0 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  en the rule "rp"
1d7f0 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57 72   is reduced.  Wr
1d800 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20  ite.** the code 
1d810 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20  to "out".  Make 
1d820 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79  sure lineno stay
1d830 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  s up-to-date..*/
1d840 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d  .PRIVATE void em
1d850 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  it_code(.  FILE 
1d860 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 72  *out,.  struct r
1d870 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72 75 63  ule *rp,.  struc
1d880 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
1d890 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a   int *lineno.){.
1d8a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b   const char *cp;
1d8b0 0a 0a 20 2f 2a 20 53 65 74 75 70 20 63 6f 64 65  .. /* Setup code
1d8c0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 23 6c   prior to the #l
1d8d0 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f  ine directive */
1d8e0 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72  . if( rp->codePr
1d8f0 65 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65  efix && rp->code
1d900 50 72 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20  Prefix[0] ){.   
1d910 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b 25  fprintf(out, "{%
1d920 73 22 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  s", rp->codePref
1d930 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  ix);.   for(cp=r
1d940 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 3b 20 2a  p->codePrefix; *
1d950 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1d960 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1d970 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f  eno)++; }. }.. /
1d980 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d990 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
1d9a0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
1d9b0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69  rp->code ){.   i
1d9c0 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1d9d0 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1d9e0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1d9f0 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1da00 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70  ut,rp->line,lemp
1da10 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ->filename);.   
1da20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  }.   fprintf(out
1da30 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29  ,"{%s",rp->code)
1da40 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
1da50 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
1da60 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20  { if( *cp=='\n' 
1da70 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d  ) (*lineno)++; }
1da80 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1da90 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "}\n"); (*lineno
1daa0 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d  )++;.   if( !lem
1dab0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1dac0 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1dad0 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1dae0 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
1daf0 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
1db00 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f 2a  e);.   }. }.. /*
1db10 20 47 65 6e 65 72 61 74 65 20 62 72 65 61 6b 64   Generate breakd
1db20 6f 77 6e 20 63 6f 64 65 20 74 68 61 74 20 6f 63  own code that oc
1db30 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 23  curs after the #
1db40 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a  line directive *
1db50 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 53  /. if( rp->codeS
1db60 75 66 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64  uffix && rp->cod
1db70 65 53 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20 20  eSuffix[0] ){.  
1db80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
1db90 73 22 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66 66  s", rp->codeSuff
1dba0 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  ix);.   for(cp=r
1dbb0 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 3b 20 2a  p->codeSuffix; *
1dbc0 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1dbd0 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1dbe0 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 69  eno)++; }. }.. i
1dbf0 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  f( rp->codePrefi
1dc00 78 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28  x ){.   fprintf(
1dc10 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a 6c  out, "}\n"); (*l
1dc20 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20 72  ineno)++;. }.. r
1dc30 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
1dc40 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
1dc50 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
1dc60 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
1dc70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
1dc80 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
1dc90 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
1dca0 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
1dcb0 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
1dcc0 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
1dcd0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
1dce0 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
1dcf0 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
1dd00 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
1dd10 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
1dd20 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
1dd30 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
1dd40 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
1dd50 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
1dd60 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
1dd70 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49  tack_union(.  FI
1dd80 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20  LE *out,        
1dd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dda0 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a   output stream *
1ddb0 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
1ddc0 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20   *lemp,         
1ddd0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
1dde0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
1ddf0 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  his parser */.  
1de00 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20  int *plineno,   
1de10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1de20 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69  ointer to the li
1de30 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1de40 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20  nt mhflag       
1de50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1de60 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
1de70 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
1de80 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  put */.){.  int 
1de90 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
1dea0 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e  o;    /* The lin
1deb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1dec0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72  output */.  char
1ded0 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20   **types;       
1dee0 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20        /* A hash 
1def0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
1df00 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61  es */.  int arra
1df10 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  ysize;          
1df20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1df30 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a   "types" array *
1df40 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e  /.  int maxdtlen
1df50 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  gth;          /*
1df60 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
1df70 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70  of any ".datatyp
1df80 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63  e" field. */.  c
1df90 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20  har *stddt;     
1dfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e           /* Stan
1dfb0 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f  dardized name fo
1dfc0 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a  r a datatype */.
1dfd0 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20    int i,j;      
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1dff0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1e000 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b    unsigned hash;
1e010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1e020 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e  or hashing the n
1e030 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f  ame of a type */
1e040 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1e050 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
1e060 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73  Name of the pars
1e070 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  er */..  /* Allo
1e080 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1e090 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20  ize types[] and 
1e0a0 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d  allocate stddt[]
1e0b0 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20   */.  arraysize 
1e0c0 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
1e0d0 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28  * 2;.  types = (
1e0e0 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61  char**)calloc( a
1e0f0 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66  rraysize, sizeof
1e100 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28  (char*) );.  if(
1e110 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20   types==0 ){.   
1e120 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1e130 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1e140 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1e150 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1e160 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
1e170 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b  +) types[i] = 0;
1e180 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d  .  maxdtlength =
1e190 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   0;.  if( lemp->
1e1a0 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d  vartype ){.    m
1e1b0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d  axdtlength = lem
1e1c0 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  onStrlen(lemp->v
1e1d0 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
1e1e0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1e1f0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1e200 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
1e210 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1e220 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1e230 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
1e240 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
1e250 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
1e260 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
1e270 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20  sp->datatype);. 
1e280 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74     if( len>maxdt
1e290 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65  length ) maxdtle
1e2a0 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  ngth = len;.  }.
1e2b0 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a    stddt = (char*
1e2c0 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65  )malloc( maxdtle
1e2d0 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20  ngth*2 + 1 );.  
1e2e0 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a  if( stddt==0 ){.
1e2f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e300 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1e310 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  y.\n");.    exit
1e320 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  (1);.  }..  /* B
1e330 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c  uild a hash tabl
1e340 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  e of datatypes. 
1e350 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  The ".dtnum" fie
1e360 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f  ld of each symbo
1e370 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64  l.  ** is filled
1e380 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73   in with the has
1e390 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20  h index plus 1. 
1e3a0 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75   A ".dtnum" valu
1e3b0 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75  e of 0 is.  ** u
1e3c0 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c  sed for terminal
1e3d0 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68   symbols.  If th
1e3e0 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75  ere is no %defau
1e3f0 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20  lt_type defined 
1e400 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61  then.  ** 0 is a
1e410 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20  lso used as the 
1e420 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72  .dtnum value for
1e430 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
1e440 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69  ich do not speci
1e450 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79  fy.  ** a dataty
1e460 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79  pe using the %ty
1e470 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20  pe directive..  
1e480 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1e490 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1e4a0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1e4b0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1e4c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1e4d0 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20     char *cp;.   
1e4e0 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65   if( sp==lemp->e
1e4f0 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73  rrsym ){.      s
1e500 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79  p->dtnum = array
1e510 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f  size+1;.      co
1e520 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e530 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d    if( sp->type!=
1e540 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28  NONTERMINAL || (
1e550 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20  sp->datatype==0 
1e560 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  && lemp->vartype
1e570 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70  ==0) ){.      sp
1e580 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1e590 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e5a0 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e   }.    cp = sp->
1e5b0 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66  datatype;.    if
1e5c0 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c  ( cp==0 ) cp = l
1e5d0 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20  emp->vartype;.  
1e5e0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    j = 0;.    whi
1e5f0 6c 65 28 20 49 53 53 50 41 43 45 28 2a 63 70 29  le( ISSPACE(*cp)
1e600 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69   ) cp++;.    whi
1e610 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b  le( *cp ) stddt[
1e620 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20  j++] = *cp++;.  
1e630 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
1e640 49 53 53 50 41 43 45 28 73 74 64 64 74 5b 6a 2d  ISSPACE(stddt[j-
1e650 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73  1]) ) j--;.    s
1e660 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  tddt[j] = 0;.   
1e670 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1e680 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73  type && strcmp(s
1e690 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65  tddt, lemp->toke
1e6a0 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20  ntype)==0 ){.   
1e6b0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30     sp->dtnum = 0
1e6c0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1e6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
1e6e0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
1e6f0 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
1e700 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
1e710 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
1e720 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  j];.    }.    ha
1e730 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37  sh = (hash & 0x7
1e740 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69  fffffff)%arraysi
1e750 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
1e760 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
1e770 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
1e780 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1e790 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e7a0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
1e7b0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
1e7c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1e7d0 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
1e7e0 20 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69   if( hash>=(unsi
1e7f0 67 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20 29  gned)arraysize )
1e800 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d   hash = 0;.    }
1e810 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68  .    if( types[h
1e820 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
1e830 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
1e840 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70  h + 1;.      typ
1e850 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72  es[hash] = (char
1e860 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
1e870 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29  trlen(stddt)+1 )
1e880 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65  ;.      if( type
1e890 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
1e8a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1e8b0 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
1e8c0 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ory.\n");.      
1e8d0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
1e8e0 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73   }.      lemon_s
1e8f0 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68  trcpy(types[hash
1e900 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a  ],stddt);.    }.
1e910 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20    }..  /* Print 
1e920 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  out the definiti
1e930 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50  on of YYTOKENTYP
1e940 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50  E and YYMINORTYP
1e950 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  E */.  name = le
1e960 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1e970 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1e980 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  .  lineno = *pli
1e990 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c  neno;.  if( mhfl
1e9a0 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  ag ){ fprintf(ou
1e9b0 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1e9c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1e9d0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1e9e0 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e  "#define %sTOKEN
1e9f0 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c  TYPE %s\n",name,
1ea00 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  .    lemp->token
1ea10 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  type?lemp->token
1ea20 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20  type:"void*");  
1ea30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1ea40 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
1ea50 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1ea60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1ea70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79   fprintf(out,"ty
1ea80 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22  pedef union {\n"
1ea90 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1eaa0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1eab0 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c  t yyinit;\n"); l
1eac0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1ead0 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45  tf(out,"  %sTOKE
1eae0 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61  NTYPE yy0;\n",na
1eaf0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1eb00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1eb10 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ysize; i++){.   
1eb20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30   if( types[i]==0
1eb30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1eb40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1eb50 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65  %s yy%d;\n",type
1eb60 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e  s[i],i+1); linen
1eb70 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79  o++;.    free(ty
1eb80 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  pes[i]);.  }.  i
1eb90 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20  f( lemp->errsym 
1eba0 26 26 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  && lemp->errsym-
1ebb0 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1ebc0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1ebd0 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d  t yy%d;\n",lemp-
1ebe0 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
1ebf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1ec00 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20   free(stddt);.  
1ec10 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66  free(types);.  f
1ec20 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59  printf(out,"} YY
1ec30 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20  MINORTYPE;\n"); 
1ec40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69  lineno++;.  *pli
1ec50 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d  neno = lineno;.}
1ec60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ec70 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64  he name of a C d
1ec80 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20  atatype able to 
1ec90 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73  represent values
1eca0 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20   between.** lwr 
1ecb0 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69  and upr, inclusi
1ecc0 76 65 2e 20 20 49 66 20 70 6e 42 79 74 65 21 3d  ve.  If pnByte!=
1ecd0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77  NULL then also w
1ece0 72 69 74 65 20 74 68 65 20 73 69 7a 65 6f 66 0a  rite the sizeof.
1ecf0 2a 2a 20 66 6f 72 20 74 68 61 74 20 74 79 70 65  ** for that type
1ed00 20 28 31 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e   (1, 2, or 4) in
1ed10 74 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73  to *pnByte..*/.s
1ed20 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1ed30 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74   *minimum_size_t
1ed40 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74  ype(int lwr, int
1ed50 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74   upr, int *pnByt
1ed60 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e){.  const char
1ed70 20 2a 7a 54 79 70 65 20 3d 20 22 69 6e 74 22 3b   *zType = "int";
1ed80 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 34  .  int nByte = 4
1ed90 3b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29  ;.  if( lwr>=0 )
1eda0 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32  {.    if( upr<=2
1edb0 35 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  55 ){.      zTyp
1edc0 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 63 68  e = "unsigned ch
1edd0 61 72 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  ar";.      nByte
1ede0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1edf0 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b  if( upr<65535 ){
1ee00 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1ee10 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
1ee20 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  nt";.      nByte
1ee30 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 2;.    }else{
1ee40 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1ee50 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20  unsigned int";. 
1ee60 20 20 20 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a       nByte = 4;.
1ee70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1ee80 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75  ( lwr>=-127 && u
1ee90 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a  pr<=127 ){.    z
1eea0 54 79 70 65 20 3d 20 22 73 69 67 6e 65 64 20 63  Type = "signed c
1eeb0 68 61 72 22 3b 0a 20 20 20 20 6e 42 79 74 65 20  har";.    nByte 
1eec0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
1eed0 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20   lwr>=-32767 && 
1eee0 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20  upr<32767 ){.   
1eef0 20 7a 54 79 70 65 20 3d 20 22 73 68 6f 72 74 22   zType = "short"
1ef00 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b  ;.    nByte = 2;
1ef10 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79 74  .  }.  if( pnByt
1ef20 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42  e ) *pnByte = nB
1ef30 79 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  yte;.  return zT
1ef40 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61  ype;.}../*.** Ea
1ef50 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e  ch state contain
1ef60 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e  s a set of token
1ef70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1ef80 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e   a set of.** non
1ef90 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63  terminal transac
1efa0 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20  tions.  Each of 
1efb0 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73  these sets makes
1efc0 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20   an instance.** 
1efd0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1efe0 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20   structure.  An 
1eff0 61 72 72 61 79 20 6f 66 20 74 68 65 73 65 20 73  array of these s
1f000 74 72 75 63 74 75 72 65 73 20 69 73 20 75 73 65  tructures is use
1f010 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68  d.** to order th
1f020 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e  e creation of en
1f030 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f  tries in the yy_
1f040 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a  action[] table..
1f050 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74 20  */.struct axset 
1f060 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1f070 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f   *stp;   /* A po
1f080 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
1f090 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b   */.  int isTkn;
1f0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f0b0 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73  ue to use tokens
1f0c0 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e  .  False for non
1f0d0 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  -terminals */.  
1f0e0 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20  int nAction;    
1f0f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f100 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  f actions */.  i
1f110 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20  nt iOrder;      
1f120 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1f130 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20  order of action 
1f140 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sets */.};../*.*
1f150 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73  * Compare to axs
1f160 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  et structures fo
1f170 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
1f180 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1f190 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63   axset_compare(c
1f1a0 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
1f1b0 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
1f1c0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31  struct axset *p1
1f1d0 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1f1e0 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78  *)a;.  struct ax
1f1f0 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63  set *p2 = (struc
1f200 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e  t axset*)b;.  in
1f210 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e  t c;.  c = p2->n
1f220 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63  Action - p1->nAc
1f230 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30  tion;.  if( c==0
1f240 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d 3e   ){.    c = p1->
1f250 69 4f 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f 72  iOrder - p2->iOr
1f260 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  der;.  }.  asser
1f270 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70  t( c!=0 || p1==p
1f280 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  2 );.  return c;
1f290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1f2a0 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68  text on "out" th
1f2b0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
1f2c0 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73   rule "rp"..*/.s
1f2d0 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65  tatic void write
1f2e0 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f  RuleText(FILE *o
1f2f0 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  ut, struct rule 
1f300 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *rp){.  int j;. 
1f310 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
1f320 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e   ::=", rp->lhs->
1f330 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  name);.  for(j=0
1f340 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b  ; j<rp->nrhs; j+
1f350 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
1f360 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
1f370 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  rhs[j];.    if( 
1f380 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
1f390 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
1f3a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
1f3b0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
1f3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f3d0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72  int k;.      fpr
1f3e0 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
1f3f0 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
1f400 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
1f410 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73  k=1; k<sp->nsubs
1f420 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; k++){.      
1f430 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c    fprintf(out,"|
1f440 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b  %s",sp->subsym[k
1f450 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
1f460 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
1f470 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f  /* Generate C so
1f480 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
1f490 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
1f4a0 20 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20   ReportTable(.  
1f4b0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1f4c0 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67  mp,.  int mhflag
1f4d0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69       /* Output i
1f4e0 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f  n makeheaders fo
1f4f0 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  rmat if true */.
1f500 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20  ){.  FILE *out, 
1f510 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  *in;.  char line
1f520 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1f530 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72  t  lineno;.  str
1f540 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1f550 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1f560 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *ap;.  struct ru
1f570 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
1f580 20 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62   acttab *pActtab
1f590 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c  ;.  int i, j, n,
1f5a0 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74   sz;.  int szAct
1f5b0 69 6f 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a 20  ionType;     /* 
1f5c0 73 69 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e 54  sizeof(YYACTIONT
1f5d0 59 50 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  YPE) */.  int sz
1f5e0 43 6f 64 65 54 79 70 65 3b 20 20 20 20 20 20 20  CodeType;       
1f5f0 2f 2a 20 73 69 7a 65 6f 66 28 59 59 43 4f 44 45  /* sizeof(YYCODE
1f600 54 59 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e  TYPE)   */.  con
1f610 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20  st char *name;. 
1f620 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20   int mnTknOfst, 
1f630 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74  mxTknOfst;.  int
1f640 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f   mnNtOfst, mxNtO
1f650 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78  fst;.  struct ax
1f660 73 65 74 20 2a 61 78 3b 0a 0a 20 20 6c 65 6d 70  set *ax;..  lemp
1f670 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65  ->minShiftReduce
1f680 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
1f690 0a 20 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69  .  lemp->errActi
1f6a0 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68  on = lemp->minSh
1f6b0 69 66 74 52 65 64 75 63 65 20 2b 20 6c 65 6d 70  iftReduce + lemp
1f6c0 2d 3e 6e 72 75 6c 65 3b 0a 20 20 6c 65 6d 70 2d  ->nrule;.  lemp-
1f6d0 3e 61 63 63 41 63 74 69 6f 6e 20 3d 20 6c 65 6d  >accAction = lem
1f6e0 70 2d 3e 65 72 72 41 63 74 69 6f 6e 20 2b 20 31  p->errAction + 1
1f6f0 3b 0a 20 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69  ;.  lemp->noActi
1f700 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 61 63 63 41 63  on = lemp->accAc
1f710 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d 70  tion + 1;.  lemp
1f720 2d 3e 6d 69 6e 52 65 64 75 63 65 20 3d 20 6c 65  ->minReduce = le
1f730 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 20 2b 20 31  mp->noAction + 1
1f740 3b 0a 20 20 6c 65 6d 70 2d 3e 6d 61 78 41 63 74  ;.  lemp->maxAct
1f750 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52  ion = lemp->minR
1f760 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  educe + lemp->nr
1f770 75 6c 65 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c  ule;..  in = tpl
1f780 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20  t_open(lemp);.  
1f790 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
1f7a0 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65  rn;.  out = file
1f7b0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c  _open(lemp,".c",
1f7c0 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  "wb");.  if( out
1f7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  ==0 ){.    fclos
1f7e0 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  e(in);.    retur
1f7f0 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20  n;.  }.  lineno 
1f800 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  = 1;.  tplt_xfer
1f810 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1f820 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1f830 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1f840 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66  include code, if
1f850 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70   any */.  tplt_p
1f860 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1f870 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e  mp->include,&lin
1f880 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c  eno);.  if( mhfl
1f890 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ag ){.    char *
1f8a0 69 6e 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  incName = file_m
1f8b0 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e  akename(lemp, ".
1f8c0 68 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  h");.    fprintf
1f8d0 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c  (out,"#include \
1f8e0 22 25 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d  "%s\"\n", incNam
1f8f0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1f900 20 20 66 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b    free(incName);
1f910 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1f920 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1f930 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1f940 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66  /* Generate #def
1f950 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b  ines for all tok
1f960 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66  ens */.  if( mhf
1f970 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  lag ){.    const
1f980 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1f990 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f9a0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1f9b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1f9c0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1f9d0 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20  prefix ) prefix 
1f9e0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  = lemp->tokenpre
1f9f0 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  fix;.    else   
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1fa20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
1fa30 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
1fa40 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
1fa50 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1fa60 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
1fa70 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
1fa80 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1fa90 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
1faa0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1fab0 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1fac0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1fad0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1fae0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1faf0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1fb00 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69  enerate the defi
1fb10 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  nes */.  fprintf
1fb20 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fb30 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a  CODETYPE %s\n",.
1fb40 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1fb50 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1fb60 73 79 6d 62 6f 6c 2c 20 26 73 7a 43 6f 64 65 54  symbol, &szCodeT
1fb70 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ype)); lineno++;
1fb80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1fb90 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45  #define YYNOCODE
1fba0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79   %d\n",lemp->nsy
1fbb0 6d 62 6f 6c 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  mbol);  lineno++
1fbc0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1fbd0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
1fbe0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
1fbf0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1fc00 70 65 28 30 2c 6c 65 6d 70 2d 3e 6d 61 78 41 63  pe(0,lemp->maxAc
1fc10 74 69 6f 6e 2c 26 73 7a 41 63 74 69 6f 6e 54 79  tion,&szActionTy
1fc20 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  pe)); lineno++;.
1fc30 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64    if( lemp->wild
1fc40 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69  card ){.    fpri
1fc50 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fc60 20 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e   YYWILDCARD %d\n
1fc70 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ",.       lemp->
1fc80 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29  wildcard->index)
1fc90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1fca0 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e    print_stack_un
1fcb0 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69  ion(out,lemp,&li
1fcc0 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20  neno,mhflag);.  
1fcd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69  fprintf(out, "#i
1fce0 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50  fndef YYSTACKDEP
1fcf0 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  TH\n"); lineno++
1fd00 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  ;.  if( lemp->st
1fd10 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  acksize ){.    f
1fd20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fd30 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1fd40 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61   %s\n",lemp->sta
1fd50 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f  cksize);  lineno
1fd60 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1fd70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1fd80 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1fd90 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e  TH 100\n");  lin
1fda0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72  eno++;.  }.  fpr
1fdb0 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69  intf(out, "#endi
1fdc0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1fdd0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1fde0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1fdf0 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
1fe00 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1fe10 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70   }.  name = lemp
1fe20 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
1fe30 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
1fe40 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26   if( lemp->arg &
1fe50 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29  & lemp->arg[0] )
1fe60 7b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53  {.    i = lemonS
1fe70 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29  trlen(lemp->arg)
1fe80 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1fe90 31 20 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d  1 && ISSPACE(lem
1fea0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69  p->arg[i-1]) ) i
1feb0 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  --;.    while( i
1fec0 3e 3d 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28  >=1 && (ISALNUM(
1fed0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20  lemp->arg[i-1]) 
1fee0 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  || lemp->arg[i-1
1fef0 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20  ]=='_') ) i--;. 
1ff00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ff10 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44  #define %sARG_SD
1ff20 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c  ECL %s;\n",name,
1ff30 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
1ff40 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1ff50 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1ff60 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c  %sARG_PDECL ,%s\
1ff70 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
1ff80 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
1ff90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ffa0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 41  #define %sARG_PA
1ffb0 52 41 4d 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c  RAM ,%s\n",name,
1ffc0 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
1ffd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1ffe0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fff0 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 20  ine %sARG_FETCH 
20000 25 73 3d 79 79 70 50 61 72 73 65 72 2d 3e 25 73  %s=yypParser->%s
20010 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;\n",.          
20020 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70         name,lemp
20030 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67  ->arg,&lemp->arg
20040 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
20050 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20060 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
20070 53 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d  STORE yypParser-
20080 3e 25 73 3d 25 73 3b 5c 6e 22 2c 0a 20 20 20 20  >%s=%s;\n",.    
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
200a0 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c  e,&lemp->arg[i],
200b0 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
200c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
200d0 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
200e0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
200f0 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  RG_SDECL\n",name
20100 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
20110 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
20120 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
20130 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  L\n",name); line
20140 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
20150 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
20160 73 41 52 47 5f 50 41 52 41 4d 5c 6e 22 2c 6e 61  sARG_PARAM\n",na
20170 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
20180 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
20190 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
201a0 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  TCH\n",name); li
201b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
201c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
201d0 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c   %sARG_STORE\n",
201e0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
201f0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
20200 3e 63 74 78 20 26 26 20 6c 65 6d 70 2d 3e 63 74  >ctx && lemp->ct
20210 78 5b 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20  x[0] ){.    i = 
20220 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
20230 2d 3e 63 74 78 29 3b 0a 20 20 20 20 77 68 69 6c  ->ctx);.    whil
20240 65 28 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41  e( i>=1 && ISSPA
20250 43 45 28 6c 65 6d 70 2d 3e 63 74 78 5b 69 2d 31  CE(lemp->ctx[i-1
20260 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68  ]) ) i--;.    wh
20270 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53  ile( i>=1 && (IS
20280 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 63 74 78 5b  ALNUM(lemp->ctx[
20290 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 63  i-1]) || lemp->c
202a0 74 78 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20  tx[i-1]=='_') ) 
202b0 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  i--;.    fprintf
202c0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
202d0 43 54 58 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22  CTX_SDECL %s;\n"
202e0 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 63 74 78 29  ,name,lemp->ctx)
202f0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
20300 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
20310 65 66 69 6e 65 20 25 73 43 54 58 5f 50 44 45 43  efine %sCTX_PDEC
20320 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L ,%s\n",name,le
20330 6d 70 2d 3e 63 74 78 29 3b 20 20 6c 69 6e 65 6e  mp->ctx);  linen
20340 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
20350 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
20360 43 54 58 5f 50 41 52 41 4d 20 2c 25 73 5c 6e 22  CTX_PARAM ,%s\n"
20370 2c 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 63 74 78  ,name,&lemp->ctx
20380 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
20390 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
203a0 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f  ,"#define %sCTX_
203b0 46 45 54 43 48 20 25 73 3d 79 79 70 50 61 72 73  FETCH %s=yypPars
203c0 65 72 2d 3e 25 73 3b 5c 6e 22 2c 0a 20 20 20 20  er->%s;\n",.    
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
203e0 65 2c 6c 65 6d 70 2d 3e 63 74 78 2c 26 6c 65 6d  e,lemp->ctx,&lem
203f0 70 2d 3e 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e  p->ctx[i]);  lin
20400 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
20410 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20420 25 73 43 54 58 5f 53 54 4f 52 45 20 79 79 70 50  %sCTX_STORE yypP
20430 61 72 73 65 72 2d 3e 25 73 3d 25 73 3b 5c 6e 22  arser->%s=%s;\n"
20440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20450 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 63     name,&lemp->c
20460 74 78 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 63 74 78  tx[i],&lemp->ctx
20470 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
20480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
20490 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
204a0 6e 65 20 25 73 43 54 58 5f 53 44 45 43 4c 5c 6e  ne %sCTX_SDECL\n
204b0 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
204c0 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
204d0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54  ut,"#define %sCT
204e0 58 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  X_PDECL\n",name)
204f0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
20500 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
20510 66 69 6e 65 20 25 73 43 54 58 5f 50 41 52 41 4d  fine %sCTX_PARAM
20520 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
20530 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
20540 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
20550 43 54 58 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d  CTX_FETCH\n",nam
20560 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
20570 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
20580 64 65 66 69 6e 65 20 25 73 43 54 58 5f 53 54 4f  define %sCTX_STO
20590 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  RE\n",name); lin
205a0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
205b0 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
205c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
205d0 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
205e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  ;.  }.  if( lemp
205f0 2d 3e 65 72 72 73 79 6d 20 26 26 20 6c 65 6d 70  ->errsym && lemp
20600 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
20610 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
20620 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
20630 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22  RRORSYMBOL %d\n"
20640 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69  ,lemp->errsym->i
20650 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
20660 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20670 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53  ,"#define YYERRS
20680 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d  YMDT yy%d\n",lem
20690 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d  p->errsym->dtnum
206a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
206b0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
206c0 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
206d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
206e0 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b  efine YYFALLBACK
206f0 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b   1\n");  lineno+
20700 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  +;.  }..  /* Com
20710 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  pute the action 
20720 74 61 62 6c 65 2c 20 62 75 74 20 64 6f 20 6e 6f  table, but do no
20730 74 20 6f 75 74 70 75 74 20 69 74 20 79 65 74 2e  t output it yet.
20740 20 20 54 68 65 20 61 63 74 69 6f 6e 0a 20 20 2a    The action.  *
20750 2a 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  * table must be 
20760 63 6f 6d 70 75 74 65 64 20 62 65 66 6f 72 65 20  computed before 
20770 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 59  generating the Y
20780 59 4e 53 54 41 54 45 20 6d 61 63 72 6f 20 62 65  YNSTATE macro be
20790 63 61 75 73 65 0a 20 20 2a 2a 20 77 65 20 6e 65  cause.  ** we ne
207a0 65 64 20 74 6f 20 6b 6e 6f 77 20 68 6f 77 20 6d  ed to know how m
207b0 61 6e 79 20 73 74 61 74 65 73 20 63 61 6e 20 62  any states can b
207c0 65 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 20 20  e eliminated..  
207d0 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74 72 75 63  */.  ax = (struc
207e0 74 20 61 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f  t axset *) callo
207f0 63 28 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a  c(lemp->nxstate*
20800 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
20810 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29  );.  if( ax==0 )
20820 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
20830 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
20840 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  led\n");.    exi
20850 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
20860 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
20870 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
20880 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
20890 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a  ed[i];.    ax[i*
208a0 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  2].stp = stp;.  
208b0 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20    ax[i*2].isTkn 
208c0 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  = 1;.    ax[i*2]
208d0 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
208e0 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b  nTknAct;.    ax[
208f0 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70  i*2+1].stp = stp
20900 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
20910 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61  isTkn = 0;.    a
20920 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e  x[i*2+1].nAction
20930 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a   = stp->nNtAct;.
20940 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20    }.  mxTknOfst 
20950 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b  = mnTknOfst = 0;
20960 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e  .  mxNtOfst = mn
20970 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 20 20 2f 2a  NtOfst = 0;.  /*
20980 20 49 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   In an effort to
20990 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 63   minimize the ac
209a0 74 69 6f 6e 20 74 61 62 6c 65 20 73 69 7a 65 2c  tion table size,
209b0 20 75 73 65 20 74 68 65 20 68 65 75 72 69 73 74   use the heurist
209c0 69 63 0a 20 20 2a 2a 20 6f 66 20 70 6c 61 63 69  ic.  ** of placi
209d0 6e 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 61  ng the largest a
209e0 63 74 69 6f 6e 20 73 65 74 73 20 66 69 72 73 74  ction sets first
209f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
20a00 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32  <lemp->nxstate*2
20a10 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72  ; i++) ax[i].iOr
20a20 64 65 72 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74  der = i;.  qsort
20a30 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78 73 74 61  (ax, lemp->nxsta
20a40 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b  te*2, sizeof(ax[
20a50 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61  0]), axset_compa
20a60 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d  re);.  pActtab =
20a70 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 6c 65   acttab_alloc(le
20a80 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20 6c 65 6d  mp->nsymbol, lem
20a90 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20  p->nterminal);. 
20aa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
20ab0 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26 26 20 61  ->nxstate*2 && a
20ac0 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20  x[i].nAction>0; 
20ad0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
20ae0 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69  ax[i].stp;.    i
20af0 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29  f( ax[i].isTkn )
20b00 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
20b10 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
20b20 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
20b30 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
20b40 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
20b50 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e  ->index>=lemp->n
20b60 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69  terminal ) conti
20b70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
20b80 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  ion = compute_ac
20b90 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a  tion(lemp, ap);.
20ba0 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69          if( acti
20bb0 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  on<0 ) continue;
20bc0 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f  .        acttab_
20bd0 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
20be0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61  ap->sp->index, a
20bf0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ction);.      }.
20c00 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f        stp->iTknO
20c10 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73  fst = acttab_ins
20c20 65 72 74 28 70 41 63 74 74 61 62 2c 20 31 29 3b  ert(pActtab, 1);
20c30 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
20c40 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66  iTknOfst<mnTknOf
20c50 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st ) mnTknOfst =
20c60 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
20c70 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
20c80 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73  TknOfst>mxTknOfs
20c90 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  t ) mxTknOfst = 
20ca0 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20  stp->iTknOfst;. 
20cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20cc0 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
20cd0 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
20ce0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63  {.        int ac
20cf0 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
20d00 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
20d10 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
20d20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20d30 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
20d40 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79  index==lemp->nsy
20d50 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mbol ) continue;
20d60 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20  .        action 
20d70 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  = compute_action
20d80 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20  (lemp, ap);.    
20d90 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30      if( action<0
20da0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20db0 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69       acttab_acti
20dc0 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e  on(pActtab, ap->
20dd0 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f  sp->index, actio
20de0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
20df0 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d    stp->iNtOfst =
20e00 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
20e10 41 63 74 74 61 62 2c 20 30 29 3b 0a 20 20 20 20  Acttab, 0);.    
20e20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
20e30 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e  st<mnNtOfst ) mn
20e40 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
20e50 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  tOfst;.      if(
20e60 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
20e70 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
20e80 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
20e90 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30 20 20 2f  ;.    }.#if 0  /
20ea0 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  * Uncomment for 
20eb0 61 20 74 72 61 63 65 20 6f 66 20 68 6f 77 20 74  a trace of how t
20ec0 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
20ed0 61 62 6c 65 20 66 69 6c 6c 73 20 6f 75 74 20 2a  able fills out *
20ee0 2f 0a 20 20 20 20 7b 20 69 6e 74 20 6a 6a 2c 20  /.    { int jj, 
20ef0 6e 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  nn;.      for(jj
20f00 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63 74 74 61  =nn=0; jj<pActta
20f10 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 6a 2b 2b  b->nAction; jj++
20f20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20f30 41 63 74 74 61 62 2d 3e 61 41 63 74 69 6f 6e 5b  Acttab->aAction[
20f40 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20 29 20 6e  jj].action<0 ) n
20f50 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
20f60 20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20     printf("%4d: 
20f70 53 74 61 74 65 20 25 33 64 20 25 73 20 6e 3a 20  State %3d %s n: 
20f80 25 32 64 20 73 69 7a 65 3a 20 25 35 64 20 66 72  %2d size: %5d fr
20f90 65 65 73 70 61 63 65 3a 20 25 64 5c 6e 22 2c 0a  eespace: %d\n",.
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20               i, 
20fb0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 2c 20 61  stp->statenum, a
20fc0 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20 22 54 6f  x[i].isTkn ? "To
20fd0 6b 65 6e 22 20 3a 20 22 56 61 72 20 20 22 2c 0a  ken" : "Var  ",.
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 78 5b               ax[
20ff0 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70 41 63 74  i].nAction, pAct
21000 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c 20 6e 6e  tab->nAction, nn
21010 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
21020 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a    }.  free(ax);.
21030 0a 20 20 2f 2a 20 4d 61 72 6b 20 72 75 6c 65 73  .  /* Mark rules
21040 20 74 68 61 74 20 61 72 65 20 61 63 74 75 61 6c   that are actual
21050 6c 79 20 75 73 65 64 20 66 6f 72 20 72 65 64 75  ly used for redu
21060 63 65 20 61 63 74 69 6f 6e 73 20 61 66 74 65 72  ce actions after
21070 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74 69 6d 69   all.  ** optimi
21080 7a 61 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  zations have bee
21090 6e 20 61 70 70 6c 69 65 64 0a 20 20 2a 2f 0a 20  n applied.  */. 
210a0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
210b0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
210c0 65 78 74 29 20 72 70 2d 3e 64 6f 65 73 52 65 64  ext) rp->doesRed
210d0 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  uce = LEMON_FALS
210e0 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  E;.  for(i=0; i<
210f0 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69  lemp->nxstate; i
21100 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ++){.    for(ap=
21110 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
21120 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
21130 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
21140 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
21150 45 20 7c 7c 20 61 70 2d 3e 74 79 70 65 3d 3d 53  E || ap->type==S
21160 48 49 46 54 52 45 44 55 43 45 20 29 7b 0a 20 20  HIFTREDUCE ){.  
21170 20 20 20 20 20 20 61 70 2d 3e 78 2e 72 70 2d 3e        ap->x.rp->
21180 64 6f 65 73 52 65 64 75 63 65 20 3d 20 31 3b 0a  doesReduce = 1;.
21190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
211a0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 20 72  }..  /* Finish r
211b0 65 6e 64 65 72 69 6e 67 20 74 68 65 20 63 6f 6e  endering the con
211c0 73 74 61 6e 74 73 20 6e 6f 77 20 74 68 61 74 20  stants now that 
211d0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
211e0 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63   has.  ** been c
211f0 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 66 70 72  omputed */.  fpr
21200 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
21210 65 20 59 59 4e 53 54 41 54 45 20 20 20 20 20 20  e YYNSTATE      
21220 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
21230 70 2d 3e 6e 78 73 74 61 74 65 29 3b 20 20 6c 69  p->nxstate);  li
21240 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
21250 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
21260 59 4e 52 55 4c 45 20 20 20 20 20 20 20 20 20 20  YNRULE          
21270 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e      %d\n",lemp->
21280 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  nrule);  lineno+
21290 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
212a0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 54 4f 4b  ,"#define YYNTOK
212b0 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 25  EN             %
212c0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  d\n",lemp->nterm
212d0 69 6e 61 6c 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  inal); lineno++;
212e0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
212f0 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53  #define YY_MAX_S
21300 48 49 46 54 20 20 20 20 20 20 20 20 20 25 64 5c  HIFT         %d\
21310 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  n",lemp->nxstate
21320 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
21330 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68   i = lemp->minSh
21340 69 66 74 52 65 64 75 63 65 3b 0a 20 20 66 70 72  iftReduce;.  fpr
21350 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
21360 65 20 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45  e YY_MIN_SHIFTRE
21370 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 69 29 3b  DUCE   %d\n",i);
21380 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 2b   lineno++;.  i +
21390 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20  = lemp->nrule;. 
213a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
213b0 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49  efine YY_MAX_SHI
213c0 46 54 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22  FTREDUCE   %d\n"
213d0 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , i-1); lineno++
213e0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
213f0 22 23 64 65 66 69 6e 65 20 59 59 5f 45 52 52 4f  "#define YY_ERRO
21400 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 25 64  R_ACTION      %d
21410 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 65 72 72 41 63  \n", lemp->errAc
21420 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tion); lineno++;
21430 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
21440 23 64 65 66 69 6e 65 20 59 59 5f 41 43 43 45 50  #define YY_ACCEP
21450 54 5f 41 43 54 49 4f 4e 20 20 20 20 20 25 64 5c  T_ACTION     %d\
21460 6e 22 2c 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74  n", lemp->accAct
21470 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ion); lineno++;.
21480 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
21490 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41 43 54  define YY_NO_ACT
214a0 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64 5c 6e  ION         %d\n
214b0 22 2c 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f  ", lemp->noActio
214c0 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  n); lineno++;.  
214d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
214e0 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 52 45 44 55  fine YY_MIN_REDU
214f0 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  CE        %d\n",
21500 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65   lemp->minReduce
21510 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
21520 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75   = lemp->minRedu
21530 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  ce + lemp->nrule
21540 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21550 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f  "#define YY_MAX_
21560 52 45 44 55 43 45 20 20 20 20 20 20 20 20 25 64  REDUCE        %d
21570 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e  \n", i-1); linen
21580 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
21590 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
215a0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
215b0 2f 2a 20 4e 6f 77 20 6f 75 74 70 75 74 20 74 68  /* Now output th
215c0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61  e action table a
215d0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
215e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79  s:.  **.  **  yy
215f0 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20  _action[]       
21600 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
21610 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61  containing all a
21620 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79  ctions..  **  yy
21630 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20  _lookahead[]    
21640 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   A table contain
21650 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61  ing the lookahea
21660 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79  d for each entry
21670 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   in.  **        
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 79 79 5f               yy_
21690 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f  action.  Used to
216a0 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c   detect hash col
216b0 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79  lisions..  **  y
216c0 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20  y_shift_ofst[]  
216d0 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65    For each state
216e0 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  , the offset int
216f0 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a  o yy_action for.
21700 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
21710 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e           shiftin
21720 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a  g terminals..  *
21730 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  *  yy_reduce_ofs
21740 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73  t[]   For each s
21750 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
21760 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
21770 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
21790 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e  fting non-termin
217a0 61 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75  als after a redu
217b0 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66  ce..  **  yy_def
217c0 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66  ault[]       Def
217d0 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
217e0 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f  each state..  */
217f0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
21800 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
21810 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 61 63  e */.  lemp->nac
21820 74 69 6f 6e 74 61 62 20 3d 20 6e 20 3d 20 61 63  tiontab = n = ac
21830 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73 69 7a 65  ttab_action_size
21840 28 70 41 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d  (pActtab);.  lem
21850 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20  p->tablesize += 
21860 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a  n*szActionType;.
21870 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
21880 64 65 66 69 6e 65 20 59 59 5f 41 43 54 54 41 42  define YY_ACTTAB
21890 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20  _COUNT (%d)\n", 
218a0 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  n); lineno++;.  
218b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61  fprintf(out,"sta
218c0 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
218d0 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e  ONTYPE yy_action
218e0 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
218f0 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
21900 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
21910 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61    int action = a
21920 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70  cttab_yyaction(p
21930 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
21940 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61  if( action<0 ) a
21950 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 6f  ction = lemp->no
21960 41 63 74 69 6f 6e 3b 0a 20 20 20 20 69 66 28 20  Action;.    if( 
21970 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
21980 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
21990 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
219a0 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
219b0 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  action);.    if(
219c0 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
219d0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
219e0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
219f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
21a00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
21a10 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
21a20 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
21a30 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
21a40 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
21a50 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68  ut the yy_lookah
21a60 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c  ead table */.  l
21a70 65 6d 70 2d 3e 6e 6c 6f 6f 6b 61 68 65 61 64 74  emp->nlookaheadt
21a80 61 62 20 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f  ab = n = acttab_
21a90 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a 65 28 70  lookahead_size(p
21aa0 41 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d 70 2d  Acttab);.  lemp-
21ab0 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
21ac0 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 66 70  szCodeType;.  fp
21ad0 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
21ae0 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59  c const YYCODETY
21af0 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  PE yy_lookahead[
21b00 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
21b10 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
21b20 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
21b30 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62   int la = acttab
21b40 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63  _yylookahead(pAc
21b50 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
21b60 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65  ( la<0 ) la = le
21b70 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20  mp->nsymbol;.   
21b80 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
21b90 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
21ba0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
21bb0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
21bc0 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66  d,", la);.    if
21bd0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
21be0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
21bf0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
21c00 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
21c10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
21c20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
21c30 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
21c40 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
21c50 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
21c60 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74  put the yy_shift
21c70 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
21c80 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
21c90 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
21ca0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
21cb0 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73  ed[n-1]->iTknOfs
21cc0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
21cd0 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
21ce0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
21cf0 48 49 46 54 5f 43 4f 55 4e 54 20 20 20 20 28 25  HIFT_COUNT    (%
21d00 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  d)\n", n-1); lin
21d10 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
21d20 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
21d30 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 20 20  Y_SHIFT_MIN     
21d40 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
21d50 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
21d60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21d70 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
21d80 5f 4d 41 58 20 20 20 20 20 20 28 25 64 29 5c 6e  _MAX      (%d)\n
21d90 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c  ", mxTknOfst); l
21da0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
21db0 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
21dc0 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66  const %s yy_shif
21dd0 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c  t_ofst[] = {\n",
21de0 0a 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  .       minimum_
21df0 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f  size_type(mnTknO
21e00 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d  fst, lemp->nterm
21e10 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e 61 63 74 69  inal+lemp->nacti
21e20 6f 6e 74 61 62 2c 20 26 73 7a 29 29 3b 0a 20 20  ontab, &sz));.  
21e30 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
21e40 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65   lemp->tablesize
21e50 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28   += n*sz;.  for(
21e60 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
21e70 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a  {.    int ofst;.
21e80 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
21e90 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f  sorted[i];.    o
21ea0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
21eb0 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73  fst;.    if( ofs
21ec0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f  t==NO_OFFSET ) o
21ed0 66 73 74 20 3d 20 6c 65 6d 70 2d 3e 6e 61 63 74  fst = lemp->nact
21ee0 69 6f 6e 74 61 62 3b 0a 20 20 20 20 69 66 28 20  iontab;.    if( 
21ef0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
21f00 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
21f10 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
21f20 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
21f30 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
21f40 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
21f50 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
21f60 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
21f70 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
21f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21f90 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
21fa0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
21fb0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
21fc0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
21fd0 20 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f   the yy_reduce_o
21fe0 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  fst[] table */. 
21ff0 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61   n = lemp->nxsta
22000 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  te;.  while( n>0
22010 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64   && lemp->sorted
22020 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d  [n-1]->iNtOfst==
22030 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
22040 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
22050 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
22060 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22  CE_COUNT (%d)\n"
22070 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , n-1); lineno++
22080 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
22090 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44   "#define YY_RED
220a0 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e  UCE_MIN   (%d)\n
220b0 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69  ", mnNtOfst); li
220c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
220d0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
220e0 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20  YY_REDUCE_MAX   
220f0 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73  (%d)\n", mxNtOfs
22100 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
22110 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
22120 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79  atic const %s yy
22130 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d  _reduce_ofst[] =
22140 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20   {\n",.         
22150 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
22160 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
22170 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20  xNtOfst, &sz)); 
22180 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70  lineno++;.  lemp
22190 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
221a0 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  *sz;.  for(i=j=0
221b0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
221c0 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
221d0 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
221e0 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
221f0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
22200 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
22210 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
22220 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20  mnNtOfst - 1;.  
22230 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
22240 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
22250 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
22260 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
22270 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
22280 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
22290 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
222a0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
222b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
222c0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
222d0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
222e0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
222f0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
22300 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
22310 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  Output the defau
22320 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  lt action table 
22330 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
22340 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
22350 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
22360 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22  default[] = {\n"
22370 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
22380 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
22390 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
223a0 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
223b0 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28 69 3d 6a  nType;.  for(i=j
223c0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
223d0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
223e0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66  orted[i];.    if
223f0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
22400 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
22410 20 22 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20   ", i);.    if( 
22420 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65  stp->iDfltReduce
22430 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  <0 ){.      fpri
22440 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
22450 2c 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f  , lemp->errActio
22460 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
22470 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
22480 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e  , " %4d,", stp->
22490 69 44 66 6c 74 52 65 64 75 63 65 20 2b 20 6c 65  iDfltReduce + le
224a0 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 29 3b 0a  mp->minReduce);.
224b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3d      }.    if( j=
224c0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
224d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
224e0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
224f0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
22500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22510 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
22520 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
22530 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
22540 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
22550 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
22560 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
22570 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
22580 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
22590 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
225a0 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
225b0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  lback ){.    int
225c0 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72   mx = lemp->nter
225d0 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77  minal - 1;.    w
225e0 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c 65  hile( mx>0 && le
225f0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d  mp->symbols[mx]-
22600 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20  >fallback==0 ){ 
22610 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65 6d 70  mx--; }.    lemp
22620 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 28  ->tablesize += (
22630 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79 70 65  mx+1)*szCodeType
22640 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22650 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <=mx; i++){.    
22660 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
22670 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
22680 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
22690 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
226a0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
226b0 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
226c0 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
226d0 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
226e0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
226f0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
22700 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
22710 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
22720 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
22730 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
22740 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
22750 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
22760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
22770 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
22780 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
22790 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
227a0 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
227b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
227c0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
227d0 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
227e0 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
227f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
22800 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
22810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f  ; i++){.    lemo
22820 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22  n_sprintf(line,"
22830 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
22840 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
22850 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
22860 74 2c 22 20 20 2f 2a 20 25 34 64 20 2a 2f 20 5c  t,"  /* %4d */ \
22870 22 25 73 5c 22 2c 5c 6e 22 2c 69 2c 20 6c 65 6d  "%s\",\n",i, lem
22880 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
22890 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
228a0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
228b0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
228c0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
228d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62  * Generate a tab
228e0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  le containing a 
228f0 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61 74  text string that
22900 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72 79   describes every
22910 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68  .  ** rule in th
22920 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68  e rule set of th
22930 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73  e grammar.  This
22940 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22950 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74  used.  ** when t
22960 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61 63  racing REDUCE ac
22970 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
22980 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e  r(i=0, rp=lemp->
22990 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
229a0 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  >next, i++){.   
229b0 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 52 75   assert( rp->iRu
229c0 6c 65 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72  le==i );.    fpr
229d0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33  intf(out," /* %3
229e0 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20  d */ \"", i);.  
229f0 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
22a00 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70  out, rp);.    fp
22a10 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e  rintf(out,"\",\n
22a20 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
22a30 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
22a40 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
22a50 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
22a60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
22a70 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65  ich executes eve
22a80 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c  ry time a symbol
22a90 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a   is popped from.
22aa0 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77    ** the stack w
22ab0 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
22ac0 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20  errors or while 
22ad0 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70  destroying the p
22ae0 61 72 73 65 72 2e 0a 20 20 2a 2a 20 28 49 6e 20  arser..  ** (In 
22af0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
22b00 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
22b10 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
22b20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
22b30 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
22b40 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
22b50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
22b60 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
22b70 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
22b80 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
22b90 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
22ba0 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
22bb0 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
22bc0 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
22bd0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
22be0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
22bf0 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f  tf(out, "      /
22c00 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72  * TERMINAL Destr
22c10 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69  uctor */\n"); li
22c20 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
22c30 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
22c40 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
22c50 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
22c60 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
22c70 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
22c80 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
22c90 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
22ca0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
22cb0 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  l && lemp->symbo
22cc0 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52  ls[i]->type!=TER
22cd0 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20  MINAL; i++);.   
22ce0 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79   if( i<lemp->nsy
22cf0 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d  mbol ){.      em
22d00 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
22d10 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
22d20 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
22d30 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
22d40 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
22d50 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
22d60 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
22d70 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64    if( lemp->vard
22d80 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  est ){.    struc
22d90 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73  t symbol *dflt_s
22da0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f  p = 0;.    int o
22db0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
22dc0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
22dd0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
22de0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
22df0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
22e00 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
22e10 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
22e20 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
22e30 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  |.          sp->
22e40 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e  index<=0 || sp->
22e50 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20  destructor!=0 ) 
22e60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22e70 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
22e80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22e90 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75   "      /* Defau
22ea0 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20  lt NON-TERMINAL 
22eb0 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
22ec0 29 3b 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  );lineno++;.    
22ed0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
22ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
22ef0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
22f00 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
22f10 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
22f20 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
22f30 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70  +;.      dflt_sp
22f40 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = sp;.    }.   
22f50 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20   if( dflt_sp!=0 
22f60 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
22f70 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
22f80 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26  t,dflt_sp,lemp,&
22f90 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  lineno);.    }. 
22fa0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
22fb0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
22fc0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
22fd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
22fe0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
22ff0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
23000 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
23010 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
23020 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
23030 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
23040 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
23050 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
23060 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 65 73  .    if( sp->des
23070 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63 6f 6e 74  tLineno<0 ) cont
23080 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72 65 61 64  inue;  /* Alread
23090 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20  y emitted */.   
230a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
230b0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
230c0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
230d0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
230e0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  neno++;..    /* 
230f0 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74  Combine duplicat
23100 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e  e destructors in
23110 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65  to a single case
23120 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   */.    for(j=i+
23130 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  1; j<lemp->nsymb
23140 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
23150 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
23160 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  p2 = lemp->symbo
23170 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[j];.      if(
23180 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70   sp2 && sp2->typ
23190 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73  e!=TERMINAL && s
231a0 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20  p2->destructor. 
231b0 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d           && sp2-
231c0 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75  >dtnum==sp->dtnu
231d0 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  m.          && s
231e0 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75  trcmp(sp->destru
231f0 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75  ctor,sp2->destru
23200 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ctor)==0 ){.    
23210 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
23220 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
23230 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  * %s */\n",.    
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70 32               sp2
23250 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61  ->index, sp2->na
23260 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
23270 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73          sp2->des
23280 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b 20 20 2f  tLineno = -1;  /
23290 2a 20 41 76 6f 69 64 20 65 6d 69 74 74 69 6e 67  * Avoid emitting
232a0 20 74 68 69 73 20 64 65 73 74 72 75 63 74 6f 72   this destructor
232b0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
232c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69  }.    }..    emi
232d0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
232e0 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
232f0 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
23300 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
23310 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
23320 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
23330 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
23340 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
23350 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
23360 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
23370 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
23380 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
23390 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
233a0 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
233b0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
233c0 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c  emp->overflow,&l
233d0 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
233e0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
233f0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
23400 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
23410 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65  he table of rule
23420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 2a   information.  *
23430 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69  *.  ** Note: Thi
23440 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
23450 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
23460 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72  rules are number
23470 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c  .  ** sequentual
23480 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ly beginning wit
23490 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  h 0..  */.  for(
234a0 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75  i=0, rp=lemp->ru
234b0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
234c0 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ext, i++){.    f
234d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20  printf(out,"  { 
234e0 25 34 64 2c 20 25 34 64 20 7d 2c 20 2f 2a 20 28  %4d, %4d }, /* (
234f0 25 64 29 20 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69  %d) ",rp->lhs->i
23500 6e 64 65 78 2c 2d 72 70 2d 3e 6e 72 68 73 2c 69  ndex,-rp->nrhs,i
23510 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70 72 69 6e  );.    rule_prin
23520 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
23530 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f  fprintf(out," */
23540 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
23550 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
23560 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
23570 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
23580 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23590 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20  which execution 
235a0 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44 55  during each REDU
235b0 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  CE action */.  i
235c0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70 3d 6c   = 0;.  for(rp=l
235d0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
235e0 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
235f0 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74 65 5f   i += translate_
23600 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a  code(lemp, rp);.
23610 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b 0a 20    }.  if( i ){. 
23620 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
23630 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f 52 54          YYMINORT
23640 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b 5c  YPE yylhsminor;\
23650 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
23660 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f 75   }.  /* First ou
23670 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65 72  tput rules other
23680 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c   than the defaul
23690 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72  t: rule */.  for
236a0 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
236b0 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
236c0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c  {.    struct rul
236d0 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20 20  e *rp2;         
236e0 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 72        /* Other r
236f0 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61  ules with the sa
23700 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  me action */.   
23710 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d 69   if( rp->codeEmi
23720 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tted ) continue;
23730 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f 43  .    if( rp->noC
23740 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ode ){.      /* 
23750 4e 6f 20 43 20 63 6f 64 65 20 61 63 74 69 6f 6e  No C code action
23760 73 2c 20 73 6f 20 74 68 69 73 20 77 69 6c 6c 20  s, so this will 
23770 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 22  be part of the "
23780 64 65 66 61 75 6c 74 3a 22 20 72 75 6c 65 20 2a  default:" rule *
23790 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
237a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
237b0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63  ntf(out,"      c
237c0 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70  ase %d: /* ", rp
237d0 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72  ->iRule);.    wr
237e0 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
237f0 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
23800 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b  f(out, " */\n");
23810 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
23820 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b  or(rp2=rp->next;
23830 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e   rp2; rp2=rp2->n
23840 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
23850 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63  rp2->code==rp->c
23860 6f 64 65 20 26 26 20 72 70 32 2d 3e 63 6f 64 65  ode && rp2->code
23870 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65  Prefix==rp->code
23880 50 72 65 66 69 78 0a 20 20 20 20 20 20 20 20 20  Prefix.         
23890 20 20 20 20 26 26 20 72 70 32 2d 3e 63 6f 64 65      && rp2->code
238a0 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65  Suffix==rp->code
238b0 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Suffix ){.      
238c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
238d0 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a       case %d: /*
238e0 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b   ", rp2->iRule);
238f0 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52 75  .        writeRu
23900 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29  leText(out, rp2)
23910 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
23920 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73  f(out," */ yytes
23930 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
23940 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 52  %d);\n", rp2->iR
23950 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ule); lineno++;.
23960 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64          rp2->cod
23970 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20  eEmitted = 1;.  
23980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23990 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70  emit_code(out,rp
239a0 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
239b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
239c0 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  "        break;\
239d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
239e0 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74     rp->codeEmitt
239f0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  ed = 1;.  }.  /*
23a00 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74   Finally, output
23a10 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
23a20 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61  le.  We choose a
23a30 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61  s the default: a
23a40 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63  ll.  ** empty ac
23a50 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69  tions. */.  fpri
23a60 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64  ntf(out,"      d
23a70 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e  efault:\n"); lin
23a80 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d  eno++;.  for(rp=
23a90 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
23aa0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
23ab0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d    if( rp->codeEm
23ac0 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  itted ) continue
23ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70  ;.    assert( rp
23ae0 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20 20 20 20  ->noCode );.    
23af0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
23b00 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
23b10 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72  ->iRule);.    wr
23b20 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
23b30 20 72 70 29 3b 0a 20 20 20 20 69 66 28 20 72 70   rp);.    if( rp
23b40 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 29 7b 0a  ->doesReduce ){.
23b50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
23b60 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63 61  t, " */ yytestca
23b70 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29  se(yyruleno==%d)
23b80 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  ;\n", rp->iRule)
23b90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
23ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
23bb0 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 4f 50 54  intf(out, " (OPT
23bc0 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a 2f 20 61  IMIZED OUT) */ a
23bd0 73 73 65 72 74 28 79 79 72 75 6c 65 6e 6f 21 3d  ssert(yyruleno!=
23be0 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %d);\n",.       
23bf0 20 20 20 20 20 20 20 72 70 2d 3e 69 52 75 6c 65         rp->iRule
23c00 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
23c10 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
23c20 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
23c30 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
23c40 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
23c50 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
23c60 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
23c70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23c80 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69  which executes i
23c90 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20  f a parse fails 
23ca0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
23cb0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66  out,lemp,lemp->f
23cc0 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b  ailure,&lineno);
23cd0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
23ce0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
23cf0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
23d00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
23d10 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
23d20 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
23d30 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74  occurs */.  tplt
23d40 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
23d50 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e  lemp->error,&lin
23d60 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
23d70 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23d80 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23d90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
23da0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
23db0 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
23dc0 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
23dd0 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
23de0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
23df0 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f  ->accept,&lineno
23e00 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
23e10 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
23e20 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
23e30 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
23e40 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
23e50 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
23e60 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
23e70 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
23e80 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ode,&lineno);.. 
23e90 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66   fclose(in);.  f
23ea0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65  close(out);.  re
23eb0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  turn;.}../* Gene
23ec0 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69  rate a header fi
23ed0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  le for the parse
23ee0 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
23ef0 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c 65  Header(struct le
23f00 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46  mon *lemp).{.  F
23f10 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
23f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
23f30 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  fix;.  char line
23f40 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68  [LINESIZE];.  ch
23f50 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53  ar pattern[LINES
23f60 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  IZE];.  int i;..
23f70 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
23f80 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
23f90 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
23fa0 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20  efix;.  else    
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69  prefix = "";.  i
23fd0 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  n = file_open(le
23fe0 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20  mp,".h","rb");. 
23ff0 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69   if( in ){.    i
24000 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20 20 20  nt nextChar;.   
24010 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
24020 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66  ->nterminal && f
24030 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
24040 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  ZE,in); i++){.  
24050 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
24060 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69  f(pattern,"#defi
24070 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e  ne %s%-30s %3d\n
24080 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
24090 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 6c 65         prefix,le
240a0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
240b0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
240c0 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
240d0 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
240e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 43  .    }.    nextC
240f0 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29 3b  har = fgetc(in);
24100 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
24110 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
24120 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 6e  ->nterminal && n
24130 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b 0a  extChar==EOF ){.
24140 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e        /* No chan
24150 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ge in the file. 
24160 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69   Don't rewrite i
24170 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
24180 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
24190 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28  out = file_open(
241a0 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b  lemp,".h","wb");
241b0 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
241c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
241d0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
241e0 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
241f0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
24200 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 70 72  s%-30s %3d\n",pr
24210 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
24220 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
24230 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
24240 28 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (out);.  }.  ret
24250 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
24260 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24270 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
24280 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
24290 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
242a0 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
242b0 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
242c0 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d  n, we take the m
242d0 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44  ost frequent RED
242e0 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d  UCE action and m
242f0 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65  ake.** it the de
24300 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20  fault.  Except, 
24310 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61  there is no defa
24320 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64 63  ult if the wildc
24330 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20  ard token.** is 
24340 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d  a possible look-
24350 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ahead..*/.void C
24360 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74  ompressTables(st
24370 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
24380 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
24390 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
243a0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61  t action *ap, *a
243b0 70 32 2c 20 2a 6e 65 78 74 61 70 3b 0a 20 20 73  p2, *nextap;.  s
243c0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20  truct rule *rp, 
243d0 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20  *rp2, *rbest;.  
243e0 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20  int nbest, n;.  
243f0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65  int i;.  int use
24400 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f  sWildcard;..  fo
24410 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
24420 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
24430 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
24440 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73  ted[i];.    nbes
24450 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74  t = 0;.    rbest
24460 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69   = 0;.    usesWi
24470 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20  ldcard = 0;..   
24480 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
24490 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
244a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
244b0 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20  >type==SHIFT && 
244c0 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69  ap->sp==lemp->wi
244d0 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20  ldcard ){.      
244e0 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d    usesWildcard =
244f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
24500 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d    if( ap->type!=
24510 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
24520 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70  e;.      rp = ap
24530 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66  ->x.rp;.      if
24540 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29  ( rp->lhsStart )
24550 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24560 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29   if( rp==rbest )
24570 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24580 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f   n = 1;.      fo
24590 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20  r(ap2=ap->next; 
245a0 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65  ap2; ap2=ap2->ne
245b0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
245c0 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55   ap2->type!=REDU
245d0 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  CE ) continue;. 
245e0 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70 32         rp2 = ap2
245f0 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20  ->x.rp;.        
24600 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29  if( rp2==rbest )
24610 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24620 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29     if( rp2==rp )
24630 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
24640 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20      if( n>nbest 
24650 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74  ){.        nbest
24660 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62   = n;.        rb
24670 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  est = rp;.      
24680 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24690 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65  Do not make a de
246a0 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d  fault if the num
246b0 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20  ber of rules to 
246c0 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69  default.    ** i
246d0 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31  s not at least 1
246e0 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
246f0 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70  ard token is a p
24700 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c  ossible.    ** l
24710 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f  ookahead..    */
24720 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31  .    if( nbest<1
24730 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64   || usesWildcard
24740 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20   ) continue;... 
24750 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61     /* Combine ma
24760 74 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63  tching REDUCE ac
24770 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e  tions into a sin
24780 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20  gle default */. 
24790 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
247a0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
247b0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
247c0 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
247d0 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
247e0 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  st ) break;.    
247f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  }.    assert( ap
24800 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d   );.    ap->sp =
24810 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
24820 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f  fault}");.    fo
24830 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61  r(ap=ap->next; a
24840 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
24850 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
24860 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
24870 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29  p->x.rp==rbest )
24880 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f   ap->type = NOT_
24890 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  USED;.    }.    
248a0 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
248b0 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
248c0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
248d0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
248e0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
248f0 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54   ap->type==SHIFT
24900 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
24910 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
24920 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
24930 21 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b  !=rbest ) break;
24940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
24950 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  p==0 ){.      st
24960 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 3d 20  p->autoReduce = 
24970 31 3b 0a 20 20 20 20 20 20 73 74 70 2d 3e 70 44  1;.      stp->pD
24980 66 6c 74 52 65 64 75 63 65 20 3d 20 72 62 65 73  fltReduce = rbes
24990 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
249a0 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64  /* Make a second
249b0 20 70 61 73 73 20 6f 76 65 72 20 61 6c 6c 20 73   pass over all s
249c0 74 61 74 65 73 20 61 6e 64 20 61 63 74 69 6f 6e  tates and action
249d0 73 2e 20 20 43 6f 6e 76 65 72 74 0a 20 20 2a 2a  s.  Convert.  **
249e0 20 65 76 65 72 79 20 61 63 74 69 6f 6e 20 74 68   every action th
249f0 61 74 20 69 73 20 61 20 53 48 49 46 54 20 74 6f  at is a SHIFT to
24a00 20 61 6e 20 61 75 74 6f 52 65 64 75 63 65 20 73   an autoReduce s
24a10 74 61 74 65 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  tate into.  ** a
24a20 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74   SHIFTREDUCE act
24a30 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ion..  */.  for(
24a40 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
24a50 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
24a60 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
24a70 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70  d[i];.    for(ap
24a80 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
24a90 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
24aa0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
24ab0 70 4e 65 78 74 53 74 61 74 65 3b 0a 20 20 20 20  pNextState;.    
24ac0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d    if( ap->type!=
24ad0 53 48 49 46 54 20 29 20 63 6f 6e 74 69 6e 75 65  SHIFT ) continue
24ae0 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 53 74 61  ;.      pNextSta
24af0 74 65 20 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a  te = ap->x.stp;.
24b00 20 20 20 20 20 20 69 66 28 20 70 4e 65 78 74 53        if( pNextS
24b10 74 61 74 65 2d 3e 61 75 74 6f 52 65 64 75 63 65  tate->autoReduce
24b20 20 26 26 20 70 4e 65 78 74 53 74 61 74 65 2d 3e   && pNextState->
24b30 70 44 66 6c 74 52 65 64 75 63 65 21 3d 30 20 29  pDfltReduce!=0 )
24b40 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 74 79  {.        ap->ty
24b50 70 65 20 3d 20 53 48 49 46 54 52 45 44 55 43 45  pe = SHIFTREDUCE
24b60 3b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e  ;.        ap->x.
24b70 72 70 20 3d 20 70 4e 65 78 74 53 74 61 74 65 2d  rp = pNextState-
24b80 3e 70 44 66 6c 74 52 65 64 75 63 65 3b 0a 20 20  >pDfltReduce;.  
24b90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24ba0 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 49 46 54  .  /* If a SHIFT
24bb0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 73 70  REDUCE action sp
24bc0 65 63 69 66 69 65 73 20 61 20 72 75 6c 65 20 74  ecifies a rule t
24bd0 68 61 74 20 68 61 73 20 61 20 73 69 6e 67 6c 65  hat has a single
24be0 20 52 48 53 20 74 65 72 6d 0a 20 20 2a 2a 20 28   RHS term.  ** (
24bf0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
24c00 20 53 48 49 46 54 52 45 44 55 43 45 20 77 69 6c   SHIFTREDUCE wil
24c10 6c 20 6c 61 6e 64 20 62 61 63 6b 20 69 6e 20 74  l land back in t
24c20 68 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69  he state where i
24c30 74 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 29 20  t.  ** started) 
24c40 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
24c50 6e 6f 20 43 2d 63 6f 64 65 20 61 73 73 6f 63 69  no C-code associ
24c60 61 74 65 64 20 77 69 74 68 20 74 68 65 20 72 65  ated with the re
24c70 64 75 63 65 20 61 63 74 69 6f 6e 2c 0a 20 20 2a  duce action,.  *
24c80 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 20 67 6f  * then we can go
24c90 20 61 68 65 61 64 20 61 6e 64 20 63 6f 6e 76 65   ahead and conve
24ca0 72 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 6f  rt the action to
24cb0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
24cc0 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20  the.  ** action 
24cd0 66 6f 72 20 74 68 65 20 52 48 53 20 6f 66 20 74  for the RHS of t
24ce0 68 65 20 72 75 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he rule..  */.  
24cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
24d00 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
24d10 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
24d20 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
24d30 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
24d40 3b 20 61 70 3d 6e 65 78 74 61 70 29 7b 0a 20 20  ; ap=nextap){.  
24d50 20 20 20 20 6e 65 78 74 61 70 20 3d 20 61 70 2d      nextap = ap-
24d60 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28  >next;.      if(
24d70 20 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54   ap->type!=SHIFT
24d80 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
24d90 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70  e;.      rp = ap
24da0 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66  ->x.rp;.      if
24db0 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 3d 3d 30 20  ( rp->noCode==0 
24dc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24dd0 20 20 69 66 28 20 72 70 2d 3e 6e 72 68 73 21 3d    if( rp->nrhs!=
24de0 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  1 ) continue;.#i
24df0 66 20 31 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c  f 1.      /* Onl
24e00 79 20 61 70 70 6c 79 20 74 68 69 73 20 6f 70 74  y apply this opt
24e10 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 6e 6f 6e  imization to non
24e20 2d 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 74 20  -terminals.  It 
24e30 77 6f 75 6c 64 20 62 65 20 4f 4b 20 74 6f 0a 20  would be OK to. 
24e40 20 20 20 20 20 2a 2a 20 61 70 70 6c 79 20 69 74       ** apply it
24e50 20 74 6f 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   to terminal sym
24e60 62 6f 6c 73 20 74 6f 6f 2c 20 62 75 74 20 74 68  bols too, but th
24e70 61 74 20 6d 61 6b 65 73 20 74 68 65 20 70 61 72  at makes the par
24e80 73 65 72 20 74 61 62 6c 65 73 0a 20 20 20 20 20  ser tables.     
24e90 20 2a 2a 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20   ** larger. */. 
24ea0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
24eb0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
24ec0 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
24ed0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e;.#endif.      
24ee0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
24ef0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
24f00 61 6e 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  ans the optimiza
24f10 74 69 6f 6e 20 63 61 6e 20 62 65 20 61 70 70 6c  tion can be appl
24f20 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 78  ied */.      nex
24f30 74 61 70 20 3d 20 61 70 3b 0a 20 20 20 20 20 20  tap = ap;.      
24f40 66 6f 72 28 61 70 32 3d 73 74 70 2d 3e 61 70 3b  for(ap2=stp->ap;
24f50 20 61 70 32 20 26 26 20 28 61 70 32 3d 3d 61 70   ap2 && (ap2==ap
24f60 20 7c 7c 20 61 70 32 2d 3e 73 70 21 3d 72 70 2d   || ap2->sp!=rp-
24f70 3e 6c 68 73 29 3b 20 61 70 32 3d 61 70 32 2d 3e  >lhs); ap2=ap2->
24f80 6e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 61 73  next){}.      as
24f90 73 65 72 74 28 20 61 70 32 21 3d 30 20 29 3b 0a  sert( ap2!=0 );.
24fa0 20 20 20 20 20 20 61 70 2d 3e 73 70 4f 70 74 20        ap->spOpt 
24fb0 3d 20 61 70 32 2d 3e 73 70 3b 0a 20 20 20 20 20  = ap2->sp;.     
24fc0 20 61 70 2d 3e 74 79 70 65 20 3d 20 61 70 32 2d   ap->type = ap2-
24fd0 3e 74 79 70 65 3b 0a 20 20 20 20 20 20 61 70 2d  >type;.      ap-
24fe0 3e 78 20 3d 20 61 70 32 2d 3e 78 3b 0a 20 20 20  >x = ap2->x;.   
24ff0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
25000 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
25010 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  tes for sorting 
25020 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73  purposes.  The s
25030 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20  maller state is 
25040 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20  the.** one with 
25050 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72  the most non-ter
25060 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20  minal actions.  
25070 49 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65  If they have the
25080 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
25090 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  of non-terminal 
250a0 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68  actions, then th
250b0 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65  e smaller is the
250c0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f   one with the mo
250d0 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69  st.** token acti
250e0 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
250f0 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f  nt stateResortCo
25100 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64  mpare(const void
25110 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   *a, const void 
25120 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *b){.  const str
25130 75 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20  uct state *pA = 
25140 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
25150 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73  tate**)a;.  cons
25160 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t struct state *
25170 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  pB = *(const str
25180 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20  uct state**)b;. 
25190 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70   int n;..  n = p
251a0 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e  B->nNtAct - pA->
251b0 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d  nNtAct;.  if( n=
251c0 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42  =0 ){.    n = pB
251d0 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e  ->nTknAct - pA->
251e0 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28  nTknAct;.    if(
251f0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e   n==0 ){.      n
25200 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20   = pB->statenum 
25210 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a  - pA->statenum;.
25220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
25230 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65  rt( n!=0 );.  re
25240 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
25250 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72  * Renumber and r
25260 65 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20  esort states so 
25270 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68  that states with
25280 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a   fewer choices.*
25290 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  * occur at the e
252a0 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65  nd.  Except, kee
252b0 70 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65  p state 0 as the
252c0 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f   first state..*/
252d0 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74  .void ResortStat
252e0 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
252f0 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
25300 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
25310 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
25320 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66  action *ap;..  f
25330 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
25340 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
25350 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
25360 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70  rted[i];.    stp
25370 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d  ->nTknAct = stp-
25380 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20  >nNtAct = 0;.   
25390 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
253a0 65 20 3d 20 2d 31 3b 20 2f 2a 20 49 6e 69 74 20  e = -1; /* Init 
253b0 64 66 6c 74 20 61 63 74 69 6f 6e 20 74 6f 20 22  dflt action to "
253c0 73 79 6e 74 61 78 20 65 72 72 6f 72 22 20 2a 2f  syntax error" */
253d0 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  .    stp->iTknOf
253e0 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
253f0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
25400 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20   = NO_OFFSET;.  
25410 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
25420 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
25430 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41  t){.      int iA
25440 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
25450 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3b  action(lemp,ap);
25460 0a 20 20 20 20 20 20 69 66 28 20 69 41 63 74 69  .      if( iActi
25470 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  on>=0 ){.       
25480 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
25490 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
254a0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
254b0 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a  stp->nTknAct++;.
254c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
254d0 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
254e0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b  lemp->nsymbol ){
254f0 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
25500 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20  nNtAct++;.      
25510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25520 20 20 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e     assert( stp->
25530 61 75 74 6f 52 65 64 75 63 65 3d 3d 30 20 7c 7c  autoReduce==0 ||
25540 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63   stp->pDfltReduc
25550 65 3d 3d 61 70 2d 3e 78 2e 72 70 20 29 3b 0a 20  e==ap->x.rp );. 
25560 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44           stp->iD
25570 66 6c 74 52 65 64 75 63 65 20 3d 20 69 41 63 74  fltReduce = iAct
25580 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ion;.        }. 
25590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
255a0 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e  .  qsort(&lemp->
255b0 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d  sorted[1], lemp-
255c0 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f  >nstate-1, sizeo
255d0 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  f(lemp->sorted[0
255e0 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74  ]),.        stat
255f0 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b  eResortCompare);
25600 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
25610 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
25620 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74  {.    lemp->sort
25630 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20  ed[i]->statenum 
25640 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d 70 2d  = i;.  }.  lemp-
25650 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d 70 2d  >nxstate = lemp-
25660 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
25670 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3e  ( lemp->nxstate>
25680 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  1 && lemp->sorte
25690 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d  d[lemp->nxstate-
256a0 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 29  1]->autoReduce )
256b0 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78 73 74  {.    lemp->nxst
256c0 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ate--;.  }.}.../
256d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256e0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
256f0 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
25700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
25720 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
25730 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
25740 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
25750 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
25760 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
25770 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
25780 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
25790 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20  oid SetSize(int 
257a0 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n).{.  size = n+
257b0 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
257c0 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
257d0 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
257e0 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20  ){.  char *s;.  
257f0 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f  s = (char*)callo
25800 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69  c( size, 1);.  i
25810 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65  f( s==0 ){.    e
25820 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
25830 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d  y_error();.    m
25840 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
25850 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d   }.  return s;.}
25860 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  ../* Deallocate 
25870 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65  a set */.void Se
25880 74 46 72 65 65 28 63 68 61 72 20 2a 73 29 0a 7b  tFree(char *s).{
25890 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f  .  free(s);.}../
258a0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
258b0 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20  ent to the set. 
258c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
258d0 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20  the element was 
258e0 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c  added.** and FAL
258f0 53 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72  SE if it was alr
25900 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69  eady there. */.i
25910 6e 74 20 53 65 74 41 64 64 28 63 68 61 72 20 2a  nt SetAdd(char *
25920 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69 6e  s, int e).{.  in
25930 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20  t rv;.  assert( 
25940 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29  e>=0 && e<size )
25950 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20  ;.  rv = s[e];. 
25960 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74   s[e] = 1;.  ret
25970 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41  urn !rv;.}../* A
25980 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  dd every element
25990 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52   of s2 to s1.  R
259a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31  eturn TRUE if s1
259b0 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74   changes. */.int
259c0 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a   SetUnion(char *
259d0 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b 0a  s1, char *s2).{.
259e0 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73    int i, progres
259f0 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20  s;.  progress = 
25a00 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
25a10 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
25a20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63  if( s2[i]==0 ) c
25a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25a40 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20   s1[i]==0 ){.   
25a50 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
25a60 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31  .      s1[i] = 1
25a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25a80 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d  turn progress;.}
25a90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
25aa0 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
25ab0 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22  e file "table.c"
25ac0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
25ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
25ae0 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
25af0 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
25b00 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
25b10 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
25b20 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
25b30 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
25b40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25b50 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
25b60 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
25b70 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
25b80 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
25b90 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
25ba0 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
25bb0 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
25bc0 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
25bd0 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
25be0 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
25bf0 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
25c00 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
25c10 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
25c20 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
25c30 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e  ..PRIVATE unsign
25c40 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74  ed strhash(const
25c50 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 75 6e   char *x).{.  un
25c60 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a 20 20  signed h = 0;.  
25c70 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20 3d 20  while( *x ) h = 
25c80 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
25c90 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
25ca0 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
25cb0 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
25cc0 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
25cd0 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
25ce0 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
25cf0 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
25d00 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
25d10 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
25d20 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
25d30 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73  e place..*/.cons
25d40 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  t char *Strsafe(
25d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b  const char *y).{
25d60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25d70 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a  ;.  char *cpy;..
25d80 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74    if( y==0 ) ret
25d90 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72  urn 0;.  z = Str
25da0 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20  safe_find(y);.  
25db0 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79  if( z==0 && (cpy
25dc0 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28  =(char *)malloc(
25dd0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b   lemonStrlen(y)+
25de0 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6c  1 ))!=0 ){.    l
25df0 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70 79 2c  emon_strcpy(cpy,
25e00 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b  y);.    z = cpy;
25e10 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73  .    Strsafe_ins
25e20 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65  ert(z);.  }.  Me
25e30 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20  moryCheck(z);.  
25e40 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20  return z;.}../* 
25e50 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
25e60 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
25e70 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
25e80 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
25e90 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
25ea0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
25eb0 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20  struct s_x1 {.  
25ec0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
25ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
25ee0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
25ef0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
25f20 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
25f30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
25f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f60 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
25f70 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
25f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25f90 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
25fa0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
25fb0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
25fc0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
25fd0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
25fe0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
25ff0 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x1node **ht;  /
26000 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
26010 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
26020 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
26030 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
26040 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
26050 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
26060 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
26070 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
26080 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79  type "x1"..*/.ty
26090 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
260a0 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20  1node {.  const 
260b0 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
260c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
260d0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
260e0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
260f0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
26100 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
26110 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
26120 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
26130 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
26140 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x1node;../* Th
26150 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
26160 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
26170 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
26180 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
26190 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
261a0 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c  _x1 *x1a;../* Al
261b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
261c0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
261d0 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  /.void Strsafe_i
261e0 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  nit(void){.  if(
261f0 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x1a ) return;. 
26200 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73   x1a = (struct s
26210 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x1*)malloc( siz
26220 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29  eof(struct s_x1)
26230 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b   );.  if( x1a ){
26240 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d  .    x1a->size =
26250 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e   1024;.    x1a->
26260 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
26270 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  1a->tbl = (x1nod
26280 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32 34 2c 20  e*)calloc(1024, 
26290 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
262a0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
262b0 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e  );.    if( x1a->
262c0 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
262d0 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20  free(x1a);.     
262e0 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x1a = 0;.    }e
262f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
26300 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20  ;.      x1a->ht 
26310 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31  = (x1node**)&(x1
26320 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20  a->tbl[1024]);. 
26330 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
26340 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e  1024; i++) x1a->
26350 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
26360 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
26370 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
26380 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
26390 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
263a0 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
263b0 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
263c0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
263d0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
263e0 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
263f0 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  rt(const char *d
26400 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65 20  ata).{.  x1node 
26410 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
26420 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
26430 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
26440 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
26450 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29   = strhash(data)
26460 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  ;.  h = ph & (x1
26470 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
26480 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
26490 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
264a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
264b0 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29  >data,data)==0 )
264c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
264d0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
264e0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
264f0 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
26500 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
26510 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
26520 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
26530 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
26540 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
26550 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
26560 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61   x1a->count>=x1a
26570 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
26580 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
26590 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
265a0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
265b0 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74  ,arrSize;.    st
265c0 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b  ruct s_x1 array;
265d0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
265e0 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 31 61 2d  = arrSize = x1a-
265f0 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
26600 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e  ay.count = x1a->
26610 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
26620 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  .tbl = (x1node*)
26630 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
26640 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
26650 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
26660 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
26670 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
26680 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
26690 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
266a0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
266b0 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
266c0 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69  (array.tbl[arrSi
266d0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
266e0 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
266f0 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
26700 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
26710 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x1a->count; i
26720 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64  ++){.      x1nod
26730 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
26740 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
26750 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x1a->tbl[i]);.
26760 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
26770 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
26780 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
26790 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
267a0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
267b0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
267c0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
267d0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
267e0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
267f0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
26800 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
26810 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
26820 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
26830 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
26840 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
26850 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
26860 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
26870 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
26880 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
26890 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
268a0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
268b0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
268c0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
268d0 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
268e0 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
268f0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
26900 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
26910 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
26920 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
26930 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
26940 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
26950 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
26960 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
26970 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
26980 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
26990 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
269a0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
269b0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
269c0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
269d0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
269e0 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63   key. */.const c
269f0 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
26a00 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65  d(const char *ke
26a10 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  y).{.  unsigned 
26a20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  h;.  x1node *np;
26a30 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
26a40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
26a50 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
26a60 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
26a70 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
26a80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
26a90 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
26aa0 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
26ab0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
26ac0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
26ad0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
26ae0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
26af0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
26b00 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d  ter to the (term
26b10 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69  inal or nontermi
26b20 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e  nal) symbol "x".
26b30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
26b40 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20   symbol if this 
26b50 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
26b60 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73  e "x" has been s
26b70 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  een..*/.struct s
26b80 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
26b90 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29  w(const char *x)
26ba0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
26bb0 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20  ol *sp;..  sp = 
26bc0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a  Symbol_find(x);.
26bd0 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
26be0 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74 20     sp = (struct 
26bf0 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28  symbol *)calloc(
26c00 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  1, sizeof(struct
26c10 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20   symbol) );.    
26c20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b  MemoryCheck(sp);
26c30 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20  .    sp->name = 
26c40 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20  Strsafe(x);.    
26c50 73 70 2d 3e 74 79 70 65 20 3d 20 49 53 55 50 50  sp->type = ISUPP
26c60 45 52 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41  ER(*x) ? TERMINA
26c70 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b  L : NONTERMINAL;
26c80 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20  .    sp->rule = 
26c90 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62  0;.    sp->fallb
26ca0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ack = 0;.    sp-
26cb0 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20  >prec = -1;.    
26cc0 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b  sp->assoc = UNK;
26cd0 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65  .    sp->firstse
26ce0 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c  t = 0;.    sp->l
26cf0 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41  ambda = LEMON_FA
26d00 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  LSE;.    sp->des
26d10 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20  tructor = 0;.   
26d20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20   sp->destLineno 
26d30 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74  = 0;.    sp->dat
26d40 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 73  atype = 0;.    s
26d50 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20  p->useCnt = 0;. 
26d60 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74     Symbol_insert
26d70 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  (sp,sp->name);. 
26d80 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b   }.  sp->useCnt+
26d90 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a  +;.  return sp;.
26da0 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
26db0 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 73 6f  o symbols for so
26dc0 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
26dd0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
26de0 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ,.** zero, or po
26df0 73 69 74 69 76 65 20 69 66 20 61 20 69 73 20 6c  sitive if a is l
26e00 65 73 73 20 74 68 65 6e 2c 20 65 71 75 61 6c 20  ess then, equal 
26e10 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
26e20 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a 2a 20  * than b..**.** 
26e30 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67  Symbols that beg
26e40 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63 61  in with upper ca
26e50 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d  se letters (term
26e60 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29  inals or tokens)
26e70 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65  .** must sort be
26e80 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61  fore symbols tha
26e90 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77  t begin with low
26ea0 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a  er case letters.
26eb0 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ** (non-terminal
26ec0 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54 49 54 45  s).  And MULTITE
26ed0 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c 73 20 28  RMINAL symbols (
26ee0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
26ef0 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c 61 73  e.** %token_clas
26f00 73 20 64 69 72 65 63 74 69 76 65 29 20 6d 75 73  s directive) mus
26f10 74 20 73 6f 72 74 20 61 74 20 74 68 65 20 76 65  t sort at the ve
26f20 72 79 20 65 6e 64 2e 20 4f 74 68 65 72 20 74 68  ry end. Other th
26f30 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74 68 65 20  an.** that, the 
26f40 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d  order does not m
26f50 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  atter..**.** We 
26f60 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61  find experimenta
26f70 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67  lly that leaving
26f80 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
26f90 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a  their original.*
26fa0 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64  * order (the ord
26fb0 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64  er they appeared
26fc0 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
26fd0 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a  file) gives the.
26fe0 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73  ** smallest pars
26ff0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c  er tables in SQL
27000 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62  ite..*/.int Symb
27010 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69  olcmpp(const voi
27020 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f 69  d *_a, const voi
27030 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74  d *_b).{.  const
27040 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
27050 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  a = *(const stru
27060 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61  ct symbol **) _a
27070 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
27080 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a 28 63   symbol *b = *(c
27090 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
270a0 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e 74  ol **) _b;.  int
270b0 20 69 31 20 3d 20 61 2d 3e 74 79 70 65 3d 3d 4d   i1 = a->type==M
270c0 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33  ULTITERMINAL ? 3
270d0 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a   : a->name[0]>'Z
270e0 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 69 6e 74  ' ? 2 : 1;.  int
270f0 20 69 32 20 3d 20 62 2d 3e 74 79 70 65 3d 3d 4d   i2 = b->type==M
27100 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33  ULTITERMINAL ? 3
27110 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a   : b->name[0]>'Z
27120 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 72 65 74  ' ? 2 : 1;.  ret
27130 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20 61 2d 3e  urn i1==i2 ? a->
27140 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e 64 65 78  index - b->index
27150 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d 0a 0a 2f   : i1 - i2;.}../
27160 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
27170 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
27180 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
27190 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
271a0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
271b0 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
271c0 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a  /.struct s_x2 {.
271d0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
271e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
271f0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
27200 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
27230 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
27240 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
27250 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
27280 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
272a0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
272b0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
272c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
272d0 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  2node *tbl;  /* 
272e0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
272f0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
27300 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x2node **ht; 
27310 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
27320 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
27330 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
27340 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
27350 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
27360 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
27370 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
27380 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
27390 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
273a0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
273b0 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x2node {.  stru
273c0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
273d0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
273e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
273f0 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 2f   *key;         /
27400 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  * The key */.  s
27410 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
27420 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
27430 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
27440 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
27450 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
27460 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
27470 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e  us link */.} x2n
27480 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
27490 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
274a0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
274b0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
274c0 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
274d0 69 63 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a  ic struct s_x2 *
274e0 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x2a;../* Allocat
274f0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
27500 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
27510 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f  d Symbol_init(vo
27520 69 64 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29  id){.  if( x2a )
27530 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d   return;.  x2a =
27540 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d   (struct s_x2*)m
27550 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
27560 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20  ruct s_x2) );.  
27570 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78  if( x2a ){.    x
27580 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  2a->size = 128;.
27590 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d      x2a->count =
275a0 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c   0;.    x2a->tbl
275b0 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c   = (x2node*)call
275c0 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78  oc(128, sizeof(x
275d0 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
275e0 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x2node*));.    i
275f0 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x2a->tbl==0 )
27600 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61  {.      free(x2a
27610 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30  );.      x2a = 0
27620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27630 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
27640 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64  x2a->ht = (x2nod
27650 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31  e**)&(x2a->tbl[1
27660 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  28]);.      for(
27670 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29  i=0; i<128; i++)
27680 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x2a->ht[i] = 0;
27690 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
276a0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
276b0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
276c0 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
276d0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
276e0 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
276f0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
27700 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
27710 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  en */.int Symbol
27720 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
27730 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e  ymbol *data, con
27740 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a  st char *key).{.
27750 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x2node *np;.  
27760 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
27770 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
27780 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
27790 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
277a0 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
277b0 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
277c0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
277d0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
277e0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
277f0 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
27800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
27810 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
27820 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
27830 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
27840 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
27850 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
27860 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
27870 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
27880 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
27890 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
278a0 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e  .  if( x2a->coun
278b0 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x2a->size ){.
278c0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
278d0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
278e0 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
278f0 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a   int i,arrSize;.
27900 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32 20      struct s_x2 
27910 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
27920 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20  .size = arrSize 
27930 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x2a->size*2;. 
27940 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
27950 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x2a->count;.   
27960 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32   array.tbl = (x2
27970 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72  node*)calloc(arr
27980 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 32 6e  Size, sizeof(x2n
27990 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32  ode) + sizeof(x2
279a0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
279b0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
279c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
279d0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
279e0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
279f0 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f  array.ht = (x2no
27a00 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
27a10 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20  [arrSize]);.    
27a20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
27a30 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
27a40 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
27a50 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f  r(i=0; i<x2a->co
27a60 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
27a70 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x2node *oldnp, 
27a80 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
27a90 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c  dnp = &(x2a->tbl
27aa0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
27ab0 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  strhash(oldnp->k
27ac0 65 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ey) & (arrSize-1
27ad0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
27ae0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
27af0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
27b00 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
27b10 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
27b20 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
27b30 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
27b40 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
27b50 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
27b60 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
27b70 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
27b80 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
27b90 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
27ba0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
27bb0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
27bc0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
27bd0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
27be0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
27bf0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
27c00 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
27c10 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
27c20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
27c30 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
27c40 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
27c50 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
27c60 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
27c70 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
27c80 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
27c90 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
27ca0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
27cb0 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
27cc0 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
27cd0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
27ce0 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
27cf0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
27d00 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
27d10 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
27d20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
27d30 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
27d40 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
27d50 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
27d60 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
27d70 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  bol_find(const c
27d80 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e  har *key).{.  un
27d90 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e 6f  signed h;.  x2no
27da0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
27db0 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
27dc0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
27dd0 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a  key) & (x2a->siz
27de0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
27df0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
27e00 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
27e10 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
27e20 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
27e30 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
27e40 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27e50 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
27e60 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
27e70 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20  the n-th data.  
27e80 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
27e90 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
27ea0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
27eb0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69  ol *Symbol_Nth(i
27ec0 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74  nt n).{.  struct
27ed0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20   symbol *data;. 
27ee0 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20   if( x2a && n>0 
27ef0 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74  && n<=x2a->count
27f00 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78   ){.    data = x
27f10 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74  2a->tbl[n-1].dat
27f20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
27f30 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  data = 0;.  }.  
27f40 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a  return data;.}..
27f50 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  /* Return the si
27f60 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
27f70 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  */.int Symbol_co
27f80 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e  unt().{.  return
27f90 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e   x2a ? x2a->coun
27fa0 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  t : 0;.}../* Ret
27fb0 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
27fc0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
27fd0 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
27fe0 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
27ff0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
28000 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
28010 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
28020 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
28030 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
28040 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
28050 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
28060 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
28070 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  yof().{.  struct
28080 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b   symbol **array;
28090 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65  .  int i,arrSize
280a0 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
280b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72 72   return 0;.  arr
280c0 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  Size = x2a->coun
280d0 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
280e0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63  ruct symbol **)c
280f0 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
28100 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
28110 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  bol *));.  if( a
28120 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
28130 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
28140 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20  i++) array[i] = 
28150 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x2a->tbl[i].data
28160 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
28170 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  rray;.}../* Comp
28180 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72  are two configur
28190 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f  ations */.int Co
281a0 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68  nfigcmp(const ch
281b0 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61  ar *_a,const cha
281c0 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74  r *_b).{.  const
281d0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
281e0 61 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  a = (struct conf
281f0 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73  ig *) _a;.  cons
28200 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  t struct config 
28210 2a 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  *b = (struct con
28220 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74  fig *) _b;.  int
28230 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d   x;.  x = a->rp-
28240 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
28250 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d  index;.  if( x==
28260 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d  0 ) x = a->dot -
28270 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   b->dot;.  retur
28280 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  n x;.}../* Compa
28290 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f  re two states */
282a0 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
282b0 74 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e  tecmp(struct con
282c0 66 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63  fig *a, struct c
282d0 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e  onfig *b).{.  in
282e0 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30  t rc;.  for(rc=0
282f0 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20  ; rc==0 && a && 
28300 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62  b;  a=a->bp, b=b
28310 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20  ->bp){.    rc = 
28320 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
28330 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20  ->rp->index;.   
28340 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
28350 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
28360 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
28370 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20  =0 ){.    if( a 
28380 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66  ) rc = 1;.    if
28390 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20  ( b ) rc = -1;. 
283a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
283b0 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61  }../* Hash a sta
283c0 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e  te */.PRIVATE un
283d0 73 69 67 6e 65 64 20 73 74 61 74 65 68 61 73 68  signed statehash
283e0 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
283f0 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  a).{.  unsigned 
28400 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20  h=0;.  while( a 
28410 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31  ){.    h = h*571
28420 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a   + a->rp->index*
28430 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20  37 + a->dot;.   
28440 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a   a = a->bp;.  }.
28450 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
28460 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28470 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
28480 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
28490 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a   *State_new().{.
284a0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
284b0 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73  newstate;.  news
284c0 74 61 74 65 20 3d 20 28 73 74 72 75 63 74 20 73  tate = (struct s
284d0 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c  tate *)calloc(1,
284e0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
284f0 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72  tate) );.  Memor
28500 79 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29  yCheck(newstate)
28510 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74  ;.  return newst
28520 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  ate;.}../* There
28530 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
28540 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
28550 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
28560 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
28570 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
28580 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x3"..*/.struc
28590 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73  t s_x3 {.  int s
285a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
285b0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
285c0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
285d0 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
28600 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
28610 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
28640 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
28650 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
28660 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28670 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
28680 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
28690 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
286a0 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
286b0 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
286c0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
286d0 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
286e0 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
286f0 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
28700 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
28710 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
28720 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
28730 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
28740 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
28750 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
28760 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x3"..*/.typedef
28770 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
28780 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
28790 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  e *data;        
287a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
287b0 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
287c0 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20  t config *key;  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
287f0 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
28800 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
28810 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
28820 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
28830 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
28840 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
28850 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
28860 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  3node;../* There
28870 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
28880 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
28890 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
288a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
288b0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33  atic struct s_x3
288c0 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x3a;../* Alloc
288d0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
288e0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
288f0 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 76  oid State_init(v
28900 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 33 61 20  oid){.  if( x3a 
28910 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20  ) return;.  x3a 
28920 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29  = (struct s_x3*)
28930 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
28940 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20  truct s_x3) );. 
28950 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20   if( x3a ){.    
28960 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x3a->size = 128;
28970 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20  .    x3a->count 
28980 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62  = 0;.    x3a->tb
28990 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c  l = (x3node*)cal
289a0 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28  loc(128, sizeof(
289b0 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
289c0 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x3node*));.    
289d0 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20  if( x3a->tbl==0 
289e0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33  ){.      free(x3
289f0 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20  a);.      x3a = 
28a00 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
28a10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
28a20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f   x3a->ht = (x3no
28a30 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b  de**)&(x3a->tbl[
28a40 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
28a50 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
28a60 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x3a->ht[i] = 0
28a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
28a80 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
28a90 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
28aa0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
28ab0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
28ac0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
28ad0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
28ae0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
28af0 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65  ten */.int State
28b00 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
28b10 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74 72 75  tate *data, stru
28b20 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a  ct config *key).
28b30 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x3node *np;.
28b40 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
28b50 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
28b60 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
28b70 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
28b80 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  atehash(key);.  
28b90 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
28ba0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
28bb0 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
28bc0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
28bd0 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
28be0 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
28bf0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
28c00 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
28c10 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
28c20 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
28c30 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
28c40 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
28c50 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
28c60 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
28c70 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
28c80 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61  t;.  }.  if( x3a
28c90 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69  ->count>=x3a->si
28ca0 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
28cb0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
28cc0 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
28cd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
28ce0 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
28cf0 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20   s_x3 array;.   
28d00 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
28d10 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a  rSize = x3a->siz
28d20 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
28d30 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  ount = x3a->coun
28d40 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
28d50 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c   = (x3node*)call
28d60 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
28d70 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
28d80 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x3node*));. 
28d90 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
28da0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
28db0 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
28dc0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
28dd0 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
28de0 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x3node**)&(arr
28df0 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
28e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
28e10 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
28e20 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
28e30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
28e40 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  3a->count; i++){
28e50 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f  .      x3node *o
28e60 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
28e70 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33      oldnp = &(x3
28e80 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
28e90 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
28ea0 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61  oldnp->key) & (a
28eb0 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
28ec0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
28ed0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
28ee0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
28ef0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
28f00 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
28f10 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
28f20 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
28f30 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
28f40 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
28f50 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
28f60 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
28f70 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
28f80 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
28f90 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
28fa0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
28fb0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
28fc0 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
28fd0 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
28fe0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
28ff0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
29000 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
29010 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
29020 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
29030 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
29040 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
29050 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
29060 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
29070 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
29080 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
29090 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
290a0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
290b0 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
290c0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
290d0 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
290e0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
290f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
29100 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
29110 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
29120 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
29130 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
29140 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
29150 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73  te *State_find(s
29160 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
29170 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  y).{.  unsigned 
29180 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  h;.  x3node *np;
29190 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
291a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
291b0 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20   statehash(key) 
291c0 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
291d0 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
291e0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
291f0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
29200 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
29210 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
29220 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
29230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
29240 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
29250 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
29260 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
29270 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
29280 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
29290 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
292a0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
292b0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
292c0 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
292d0 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
292e0 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
292f0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
29300 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
29310 74 65 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29  te_arrayof(void)
29320 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
29330 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  e **array;.  int
29340 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66   i,arrSize;.  if
29350 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
29360 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d  n 0;.  arrSize =
29370 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x3a->count;.  a
29380 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
29390 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63 28 61  tate **)calloc(a
293a0 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73  rrSize, sizeof(s
293b0 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 29 3b  truct state *));
293c0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
293d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
293e0 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
293f0 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c  ay[i] = x3a->tbl
29400 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
29410 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
29420 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69  ./* Hash a confi
29430 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56  guration */.PRIV
29440 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e  ATE unsigned con
29450 66 69 67 68 61 73 68 28 73 74 72 75 63 74 20 63  fighash(struct c
29460 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e  onfig *a).{.  un
29470 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68 20  signed h=0;.  h 
29480 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
29490 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
294a0 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a  ot;.  return h;.
294b0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
294c0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
294d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
294e0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
294f0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
29500 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
29510 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
29520 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  4 {.  int size; 
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29540 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
29550 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
29560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29580 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
29590 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
295a0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
295d0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
295e0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
295f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
29600 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
29610 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
29620 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x4node *tbl; 
29630 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
29640 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
29650 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
29660 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
29670 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
29680 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
29690 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
296a0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
296b0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
296c0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
296d0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
296e0 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
296f0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
29700 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20  ct s_x4node {.  
29710 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
29720 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
29730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
29740 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
29750 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x4node *next;   
29760 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
29770 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
29780 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
29790 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  4node **from;  /
297a0 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
297b0 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x4node;../*
297c0 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
297d0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
297e0 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
297f0 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
29800 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
29810 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a  t s_x4 *x4a;../*
29820 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
29830 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
29840 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  y */.void Config
29850 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29  table_init(void)
29860 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72 65  {.  if( x4a ) re
29870 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73  turn;.  x4a = (s
29880 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c  truct s_x4*)mall
29890 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
298a0 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28  t s_x4) );.  if(
298b0 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d   x4a ){.    x4a-
298c0 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20  >size = 64;.    
298d0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
298e0 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28      x4a->tbl = (
298f0 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 36  x4node*)calloc(6
29900 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65  4, sizeof(x4node
29910 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
29920 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 34  e*));.    if( x4
29930 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
29940 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20     free(x4a);.  
29950 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20      x4a = 0;.   
29960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
29970 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e  t i;.      x4a->
29980 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
29990 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a  (x4a->tbl[64]);.
299a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
299b0 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  <64; i++) x4a->h
299c0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
299d0 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
299e0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
299f0 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
29a00 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
29a10 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
29a20 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
29a30 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
29a40 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
29a50 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
29a60 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e  nsert(struct con
29a70 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78  fig *data).{.  x
29a80 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73  4node *np;.  uns
29a90 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67  igned h;.  unsig
29aa0 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  ned ph;..  if( x
29ab0 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
29ac0 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68  ;.  ph = configh
29ad0 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
29ae0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
29af0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
29b00 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
29b10 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
29b20 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20  onfigcmp((const 
29b30 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61  char *) np->data
29b40 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ,(const char *) 
29b50 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
29b60 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
29b70 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
29b80 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
29b90 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
29ba0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
29bb0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
29bc0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
29bd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
29be0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
29bf0 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e  .  }.  if( x4a->
29c00 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65  count>=x4a->size
29c10 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
29c20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
29c30 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
29c40 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69  .    int i,arrSi
29c50 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
29c60 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x4 array;.    a
29c70 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53  rray.size = arrS
29c80 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a  ize = x4a->size*
29c90 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
29ca0 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b  nt = x4a->count;
29cb0 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
29cc0 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x4node*)calloc
29cd0 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
29ce0 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
29cf0 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x4node*));.   
29d00 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
29d10 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
29d20 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
29d30 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
29d40 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
29d50 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x4node**)&(array
29d60 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a  .tbl[arrSize]);.
29d70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
29d80 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
29d90 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
29da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
29db0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
29dc0 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64       x4node *old
29dd0 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
29de0 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d    oldnp = &(x4a-
29df0 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
29e00 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f  h = confighash(o
29e10 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 61  ldnp->data) & (a
29e20 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
29e30 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
29e40 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
29e50 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
29e60 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
29e70 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
29e80 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
29e90 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
29ea0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
29eb0 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
29ec0 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
29ed0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
29ee0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
29ef0 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
29f00 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
29f10 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b   free(x4a->tbl);
29f20 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61  .    *x4a = arra
29f30 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
29f40 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
29f50 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
29f60 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
29f70 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78  p = &(x4a->tbl[x
29f80 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  4a->count++]);. 
29f90 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
29fa0 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b  ;.  if( x4a->ht[
29fb0 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d  h] ) x4a->ht[h]-
29fc0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
29fd0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
29fe0 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
29ff0 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x4a->ht[h] = np;
2a000 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
2a010 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x4a->ht[h]);.  r
2a020 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
2a030 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2a040 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
2a050 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
2a060 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
2a070 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
2a080 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  y. */.struct con
2a090 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
2a0a0 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
2a0b0 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e  fig *key).{.  in
2a0c0 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  t h;.  x4node *n
2a0d0 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30  p;..  if( x4a==0
2a0e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
2a0f0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65   = confighash(ke
2a100 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  y) & (x4a->size-
2a110 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e  1);.  np = x4a->
2a120 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
2a130 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f  np ){.    if( Co
2a140 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63  nfigcmp((const c
2a150 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c  har *) np->data,
2a160 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6b  (const char *) k
2a170 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
2a180 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
2a190 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2a1a0 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
2a1b0 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20  0;.}../* Remove 
2a1c0 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
2a1d0 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65  e table.  Pass e
2a1e0 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20  ach data to the 
2a1f0 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20  function "f".** 
2a200 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64  as it is removed
2a210 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e  .  ("f" may be n
2a220 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69  ull to avoid thi
2a230 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64  s step.) */.void
2a240 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
2a250 61 72 28 69 6e 74 28 2a 66 29 28 73 74 72 75 63  ar(int(*f)(struc
2a260 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a 20  t config *)).{. 
2a270 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34   int i;.  if( x4
2a280 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75  a==0 || x4a->cou
2a290 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  nt==0 ) return;.
2a2a0 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d    if( f ) for(i=
2a2b0 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
2a2c0 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e   i++) (*f)(x4a->
2a2d0 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20  tbl[i].data);.  
2a2e0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
2a2f0 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  size; i++) x4a->
2a300 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61  ht[i] = 0;.  x4a
2a310 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72  ->count = 0;.  r
2a320 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.