SQLite
Hex Artifact Content
Not logged in

Artifact f4f1045743e12f86b132253a3192ef92c94bfceb7f41ac41b8e3b373aa78474e:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
38c0: 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c   symbol **symbol
38d0: 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72  s; /* Sorted arr
38e0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
38f0: 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  o symbols */.  i
3900: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
3910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3920: 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  r of errors */. 
3930: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3940: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
3950: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f   error symbol */
3960: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3970: 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54   *wildcard; /* T
3980: 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65  oken that matche
3990: 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  s anything */.  
39a0: 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20  char *name;     
39b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
39c0: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
39d0: 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68  d parser */.  ch
39e0: 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20  ar *arg;        
39f0: 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72         /* Declar
3a00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68  ation of the 3th
3a10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72   argument to par
3a20: 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ser */.  char *t
3a30: 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20  okentype;       
3a40: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72    /* Type of ter
3a50: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e  minal symbols in
3a60: 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
3a70: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72  k */.  char *var
3a80: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
3a90: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74  /* The default t
3aa0: 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69  ype of non-termi
3ab0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
3ac0: 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20   char *start;   
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3ae0: 65 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73  e of the start s
3af0: 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72  ymbol for the gr
3b00: 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammar */.  char 
3b10: 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20  *stacksize;     
3b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
3b30: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
3b40: 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75  */.  char *inclu
3b50: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3b60: 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20   Code to put at 
3b70: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3b80: 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61   C file */.  cha
3b90: 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20  r *error;       
3ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3bb0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e   execute when an
3bc0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a   error is seen *
3bd0: 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c  /.  char *overfl
3be0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ow;          /* 
3bf0: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
3c00: 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66  on a stack overf
3c10: 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  low */.  char *f
3c20: 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20  ailure;         
3c30: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3c40: 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66  cute on parser f
3c50: 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72  ailure */.  char
3c60: 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20   *accept;       
3c70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3c80: 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65  execute when the
3c90: 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20   parser excepts 
3ca0: 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61  */.  char *extra
3cb0: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  code;         /*
3cc0: 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74   Code appended t
3cd0: 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  o the generated 
3ce0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3cf0: 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20  tokendest;      
3d00: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
3d10: 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79  ecute to destroy
3d20: 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20   token data */. 
3d30: 20 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20   char *vardest; 
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3d50: 65 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  e for the defaul
3d60: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64  t non-terminal d
3d70: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
3d80: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20  har *filename;  
3d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3da0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
3db0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74  e */.  char *out
3dc0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3dd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
3de0: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69  urrent output fi
3df0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
3e00: 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20  kenprefix;      
3e10: 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64   /* A prefix add
3e20: 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65  ed to token name
3e30: 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65  s in the .h file
3e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c   */.  int nconfl
3e50: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ict;           /
3e60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73  * Number of pars
3e70: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  ing conflicts */
3e80: 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61  .  int nactionta
3e90: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  b;          /* N
3ea0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3eb0: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
3ec0: 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  n[] table */.  i
3ed0: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
3ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3ef0: 20 74 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61   table size of a
3f00: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74  ll tables in byt
3f10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69  es */.  int basi
3f20: 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  sflag;          
3f30: 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62   /* Print only b
3f40: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
3f50: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73  ons */.  int has
3f60: 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  _fallback;      
3f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
3f80: 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65   %fallback is se
3f90: 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  en in the gramma
3fa0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e  r */.  int nolin
3fb0: 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20  enosflag;       
3fc0: 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65  /* True if #line
3fd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75   statements shou
3fe0: 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65  ld not be printe
3ff0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  d */.  char *arg
4000: 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  v0;             
4010: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
4020: 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64  rogram */.};..#d
4030: 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63  efine MemoryChec
4040: 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b  k(X) if((X)==0){
4050: 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64   \.  extern void
4060: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
4070: 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f   \.  memory_erro
4080: 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  r(); \.}../*****
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
40a0: 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
40b0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
40e0: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
40f0: 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
4100: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
4110: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
4120: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
4130: 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
4140: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
4150: 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
4160: 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
4170: 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
4180: 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
4190: 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
41a0: 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
41b0: 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
41c0: 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
41d0: 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
41e0: 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
41f0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
4200: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
4210: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4220: 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74  ator..*/./* Rout
4230: 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e  ines for handlin
4240: 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a  g a strings */..
4250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73  const char *Strs
4260: 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  afe(const char *
4270: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
4280: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4290: 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
42a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63  const char *);.c
42b0: 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
42c0: 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  fe_find(const ch
42d0: 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  ar *);../* Routi
42e0: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
42f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
4300: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
4310: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
4320: 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72  l_new(const char
4330: 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63   *);.int Symbolc
4340: 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  mpp(const void *
4350: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  , const void *);
4360: 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
4370: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d  t(void);.int Sym
4380: 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
4390: 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73  t symbol *, cons
43a0: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
43b0: 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
43c0: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
43d0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *);.struct symb
43e0: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69  ol *Symbol_Nth(i
43f0: 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  nt);.int Symbol_
4400: 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72  count(void);.str
4410: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
4420: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64  bol_arrayof(void
4430: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
4440: 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74  to manage the st
4450: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e  ate table */..in
4460: 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73  t Configcmp(cons
4470: 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20  t char *, const 
4480: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4490: 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
44a0: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61  (void);.void Sta
44b0: 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  te_init(void);.i
44c0: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
44d0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
44e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
44f0: 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ;.struct state *
4500: 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63  State_find(struc
4510: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
4520: 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74  uct state **Stat
4530: 65 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  e_arrayof(void);
4540: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73  ../* Routines us
4550: 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63  ed for efficienc
4560: 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f  y in Configlist_
4570: 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e  add */..void Con
4580: 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f  figtable_init(vo
4590: 69 64 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74  id);.int Configt
45a0: 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75  able_insert(stru
45b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74  ct config *);.st
45c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
45d0: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
45e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
45f0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
4600: 5f 63 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74  _clear(int(*)(st
4610: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b  ruct config *));
4620: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4630: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
4640: 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a  ile "action.c" *
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4670: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70  /*.** Routines p
4680: 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65 72  rocessing parser
4690: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
46a0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
46b0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41  erator..*/../* A
46c0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
46d0: 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73  rser action */.s
46e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
46f0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28  ion *Action_new(
4700: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
4710: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66  struct action *f
4720: 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73  reelist = 0;.  s
4730: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65  truct action *ne
4740: 77 61 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20  waction;..  if( 
4750: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
4760: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4770: 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
4780: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
4790: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c  uct action *)cal
47a0: 6c 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28  loc(amt, sizeof(
47b0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b  struct action));
47c0: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73  .    if( freelis
47d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
47e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
47f0: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
4800: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
4810: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e  w parser action.
4820: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4840: 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
4850: 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ++) freelist[i].
4860: 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74  next = &freelist
4870: 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c  [i+1];.    freel
4880: 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
4890: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63  = 0;.  }.  newac
48a0: 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b  tion = freelist;
48b0: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
48c0: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
48d0: 72 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e  return newaction
48e0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
48f0: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
4900: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
4910: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
4920: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
4930: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
4940: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
4950: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
4960: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
4970: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
4980: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
4990: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
49a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
49b0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
49c0: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
49d0: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
49e0: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
49f0: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
4a00: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
4a10: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
4a20: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
4a30: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
4a40: 3d 3d 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70  ==0 && (ap1->typ
4a50: 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31  e==REDUCE || ap1
4a60: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44  ->type==SHIFTRED
4a70: 55 43 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  UCE) ){.    rc =
4a80: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
4a90: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
4aa0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
4ab0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4ac0: 3d 20 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61  = (int) (ap2 - a
4ad0: 70 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p1);.  }.  retur
4ae0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
4af0: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
4b00: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4b10: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
4b20: 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61  sort(.  struct a
4b30: 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61  ction *ap.){.  a
4b40: 70 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  p = (struct acti
4b50: 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  on *)msort((char
4b60: 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26   *)ap,(char **)&
4b70: 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20  ap->next,.      
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28          (int(*)(
4ba0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
4bb0: 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63  t char*))actionc
4bc0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70  mp);.  return ap
4bd0: 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e  ;.}..void Action
4be0: 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 61  _add(.  struct a
4bf0: 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65  ction **app,.  e
4c00: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
4c10: 65 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  e,.  struct symb
4c20: 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a  ol *sp,.  char *
4c30: 61 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  arg.){.  struct 
4c40: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
4c50: 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d  n;.  newaction =
4c60: 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20   Action_new();. 
4c70: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74   newaction->next
4c80: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
4c90: 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e  = newaction;.  n
4ca0: 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d  ewaction->type =
4cb0: 20 74 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69   type;.  newacti
4cc0: 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e  on->sp = sp;.  n
4cd0: 65 77 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20  ewaction->spOpt 
4ce0: 3d 20 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d  = 0;.  if( type=
4cf0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
4d00: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
4d10: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
4d20: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
4d30: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
4d40: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
4d50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
4d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d70: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
4d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
4d90: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
4da0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
4db0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
4dc0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
4dd0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
4de0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
4df0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
4e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
4e10: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
4e20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4e30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
4e40: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
4e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
4e60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4e70: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
4e80: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
4e90: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
4ea0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
4eb0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
4ec0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
4ed0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
4ee0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
4ef0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
4f00: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
4f10: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
4f20: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
4f30: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
4f40: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
4f50: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
4f60: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
4f70: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
4f80: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
4f90: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
4fa0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
4fb0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
4fc0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
4fd0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
4fe0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
4ff0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
5000: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
5010: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
5020: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
5030: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
5040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
5050: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
5060: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
5070: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
5080: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
5090: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
50a0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
50b0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
50c0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
50d0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
50e0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
50f0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
5100: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
5110: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
5120: 68 65 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f  hen the.** actio
5130: 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67  ns for that sing
5140: 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20  le state_number 
5150: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20  are placed into 
5160: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a  the aAction[].**
5170: 20 61 72 72 61 79 20 77 69 74 68 20 61 20 73 69   array with a si
5180: 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74  ngle call to act
5190: 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54  tab_insert().  T
51a0: 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  he acttab_insert
51b0: 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  () call.** also 
51c0: 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b  resets the aLook
51d0: 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e  ahead[] array in
51e0: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
51f0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61   the next.** sta
5200: 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  te number..*/.st
5210: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
5220: 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f  ction {.  int lo
5230: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5240: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
5250: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74   the lookahead t
5260: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63  oken */.  int ac
5270: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
5280: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74       /* Action t
5290: 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69  o take on the gi
52a0: 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f  ven lookahead */
52b0: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
52c0: 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61 62  ct acttab acttab
52d0: 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62 20  ;.struct acttab 
52e0: 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  {.  int nAction;
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
5310: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74  ed slots in aAct
5320: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ion[] */.  int n
5330: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20  ActionAlloc;    
5340: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
5350: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
5360: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74  Action[] */.  st
5370: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
5380: 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69  ction.    *aActi
5390: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
53a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
53b0: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
53c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
53d0: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
53e0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
53f0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
5400: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
5410: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
5420: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5430: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
5440: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
5450: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5460: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
5470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
5480: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
5490: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
54a0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
54b0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
54c0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
54d0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
54e0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
54f0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
5500: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
5510: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
5520: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
5530: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
5540: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
5550: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
5560: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
5570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5580: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
5590: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
55a0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
55b0: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
55c0: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
55d0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
55e0: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
55f0: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
5600: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
5610: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
5620: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
5630: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
5640: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
5650: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
5660: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
5670: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
5680: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
5690: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
56a0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
56b0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
56c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
56d0: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
56e0: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
56f0: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
5700: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
5710: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
5720: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
5730: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
5740: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
5750: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
5760: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
5770: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
5780: 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61 63 74  acttab *p = (act
5790: 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28 20 31  tab *) calloc( 1
57a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
57b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
57c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
57d0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
57e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
57f0: 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b  a new acttab.");
5800: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
5810: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
5820: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
5830: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20  return p;.}../* 
5840: 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e  Add a new action
5850: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5860: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e  transaction set.
5870: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5880: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
5890: 63 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b  ce for each look
58a0: 61 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74  ahead for a part
58b0: 69 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e  icular.** state.
58c0: 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f  .*/.void acttab_
58d0: 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70  action(acttab *p
58e0: 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c  , int lookahead,
58f0: 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20   int action){.  
5900: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
5910: 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  d>=p->nLookahead
5920: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
5930: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
5940: 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c  += 25;.    p->aL
5950: 6f 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75  ookahead = (stru
5960: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5970: 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20  ion *) realloc( 
5980: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20  p->aLookahead,. 
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
59b0: 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  of(p->aLookahead
59c0: 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  [0])*p->nLookahe
59d0: 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69  adAlloc );.    i
59e0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
59f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
5a10: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
5a20: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
5a30: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
5a40: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20  ->nLookahead==0 
5a50: 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b  ){.    p->mxLook
5a60: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5a70: 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  d;.    p->mnLook
5a80: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5a90: 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69  d;.    p->mnActi
5aa0: 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d  on = action;.  }
5ab0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d  else{.    if( p-
5ac0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f  >mxLookahead<loo
5ad0: 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f  kahead ) p->mxLo
5ae0: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
5af0: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ead;.    if( p->
5b00: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b  mnLookahead>look
5b10: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70  ahead ){.      p
5b20: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
5b30: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20  lookahead;.     
5b40: 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61   p->mnAction = a
5b50: 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  ction;.    }.  }
5b60: 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  .  p->aLookahead
5b70: 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e  [p->nLookahead].
5b80: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  lookahead = look
5b90: 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f  ahead;.  p->aLoo
5ba0: 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61  kahead[p->nLooka
5bb0: 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61  head].action = a
5bc0: 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f  ction;.  p->nLoo
5bd0: 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  kahead++;.}../*.
5be0: 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73  ** Add the trans
5bf0: 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74  action set built
5c00: 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63   up with prior c
5c10: 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61  alls to acttab_a
5c20: 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20  ction().** into 
5c30: 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69  the current acti
5c40: 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  on table.  Then 
5c50: 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61  reset the transa
5c60: 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a  ction set back.*
5c70: 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65  * to an empty se
5c80: 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  t in preparation
5c90: 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64   for a new round
5ca0: 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f   of acttab_actio
5cb0: 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  n() calls..**.**
5cc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
5cd0: 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69  et into the acti
5ce0: 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
5cf0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
5d00: 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f 69  .*/.int acttab_i
5d10: 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70 29  nsert(acttab *p)
5d20: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
5d30: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   n;.  assert( p-
5d40: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29 3b  >nLookahead>0 );
5d50: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
5d60: 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68 20   we have enough 
5d70: 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  space to hold th
5d80: 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69 6f  e expanded actio
5d90: 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  n table.  ** in 
5da0: 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 20  the worst case. 
5db0: 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65 20   The worst case 
5dc0: 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74 72  occurs if the tr
5dd0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20 20  ansaction set.  
5de0: 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65 6e  ** must be appen
5df0: 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
5e00: 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  nt action table.
5e10: 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d 78    */.  n = p->mx
5e20: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a 20  Lookahead + 1;. 
5e30: 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20   if( p->nAction 
5e40: 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f  + n >= p->nActio
5e50: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  nAlloc ){.    in
5e60: 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e  t oldAlloc = p->
5e70: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20  nActionAlloc;.  
5e80: 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f    p->nActionAllo
5e90: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b  c = p->nAction +
5ea0: 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41   n + p->nActionA
5eb0: 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 70  lloc + 20;.    p
5ec0: 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 28 73 74 72  ->aAction = (str
5ed0: 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63  uct lookahead_ac
5ee0: 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28  tion *) realloc(
5ef0: 20 70 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20   p->aAction,.   
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d         sizeof(p-
5f20: 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e  >aAction[0])*p->
5f30: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20  nActionAlloc);. 
5f40: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
5f50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
5f60: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
5f70: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
5f80: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
5f90: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
5fa0: 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e  oldAlloc; i<p->n
5fb0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b  ActionAlloc; i++
5fc0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74  ){.      p->aAct
5fd0: 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[i].lookahead
5fe0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
5ff0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f  aAction[i].actio
6000: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  n = -1;.    }.  
6010: 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
6020: 20 65 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e   existing action
6030: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
6040: 6f 72 20 61 6e 20 6f 66 66 73 65 74 20 74 68 61  or an offset tha
6050: 74 20 69 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c  t is a.  ** dupl
6060: 69 63 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  icate of the cur
6070: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6080: 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20   set.  Fall out 
6090: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a  of the loop.  **
60a0: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 74 68 65   if and when the
60b0: 20 64 75 70 6c 69 63 61 74 65 20 69 73 20 66 6f   duplicate is fo
60c0: 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  und..  **.  ** i
60d0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e   is the index in
60e0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68   p->aAction[] wh
60f0: 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ere p->mnLookahe
6100: 61 64 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a  ad is inserted..
6110: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e    */.  for(i=p->
6120: 6e 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b  nAction-1; i>=0;
6130: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70   i--){.    if( p
6140: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
6150: 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f  kahead==p->mnLoo
6160: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
6170: 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64  /* All lookahead
6180: 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 20 69 6e  s and actions in
6190: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
61a0: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  ] transaction.  
61b0: 20 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61 74 63      ** must matc
61c0: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 61  h against the ca
61d0: 6e 64 69 64 61 74 65 20 61 41 63 74 69 6f 6e 5b  ndidate aAction[
61e0: 69 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  i] entry. */.   
61f0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6200: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  n[i].action!=p->
6210: 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69  mnAction ) conti
6220: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
6230: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
6240: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ead; j++){.     
6250: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6260: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6270: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6280: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
6290: 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d  if( k<0 || k>=p-
62a0: 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b  >nAction ) break
62b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
62c0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
62d0: 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63  ookahead!=p->aAc
62e0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
62f0: 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
6300: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
6310: 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d  head[j].action!=
6320: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63  p->aAction[k].ac
6330: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6350: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
6360: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
6370: 20 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69 62 6c     /* No possibl
6380: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61 6c 75  e lookahead valu
6390: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 69 6e  e that is not in
63a0: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
63b0: 5d 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  ].      ** trans
63c0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65  action is allowe
63d0: 64 20 74 6f 20 6d 61 74 63 68 20 61 41 63 74 69  d to match aActi
63e0: 6f 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20 20 6e  on[i] */.      n
63f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
6400: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
6410: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
6420: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6430: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  j].lookahead<0 )
6440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6450: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6460: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
6470: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
6480: 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  -i ) n++;.      
6490: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
64a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ->nLookahead ){.
64b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20          break;  
64c0: 2f 2a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63  /* An exact matc
64d0: 68 20 69 73 20 66 6f 75 6e 64 20 61 74 20 6f 66  h is found at of
64e0: 66 73 65 74 20 69 20 2a 2f 0a 20 20 20 20 20 20  fset i */.      
64f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6500: 2a 20 49 66 20 6e 6f 20 65 78 69 73 74 69 6e 67  * If no existing
6510: 20 6f 66 66 73 65 74 73 20 65 78 61 63 74 6c 79   offsets exactly
6520: 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65   match the curre
6530: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
6540: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61 6e 20  find an.  ** an 
6550: 65 6d 70 74 79 20 6f 66 66 73 65 74 20 69 6e 20  empty offset in 
6560: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6570: 62 6c 65 20 69 6e 20 77 68 69 63 68 20 77 65 20  ble in which we 
6580: 63 61 6e 20 61 64 64 20 74 68 65 0a 20 20 2a 2a  can add the.  **
6590: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
65a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
65b0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
65c0: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c   /* Look for hol
65d0: 65 73 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f  es in the aActio
65e0: 6e 5b 5d 20 74 61 62 6c 65 20 74 68 61 74 20 66  n[] table that f
65f0: 69 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  it the current. 
6600: 20 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64     ** aLookahead
6610: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  [] transaction. 
6620: 20 4c 65 61 76 65 20 69 20 73 65 74 20 74 6f 20   Leave i set to 
6630: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
6640: 65 20 68 6f 6c 65 2e 0a 20 20 20 20 2a 2a 20 49  e hole..    ** I
6650: 66 20 6e 6f 20 68 6f 6c 65 73 20 61 72 65 20 66  f no holes are f
6660: 6f 75 6e 64 2c 20 69 20 69 73 20 6c 65 66 74 20  ound, i is left 
6670: 61 74 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77  at p->nAction, w
6680: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 0a 20  hich means the. 
6690: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
66a0: 6e 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e 64  n will be append
66b0: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
66c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
66d0: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
66e0: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
66f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6700: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6720: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6730: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6740: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6750: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6760: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6770: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6780: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6790: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
67a0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
67b0: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
67c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
67d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
67e0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
67f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6800: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6810: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6830: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6840: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6850: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6860: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6870: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6880: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6890: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
68a0: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
68b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
68c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
68d0: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
68e0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
68f0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66   index i. */.  f
6900: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f  or(j=0; j<p->nLo
6910: 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20  okahead; j++){. 
6920: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6930: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6940: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6950: 61 64 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61  ad + i;.    p->a
6960: 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61  Action[k] = p->a
6970: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20  Lookahead[j];.  
6980: 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74    if( k>=p->nAct
6990: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
69a0: 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d   = k+1;.  }.  p-
69b0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b  >nLookahead = 0;
69c0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
69d0: 65 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73  e offset that is
69e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f   added to the lo
69f0: 6f 6b 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72  okahead in order
6a00: 20 74 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a   to get the.  **
6a10: 20 69 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61   index into yy_a
6a20: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74  ction of the act
6a30: 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ion */.  return 
6a40: 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  i - p->mnLookahe
6a50: 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ad;.}../********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
6a70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
6a80: 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.c" *********
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
6ab0: 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63  ines to construc
6ac0: 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20  tion the finite 
6ad0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f  state machine fo
6ae0: 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70  r the LEMON.** p
6af0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
6b00: 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70  .*/../* Find a p
6b10: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
6b20: 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69   of every rule i
6b30: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a  n the grammar..*
6b40: 2a 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73  *.** Those rules
6b50: 20 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72   which have a pr
6b60: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
6b70: 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70  coded in the inp
6b80: 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73  ut.** grammar us
6b90: 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c  ing the "[symbol
6ba0: 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c  ]" construct wil
6bb0: 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74  l already have t
6bc0: 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79  he.** rp->precsy
6bd0: 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20  m field filled. 
6be0: 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b   Other rules tak
6bf0: 65 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65  e as their prece
6c00: 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  dence.** symbol 
6c10: 74 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79  the first RHS sy
6c20: 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69  mbol with a defi
6c30: 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20  ned precedence. 
6c40: 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
6c50: 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73   not RHS symbols
6c60: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
6c70: 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20  precedence, the 
6c80: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
6c90: 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65  mbol field is le
6ca0: 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69  ft blank..*/.voi
6cb0: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
6cc0: 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ences(struct lem
6cd0: 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74 72 75  on *xp).{.  stru
6ce0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66  ct rule *rp;.  f
6cf0: 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20  or(rp=xp->rule; 
6d00: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
6d10: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  {.    if( rp->pr
6d20: 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  ecsym==0 ){.    
6d30: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
6d40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
6d50: 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65  >nrhs && rp->pre
6d60: 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  csym==0; i++){. 
6d70: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
6d80: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
6d90: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
6da0: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
6db0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
6dc0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
6dd0: 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
6de0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6df0: 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d    if( sp->subsym
6e00: 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a  [j]->prec>=0 ){.
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
6e20: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e  ->precsym = sp->
6e30: 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20  subsym[j];.     
6e40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e70: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e    }else if( sp->
6e80: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
6e90: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
6ea0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
6eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6ed0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20  urn;.}../* Find 
6ee0: 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  all nonterminals
6ef0: 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65   which will gene
6f00: 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73  rate the empty s
6f10: 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67  tring..** Then g
6f20: 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75  o back and compu
6f30: 74 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74  te the first set
6f40: 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65  s of every nonte
6f50: 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66  rminal..** The f
6f60: 69 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20  irst set is the 
6f70: 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69  set of all termi
6f80: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  nal symbols whic
6f90: 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61  h can begin.** a
6fa0: 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65   string generate
6fb0: 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72  d by that nonter
6fc0: 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46  minal..*/.void F
6fd0: 69 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72  indFirstSets(str
6fe0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
6ff0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .{.  int i, j;. 
7000: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
7010: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
7020: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
7030: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
7040: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
7050: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64  ymbols[i]->lambd
7060: 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b  a = LEMON_FALSE;
7070: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d  .  }.  for(i=lem
7080: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c  p->nterminal; i<
7090: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
70a0: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
70b0: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74  ymbols[i]->first
70c0: 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  set = SetNew();.
70d0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
70e0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62  compute all lamb
70f0: 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  das */.  do{.   
7100: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
7110: 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e     for(rp=lemp->
7120: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
7130: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
7140: 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64  ( rp->lhs->lambd
7150: 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
7160: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
7170: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
7180: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
7190: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
71a0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  hs[i];.        a
71b0: 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65 3d  ssert( sp->type=
71c0: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
71d0: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
71e0: 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20  N_FALSE );.     
71f0: 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
7200: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
7210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7220: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
7230: 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
7240: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
7250: 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20   = LEMON_TRUE;. 
7260: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
7270: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7280: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
7290: 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e  gress );..  /* N
72a0: 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66  ow compute all f
72b0: 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64  irst sets */.  d
72c0: 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  o{.    struct sy
72d0: 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20  mbol *s1, *s2;. 
72e0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
72f0: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
7300: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
7310: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7320: 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20  s1 = rp->lhs;.  
7330: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
7340: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
7350: 20 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e         s2 = rp->
7360: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
7370: 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45  if( s2->type==TE
7380: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7390: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
73a0: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
73b0: 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a  set,s2->index);.
73c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
73d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
73e0: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( s2->type==MUL
73f0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
7400: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7410: 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<s2->nsubsym; 
7420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
7430: 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65    progress += Se
7440: 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65  tAdd(s1->firstse
7450: 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  t,s2->subsym[j]-
7460: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
7470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
7480: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
7490: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
74a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
74b0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  s1->lambda==LEMO
74c0: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
74d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
74e0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
74f0: 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73  ss += SetUnion(s
7500: 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e  1->firstset,s2->
7510: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
7520: 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d       if( s2->lam
7530: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7540: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7550: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7560: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
7570: 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e  ress );.  return
7580: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ;.}../* Compute 
7590: 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73  all LR(0) states
75a0: 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72   for the grammar
75b0: 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20  .  Links.** are 
75c0: 61 64 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e  added to between
75d0: 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20   some states so 
75e0: 74 68 61 74 20 74 68 65 20 4c 52 28 31 29 20 66  that the LR(1) f
75f0: 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61  ollow sets.** ca
7600: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
7610: 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ter..*/.PRIVATE 
7620: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65  struct state *ge
7630: 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65  tstate(struct le
7640: 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77  mon *);  /* forw
7650: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
7660: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
7670: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
7680: 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
7690: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
76a0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
76b0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69    Configlist_ini
76c0: 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  t();..  /* Find 
76d0: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
76e0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
76f0: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
7700: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
7710: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
7720: 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
7730: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
7740: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
7750: 68 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61  he specified sta
7760: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
7770: 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e   is not \.in a n
7780: 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68  onterminal of th
7790: 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73  e grammar.  \"%s
77a0: 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  \" will be used 
77b0: 61 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73  as the start \.s
77c0: 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c  ymbol instead.",
77d0: 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70  lemp->start,lemp
77e0: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
77f0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  ->name);.      l
7800: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
7810: 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  .      sp = lemp
7820: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
7830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
7840: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
7850: 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a  startRule->lhs;.
7860: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
7870: 75 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ure the start sy
7880: 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63  mbol doesn't occ
7890: 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ur on the right-
78a0: 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a  hand side of.  *
78b0: 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70  * any rule.  Rep
78c0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
78d0: 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20  it does.  (YACC 
78e0: 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61  would generate a
78f0: 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20   new.  ** start 
7900: 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63  symbol in this c
7910: 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72  ase.) */.  for(r
7920: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
7930: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
7940: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
7950: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
7960: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
7970: 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d  if( rp->rhs[i]==
7980: 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d  sp ){   /* FIX M
7990: 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75  E:  Deal with mu
79a0: 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a  ltiterminals */.
79b0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
79c0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
79d0: 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79  0,."The start sy
79e0: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75  mbol \"%s\" occu
79f0: 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68  rs on the \.righ
7a00: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t-hand side of a
7a10: 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   rule. This will
7a20: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72   result in a par
7a30: 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73  ser which \.does
7a40: 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72   not work proper
7a50: 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  ly.",sp->name);.
7a60: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
7a70: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
7a80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7a90: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
7aa0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f  iguration set fo
7ab0: 72 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  r the first stat
7ac0: 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75  e.  ** is all ru
7ad0: 6c 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74  les which have t
7ae0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
7af0: 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65  as their.  ** le
7b00: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a  ft-hand side */.
7b10: 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c    for(rp=sp->rul
7b20: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
7b30: 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75  xtlhs){.    stru
7b40: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66  ct config *newcf
7b50: 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74  p;.    rp->lhsSt
7b60: 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77  art = 1;.    new
7b70: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
7b80: 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b  _addbasis(rp,0);
7b90: 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63  .    SetAdd(newc
7ba0: 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a  fp->fws,0);.  }.
7bb0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
7bc0: 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20  e first state.  
7bd0: 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  All other states
7be0: 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f   will be.  ** co
7bf0: 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63  mputed automatic
7c00: 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20  ally during the 
7c10: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74  computation of t
7c20: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20  he first one..  
7c30: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
7c40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
7c50: 69 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f  irst state is no
7c60: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f  t used. */.  (vo
7c70: 69 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70  id)getstate(lemp
7c80: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7c90: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
7ca0: 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77  ter to a state w
7cb0: 68 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65  hich is describe
7cc0: 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75  d by the configu
7cd0: 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77  ration.** list w
7ce0: 68 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75  hich has been bu
7cf0: 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74  ilt from calls t
7d00: 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  o Configlist_add
7d10: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
7d20: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74  d buildshifts(st
7d30: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74  ruct lemon *, st
7d40: 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f  ruct state *); /
7d50: 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50  * Forwd ref */.P
7d60: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
7d70: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74  ate *getstate(st
7d80: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7d90: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
7da0: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
7db0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
7dc0: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
7dd0: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
7de0: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
7df0: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
7e00: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
7e10: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
7e20: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
7e30: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
7e40: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
7e50: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
7e60: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
7e70: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
7e80: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
7e90: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
7ea0: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
7eb0: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
7ec0: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
7ed0: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
7ee0: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
7ef0: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
7f00: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
7f10: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
7f20: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
7f30: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
7f40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
7f50: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
7f60: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
7f70: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
7f80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
7f90: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
7fa0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
7fb0: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
7fc0: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
7fd0: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
7fe0: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
7ff0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
8000: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
8010: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
8020: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
8030: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
8040: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
8050: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
8060: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
8070: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
8080: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
8090: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
80a0: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
80b0: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
80c0: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
80d0: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
80e0: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
80f0: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
8100: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
8110: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
8120: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
8130: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
8140: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
8150: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
8160: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
8170: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
8180: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
8190: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
81a0: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
81b0: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
81c0: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
81d0: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
81e0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
81f0: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
8200: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
8210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8220: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
8230: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
8240: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
8250: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
8260: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
8270: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
8280: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
8290: 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65  /.    stp->state
82a0: 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  num = lemp->nsta
82b0: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
82c0: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
82d0: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
82e0: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
8310: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
8320: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
8330: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
8340: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
8350: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
8360: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
8370: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
8380: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
8390: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
83a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
83b0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
83c0: 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73  rn true if two s
83d0: 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73  ymbols are the s
83e0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65  ame..*/.int same
83f0: 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73  _symbol(struct s
8400: 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74  ymbol *a, struct
8410: 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20   symbol *b).{.  
8420: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d  int i;.  if( a==
8430: 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  b ) return 1;.  
8440: 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c  if( a->type!=MUL
8450: 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74  TITERMINAL ) ret
8460: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e  urn 0;.  if( b->
8470: 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49  type!=MULTITERMI
8480: 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  NAL ) return 0;.
8490: 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d    if( a->nsubsym
84a0: 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72  !=b->nsubsym ) r
84b0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
84c0: 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d  =0; i<a->nsubsym
84d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
84e0: 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d  a->subsym[i]!=b-
84f0: 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74  >subsym[i] ) ret
8500: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
8510: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e  urn 1;.}../* Con
8520: 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65  struct all succe
8530: 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74  ssor states to t
8540: 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20  he given state. 
8550: 20 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a   A "successor".*
8560: 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73  * state is any s
8570: 74 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62  tate which can b
8580: 65 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73  e reached by a s
8590: 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  hift action..*/.
85a0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
85b0: 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20  ldshifts(struct 
85c0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72  lemon *lemp, str
85d0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a  uct state *stp).
85e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
85f0: 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20  g *cfp;  /* For 
8600: 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65  looping thru the
8610: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
8620: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
8630: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66  ruct config *bcf
8640: 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e  p; /* For the in
8650: 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66  ner loop on conf
8660: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
8670: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
8680: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20  config *newcfg; 
8690: 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   /* */.  struct 
86a0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a  symbol *sp;   /*
86b0: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
86c0: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
86d0: 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22  figuration "cfp"
86e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
86f0: 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79  bol *bsp;  /* Sy
8700: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
8710: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
8720: 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a  uration "bcfp" *
8730: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  /.  struct state
8740: 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70   *newstp; /* A p
8750: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63  ointer to a succ
8760: 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  essor state */..
8770: 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67    /* Each config
8780: 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20  uration becomes 
8790: 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69  complete after i
87a0: 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20  t contibutes to 
87b0: 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a  a successor.  **
87c0: 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c   state.  Initial
87d0: 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ly, all configur
87e0: 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d  ations are incom
87f0: 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63  plete */.  for(c
8800: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8810: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8820: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49   cfp->status = I
8830: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a  NCOMPLETE;..  /*
8840: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
8850: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
8860: 20 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73   of the state "s
8870: 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70  tp" */.  for(cfp
8880: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
8890: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
88a0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61      if( cfp->sta
88b0: 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20  tus==COMPLETE ) 
88c0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20  continue;    /* 
88d0: 41 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20  Already used by 
88e0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  inner loop */.  
88f0: 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d    if( cfp->dot>=
8900: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20  cfp->rp->nrhs ) 
8910: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61  continue;  /* Ca
8920: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63  n't shift this c
8930: 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e  onfig */.    Con
8940: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b  figlist_reset();
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
8970: 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65  he new config se
8980: 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66  t */.    sp = cf
8990: 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e  p->rp->rhs[cfp->
89a0: 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20  dot];           
89b0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65    /* Symbol afte
89c0: 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20  r the dot */..  
89d0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63    /* For every c
89e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20  onfiguration in 
89f0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8a00: 77 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79  which has the sy
8a10: 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a  mbol "sp".    **
8a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64   following its d
8a30: 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65  ot, add the same
8a40: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
8a50: 6f 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20  o the basis set 
8a60: 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e  under.    ** con
8a70: 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69  struction but wi
8a80: 74 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74  th the dot shift
8a90: 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f  ed one symbol to
8aa0: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
8ab0: 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b     for(bcfp=cfp;
8ac0: 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70   bcfp; bcfp=bcfp
8ad0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
8ae0: 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d  f( bcfp->status=
8af0: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
8b00: 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65  inue;    /* Alre
8b10: 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ady used */.    
8b20: 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e    if( bcfp->dot>
8b30: 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  =bcfp->rp->nrhs 
8b40: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43  ) continue; /* C
8b50: 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20  an't shift this 
8b60: 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70  one */.      bsp
8b70: 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73   = bcfp->rp->rhs
8b80: 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20  [bcfp->dot];    
8b90: 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79         /* Get sy
8ba0: 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a  mbol after dot *
8bb0: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73 61 6d  /.      if( !sam
8bc0: 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29  e_symbol(bsp,sp)
8bd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
8be0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d    /* Must be sam
8bf0: 65 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a  e as for "cfp" *
8c00: 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74  /.      bcfp->st
8c10: 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b  atus = COMPLETE;
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63    /* Mark this c
8c40: 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f  onfig as used */
8c50: 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20  .      newcfg = 
8c60: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
8c70: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
8c80: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
8c90: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63   Plink_add(&newc
8ca0: 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a  fg->bplp,bcfp);.
8cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
8cc0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
8cd0: 68 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62  he state describ
8ce0: 65 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20  ed by the basis 
8cf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
8d00: 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  t.    ** constru
8d10: 63 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63  cted in the prec
8d20: 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20  eding loop */.  
8d30: 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74    newstp = getst
8d40: 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20  ate(lemp);..    
8d50: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65  /* The state "ne
8d60: 77 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64  wstp" is reached
8d70: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
8d80: 22 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74  "stp" by a shift
8d90: 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f   action.    ** o
8da0: 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  n the symbol "sp
8db0: 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d  " */.    if( sp-
8dc0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
8dd0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e  INAL ){.      in
8de0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
8df0: 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79  =0; i<sp->nsubsy
8e00: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
8e10: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
8e20: 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73  ->ap,SHIFT,sp->s
8e30: 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29  ubsym[i],(char*)
8e40: 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d  newstp);.      }
8e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8e60: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
8e70: 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28  p->ap,SHIFT,sp,(
8e80: 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a  char *)newstp);.
8e90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8ea0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
8eb0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
8ec0: 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c  ks.*/.void FindL
8ed0: 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  inks(struct lemo
8ee0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
8ef0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
8f00: 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72  fig *cfp, *other
8f10: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
8f20: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
8f30: 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f  plink *plp;..  /
8f40: 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64  * Housekeeping d
8f50: 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20  etail:.  ** Add 
8f60: 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61  to every propaga
8f70: 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65  te link a pointe
8f80: 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74  r back to the st
8f90: 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63  ate to.  ** whic
8fa0: 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74  h the link is at
8fb0: 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  tached. */.  for
8fc0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
8fd0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
8fe0: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
8ff0: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
9000: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
9010: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9020: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70  {.      cfp->stp
9030: 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20   = stp;.    }.  
9040: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
9050: 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e  all backlinks in
9060: 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73  to forward links
9070: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77  .  Only the forw
9080: 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61  ard.  ** links a
9090: 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66  re used in the f
90a0: 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74  ollow-set comput
90b0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ation. */.  for(
90c0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
90d0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
90e0: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
90f0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
9100: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
9110: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
9120: 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63  .      for(plp=c
9130: 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->bplp; plp; p
9140: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
9150: 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70         other = p
9160: 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20  lp->cfp;.       
9170: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65   Plink_add(&othe
9180: 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20  r->fplp,cfp);.  
9190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
91a0: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
91b0: 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a  l followsets..**
91c0: 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  .** A followset 
91d0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
91e0: 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  l symbols which 
91f0: 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61  can come immedia
9200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20  tely.** after a 
9210: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
9220: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f  /.void FindFollo
9230: 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d  wSets(struct lem
9240: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
9250: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  t i;.  struct co
9260: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
9270: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
9280: 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a    int progress;.
9290: 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20    int change;.. 
92a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
92b0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
92c0: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
92d0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
92e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
92f0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
9300: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
9310: 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PLETE;.    }.  }
9320: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  ..  do{.    prog
9330: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
9340: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9350: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9360: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
9370: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
9380: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
9390: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
93a0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
93b0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
93c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
93d0: 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70  plp=cfp->fplp; p
93e0: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
93f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  t){.          ch
9400: 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28  ange = SetUnion(
9410: 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66  plp->cfp->fws,cf
9420: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20  p->fws);.       
9430: 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b     if( change ){
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70  .            plp
9450: 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20  ->cfp->status = 
9460: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
9470: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
9480: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
9490: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
94a0: 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20      cfp->status 
94b0: 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  = COMPLETE;.    
94c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
94d0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
94e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  }..static int re
94f0: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73  solve_conflict(s
9500: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73  truct action *,s
9510: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
9520: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  ../* Compute the
9530: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c   reduce actions,
9540: 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e   and resolve con
9550: 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  flicts..*/.void 
9560: 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75  FindActions(stru
9570: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
9580: 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73  {.  int i,j;.  s
9590: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
95a0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
95b0: 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
95c0: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
95d0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
95e0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66  .  /* Add all of
95f0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
9600: 6f 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ons.  ** A reduc
9610: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
9620: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
9630: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
9640: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
9650: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
9660: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
9670: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
9680: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
9690: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
96a0: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
96b0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
96c0: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
96d0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
96e0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
96f0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
9700: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
9710: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
9720: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
9730: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
9740: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
9750: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
9760: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
9770: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
9780: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
9790: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
97a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
97b0: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
97c0: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
97d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
97e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
97f0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
9800: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
9810: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
9820: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
9830: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
9840: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
9850: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
9860: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
9870: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
9880: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
9890: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
98a0: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
98b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
98c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
98d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
98e0: 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69   Add the accepti
98f0: 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66  ng token */.  if
9900: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
9910: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
9920: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
9930: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
9940: 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  0 ) sp = lemp->s
9950: 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20  tartRule->lhs;. 
9960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
9970: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65   lemp->startRule
9980: 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ->lhs;.  }.  /* 
9990: 41 64 64 20 74 6f 20 74 68 65 20 66 69 72 73 74  Add to the first
99a0: 20 73 74 61 74 65 20 28 77 68 69 63 68 20 69 73   state (which is
99b0: 20 61 6c 77 61 79 73 20 74 68 65 20 73 74 61 72   always the star
99c0: 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68  ting state of th
99d0: 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74  e.  ** finite st
99e0: 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20  ate machine) an 
99f0: 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54  action to ACCEPT
9a00: 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   if the lookahea
9a10: 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  d is the.  ** st
9a20: 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  art nonterminal.
9a30: 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64    */.  Action_ad
9a40: 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  d(&lemp->sorted[
9a50: 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70  0]->ap,ACCEPT,sp
9a60: 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  ,0);..  /* Resol
9a70: 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ve conflicts */.
9a80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
9a90: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
9aa0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
9ab0: 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20  on *ap, *nap;.  
9ac0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
9ad0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20  rted[i];.    /* 
9ae0: 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20  assert( stp->ap 
9af0: 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61  ); */.    stp->a
9b00: 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
9b10: 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f  stp->ap);.    fo
9b20: 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
9b30: 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70   && ap->next; ap
9b40: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
9b50: 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65    for(nap=ap->ne
9b60: 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e  xt; nap && nap->
9b70: 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d  sp==ap->sp; nap=
9b80: 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  nap->next){.    
9b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
9ba0: 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64  actions "ap" and
9bb0: 20 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20   "nap" have the 
9bc0: 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a  same lookahead..
9bd0: 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75           ** Figu
9be0: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9bf0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
9c00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70  */.         lemp
9c10: 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72  ->nconflict += r
9c20: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
9c30: 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d  ap,nap);.      }
9c40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9c50: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
9c60: 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74   for each rule t
9c70: 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65  hat can never be
9c80: 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66   reduced. */.  f
9c90: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
9ca0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
9cb0: 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  t) rp->canReduce
9cc0: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
9cd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
9ce0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
9cf0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
9d00: 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28  on *ap;.    for(
9d10: 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
9d20: 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
9d30: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9d40: 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
9d50: 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d  DUCE ) ap->x.rp-
9d60: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d  >canReduce = LEM
9d70: 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20  ON_TRUE;.    }. 
9d80: 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
9d90: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
9da0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
9db0: 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ( rp->canReduce 
9dc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9dd0: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
9de0: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
9df0: 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20  line,"This rule 
9e00: 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63  can not be reduc
9e10: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d  ed.\n");.    lem
9e20: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
9e30: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65   }.}../* Resolve
9e40: 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77   a conflict betw
9e50: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
9e60: 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  n actions.  If t
9e70: 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63  he.** conflict c
9e80: 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64  an't be resolved
9e90: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
9ea0: 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47  o..**.** NO LONG
9eb0: 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f  ER TRUE:.**   To
9ec0: 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   resolve a confl
9ed0: 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20  ict, first look 
9ee0: 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72  to see if either
9ef0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20   action.**   is 
9f00: 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  on an error rule
9f10: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9f20: 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e   take the action
9f30: 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e   which.**   is n
9f40: 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ot associated wi
9f50: 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c  th the error rul
9f60: 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f  e.  If neither o
9f70: 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69  r both.**   acti
9f80: 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  ons are associat
9f90: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
9fa0: 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20   rule, then try 
9fb0: 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63  to.**   use prec
9fc0: 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76  edence to resolv
9fd0: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a  e the conflict..
9fe0: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
9ff0: 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46  action is a SHIF
a000: 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  T, then it must 
a010: 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a  be apx.  This.**
a020: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20   function won't 
a030: 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70  work if apx->typ
a040: 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70  e==REDUCE and ap
a050: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a  y->type==SHIFT..
a060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a070: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a  solve_conflict(.
a080: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
a090: 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74 20 61  *apx,.  struct a
a0a0: 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20  ction *apy.){.  
a0b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
a0c0: 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20  px, *spy;.  int 
a0d0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73  errcnt = 0;.  as
a0e0: 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61  sert( apx->sp==a
a0f0: 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74  py->sp );  /* Ot
a100: 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77 6f  herwise there wo
a110: 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69  uld be no confli
a120: 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d  ct */.  if( apx-
a130: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20  >type==SHIFT && 
a140: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
a150: 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79 70   ){.    apy->typ
a160: 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a  e = SSCONFLICT;.
a170: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
a180: 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  }.  if( apx->typ
a190: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
a1a0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
a1b0: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
a1c0: 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  sp;.    spy = ap
a1d0: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
a1e0: 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30  ;.    if( spy==0
a1f0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
a200: 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29  || spy->prec<0 )
a210: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65  {.      /* Not e
a220: 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63 65  nough precedence
a230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
a240: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a250: 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20   = SRCONFLICT;. 
a260: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
a270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
a280: 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63  ->prec>spy->prec
a290: 20 29 7b 20 20 20 20 2f 2a 20 68 69 67 68 65 72   ){    /* higher
a2a0: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
a2b0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
a2c0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
a2d0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
a2e0: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
a2f0: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
a300: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
a310: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
a320: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
a330: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
a340: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
a350: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
a360: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
a370: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
a380: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
a3b0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
a3c0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
a3d0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
a3e0: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
a3f0: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
a400: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
a410: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
a420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a430: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
a440: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
a450: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
a460: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 78 2d  NE );.      apx-
a470: 3e 74 79 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20  >type = ERROR;. 
a480: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a490: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
a4a0: 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  CE && apy->type=
a4b0: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
a4c0: 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e  px = apx->x.rp->
a4d0: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79  precsym;.    spy
a4e0: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
a4f0: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
a500: 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20  px==0 || spy==0 
a510: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c  || spx->prec<0 |
a520: 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c  |.    spy->prec<
a530: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d  0 || spx->prec==
a540: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
a550: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
a560: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
a570: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
a580: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
a590: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec>spy->prec ){.
a5a0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
a5b0: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
a5c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
a5d0: 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63  ->prec<spy->prec
a5e0: 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ){.      apx->t
a5f0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
a600: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
a610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0a 20 20  {.    assert(.  
a620: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
a630: 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  H_RESOLVED ||.  
a640: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
a650: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  D_RESOLVED ||.  
a660: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
a670: 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  SCONFLICT ||.   
a680: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52     apx->type==SR
a690: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
a6a0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43    apx->type==RRC
a6b0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
a6c0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apy->type==SH_R
a6d0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
a6e0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apy->type==RD_R
a6f0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
a700: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apy->type==SSCO
a710: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
a720: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apy->type==SRCON
a730: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a740: 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  py->type==RRCONF
a750: 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  LICT.    );.    
a760: 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48  /* The REDUCE/SH
a770: 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20  IFT case cannot 
a780: 68 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53  happen because S
a790: 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72  HIFTs come befor
a7a0: 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73  e.    ** REDUCEs
a7b0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49   on the list.  I
a7c0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
a7d0: 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65  point it must be
a7e0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
a7f0: 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c  the parser confl
a800: 69 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20  ict had already 
a810: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
a820: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  /.  }.  return e
a830: 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rrcnt;.}./******
a840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
a850: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63  From the file "c
a860: 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a  onfiglist.c" ***
a870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a880: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
a890: 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73  utines to proces
a8a0: 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61  sing a configura
a8b0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75  tion list and bu
a8c0: 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a  ilding a state.*
a8d0: 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
a8e0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
a8f0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75  .*/..static stru
a900: 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c  ct config *freel
a910: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ist = 0;      /*
a920: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f   List of free co
a930: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
a940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
a950: 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20  nfig *current = 
a960: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  0;       /* Top 
a970: 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  of list of confi
a980: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
a990: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
a9a0: 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d  g **currentend =
a9b0: 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e   0;   /* Last on
a9c0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73   list of configs
a9d0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
a9e0: 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20  t config *basis 
a9f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
aa00: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  Top of list of b
aa10: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
aa20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
aa30: 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20  nfig **basisend 
aa40: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20  = 0;     /* End 
aa50: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
aa60: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20   configs */../* 
aa70: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
aa80: 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67   to a new config
aa90: 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
aaa0: 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  TE struct config
aab0: 20 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f 69 64   *newconfig(void
aac0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
aad0: 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66  ig *newcfg;.  if
aae0: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
aaf0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ab00: 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20  int amt = 3;.   
ab10: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
ab20: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c  uct config *)cal
ab30: 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
ab40: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20  (struct config) 
ab50: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
ab60: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
ab70: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
ab80: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
ab90: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
aba0: 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  new configuratio
abb0: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
abc0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
abd0: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
abe0: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
abf0: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
ac00: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
ac10: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
ac20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
ac30: 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  cfg = freelist;.
ac40: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
ac50: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
ac60: 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a  eturn newcfg;.}.
ac70: 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72  ./* The configur
ac80: 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e  ation "old" is n
ac90: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f  o longer used */
aca0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65  .PRIVATE void de
acb0: 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63  leteconfig(struc
acc0: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b  t config *old).{
acd0: 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66  .  old->next = f
ace0: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
acf0: 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  ist = old;.}../*
ad00: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   Initialized the
ad10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ad20: 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76  ist builder */.v
ad30: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  oid Configlist_i
ad40: 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72  nit(void){.  cur
ad50: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
ad60: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
ad70: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
ad80: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
ad90: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
ada0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
adb0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
adc0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
add0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
ade0: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
adf0: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76  nfiglist_reset(v
ae00: 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  oid){.  current 
ae10: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
ae20: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
ae30: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
ae40: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
ae50: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
ae60: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
ae70: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
ae80: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
ae90: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
aea0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
aeb0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
aec0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20  nfiglist_add(.  
aed0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
aee0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
aef0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20  */.  int dot    
af00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
af10: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
af20: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
af30: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
af40: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  .){.  struct con
af50: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
af60: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
af70: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
af80: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
af90: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
afa0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
afb0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
afc0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
afd0: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
afe0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
aff0: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
b000: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
b010: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
b020: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
b030: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
b040: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
b050: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
b060: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
b070: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
b080: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
b090: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
b0a0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
b0b0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
b0c0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
b0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
b0e0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
b0f0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
b100: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
b110: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
b120: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
b130: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
b140: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
b150: 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73  , int dot).{.  s
b160: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
b170: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
b180: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
b190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
b1a0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b1b0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
b1c0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
b1d0: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
b1e0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
b1f0: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
b200: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
b210: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
b220: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
b230: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
b240: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
b250: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
b260: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
b270: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b280: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b290: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b2a0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b2b0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b2c0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b2d0: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b2e0: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
b2f0: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
b300: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
b310: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
b320: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
b330: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
b340: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
b350: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
b360: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b370: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b380: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
b390: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
b3a0: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
b3b0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
b3c0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
b3d0: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
b3e0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
b3f0: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
b400: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
b410: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
b420: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
b430: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
b440: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
b450: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
b460: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
b470: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
b480: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
b490: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
b4a0: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
b4b0: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
b4c0: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
b4d0: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
b4e0: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
b4f0: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
b500: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
b510: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
b520: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
b530: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
b540: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
b550: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
b560: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
b570: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
b580: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
b590: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
b5a0: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
b5b0: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
b5c0: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
b5d0: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
b5e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
b5f0: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
b600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b610: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
b620: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
b630: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
b640: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
b650: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
b660: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
b670: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b690: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
b6a0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
b6b0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
b6c0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
b6d0: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
b6e0: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
b6f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
b700: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
b710: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
b720: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
b730: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b740: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b750: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
b770: 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77  Union(newcfp->fw
b780: 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29  s,xsp->firstset)
b790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
b7a0: 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  ( xsp->lambda==L
b7b0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
b7c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
b7d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b7e0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
b7f0: 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63  s ) Plink_add(&c
b800: 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29  fp->fplp,newcfp)
b810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
b830: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e  ./* Sort the con
b840: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b850: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b860: 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b 0a 20  st_sort(void){. 
b870: 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75   current = (stru
b880: 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74  ct config*)msort
b890: 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c  ((char*)current,
b8a0: 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e  (char**)&(curren
b8b0: 74 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20  t->next),.      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66              Conf
b8e0: 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e  igcmp);.  curren
b8f0: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
b900: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74  rn;.}../* Sort t
b910: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
b920: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
b930: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
b940: 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 7b 0a  ortbasis(void){.
b950: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
b960: 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28  t config*)msort(
b970: 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28  (char*)current,(
b980: 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74  char**)&(current
b990: 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20 20 20  ->bp),.         
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d 70         Configcmp
b9c0: 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  );.  basisend = 
b9d0: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
b9e0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
b9f0: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
ba00: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
ba10: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
ba20: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
ba30: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
ba40: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
ba50: 75 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73 74 72  urn(void){.  str
ba60: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
ba70: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
ba80: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
ba90: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
baa0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
bab0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
bac0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
bad0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
bae0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
baf0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
bb00: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
bb10: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
bb20: 5f 62 61 73 69 73 28 76 6f 69 64 29 7b 0a 20 20  _basis(void){.  
bb30: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
bb40: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69  ld;.  old = basi
bb50: 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  s;.  basis = 0;.
bb60: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a    basisend = 0;.
bb70: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
bb80: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65  ./* Free all ele
bb90: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76  ments of the giv
bba0: 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  en configuration
bbb0: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
bbc0: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72  nfiglist_eat(str
bbd0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29  uct config *cfp)
bbe0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
bbf0: 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66  ig *nextcfp;.  f
bc00: 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65  or(; cfp; cfp=ne
bc10: 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74  xtcfp){.    next
bc20: 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b  cfp = cfp->next;
bc30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
bc40: 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->fplp==0 );.   
bc50: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70   assert( cfp->bp
bc60: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  lp==0 );.    if(
bc70: 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46   cfp->fws ) SetF
bc80: 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20  ree(cfp->fws);. 
bc90: 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28     deleteconfig(
bca0: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
bcb0: 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rn;.}./*********
bcc0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
bcd0: 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22  e file "error.c"
bce0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
bcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd00: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  **/./*.** Code f
bd10: 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f  or printing erro
bd20: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76  r message..*/..v
bd30: 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e  oid ErrorMsg(con
bd40: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
bd50: 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  e, int lineno, c
bd60: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61  onst char *forma
bd70: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
bd80: 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66  st ap;.  fprintf
bd90: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
bda0: 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69   ", filename, li
bdb0: 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72  neno);.  va_star
bdc0: 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20  t(ap, format);. 
bdd0: 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72   vfprintf(stderr
bde0: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
bdf0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72  a_end(ap);.  fpr
be00: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
be10: 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ");.}./*********
be20: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
be30: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
be70: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
be80: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
be90: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
bea0: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
beb0: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
bec0: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
bed0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
bee0: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
bef0: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
bf00: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
bf10: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
bf20: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 76 6f   memory_error(vo
bf30: 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  id){.  fprintf(s
bf40: 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
bf50: 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e  mory.  Aborting.
bf60: 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31  ..\n");.  exit(1
bf70: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
bf80: 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20   nDefine = 0;   
bf90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfa0: 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68  -D options on th
bfb0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
bfc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
bfd0: 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f  azDefine = 0;  /
bfe0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44  * Name of the -D
bff0: 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54   macros */../* T
c000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
c010: 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61  alled with the a
c020: 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20  rgument to each 
c030: 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  -D command-line 
c040: 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74  option..** Add t
c050: 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  he macro defined
c060: 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65   to the azDefine
c070: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
c080: 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f  c void handle_D_
c090: 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b  option(char *z){
c0a0: 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20  .  char **paz;. 
c0b0: 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a   nDefine++;.  az
c0c0: 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a  Define = (char *
c0d0: 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66  *) realloc(azDef
c0e0: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65  ine, sizeof(azDe
c0f0: 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65  fine[0])*nDefine
c100: 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e  );.  if( azDefin
c110: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
c120: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
c130: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
c140: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
c150: 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e    paz = &azDefin
c160: 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20  e[nDefine-1];.  
c170: 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20  *paz = (char *) 
c180: 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
c190: 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66  len(z)+1 );.  if
c1a0: 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( *paz==0 ){.   
c1b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c1c0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
c1d0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
c1e0: 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
c1f0: 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20  cpy(*paz, z);.  
c200: 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26  for(z=*paz; *z &
c210: 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b  & *z!='='; z++){
c220: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73  }.  *z = 0;.}..s
c230: 74 61 74 69 63 20 63 68 61 72 20 2a 75 73 65 72  tatic char *user
c240: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20  _templatename = 
c250: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69  NULL;.static voi
c260: 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f  d handle_T_optio
c270: 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73  n(char *z){.  us
c280: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
c290: 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f  = (char *) mallo
c2a0: 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a  c( lemonStrlen(z
c2b0: 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65  )+1 );.  if( use
c2c0: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d  r_templatename==
c2d0: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  0 ){.    memory_
c2e0: 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c  error();.  }.  l
c2f0: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72  emon_strcpy(user
c300: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a  _templatename, z
c310: 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74  );.}../* Merge t
c320: 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73  ogether to lists
c330: 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65   of rules ordere
c340: 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20  d by rule.iRule 
c350: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
c360: 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67   rule *Rule_merg
c370: 65 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70  e(struct rule *p
c380: 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  A, struct rule *
c390: 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75  pB){.  struct ru
c3a0: 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a  le *pFirst = 0;.
c3b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a    struct rule **
c3c0: 70 70 50 72 65 76 20 3d 20 26 70 46 69 72 73 74  ppPrev = &pFirst
c3d0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26  ;.  while( pA &&
c3e0: 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70   pB ){.    if( p
c3f0: 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75  A->iRule<pB->iRu
c400: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  le ){.      *ppP
c410: 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  rev = pA;.      
c420: 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65  ppPrev = &pA->ne
c430: 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  xt;.      pA = p
c440: 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  A->next;.    }el
c450: 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65  se{.      *ppPre
c460: 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70  v = pB;.      pp
c470: 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74  Prev = &pB->next
c480: 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
c490: 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  >next;.    }.  }
c4a0: 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
c4b0: 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20   *ppPrev = pA;. 
c4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
c4d0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20  rev = pB;.  }.  
c4e0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
c4f0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c  ../*.** Sort a l
c500: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20  ist of rules in 
c510: 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73  order of increas
c520: 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a  ing iRule value.
c530: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
c540: 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74   rule *Rule_sort
c550: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
c560: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
c570: 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74  ruct rule *pNext
c580: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
c590: 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74  *x[32];.  memset
c5a0: 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  (x, 0, sizeof(x)
c5b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29  );.  while( rp )
c5c0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70  {.    pNext = rp
c5d0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e  ->next;.    rp->
c5e0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  next = 0;.    fo
c5f0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
c600: 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20  x)/sizeof(x[0]) 
c610: 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && x[i]; i++){. 
c620: 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d       rp = Rule_m
c630: 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a  erge(x[i], rp);.
c640: 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a        x[i] = 0;.
c650: 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d      }.    x[i] =
c660: 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e   rp;.    rp = pN
c670: 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20  ext;.  }.  rp = 
c680: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
c690: 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66  sizeof(x)/sizeof
c6a0: 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  (x[0]); i++){.  
c6b0: 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67    rp = Rule_merg
c6c0: 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d  e(x[i], rp);.  }
c6d0: 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a  .  return rp;.}.
c6e0: 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65  ./* forward refe
c6f0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
c700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
c710: 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
c720: 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20  t lwr, int upr, 
c730: 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f  int *pnByte);../
c740: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
c750: 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61   line of the "Pa
c760: 72 73 65 72 20 53 74 61 74 73 22 20 6f 75 74 70  rser Stats" outp
c770: 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
c780: 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e  d stats_line(con
c790: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  st char *zLabel,
c7a0: 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20   int iValue){.  
c7b0: 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d  int nLabel = lem
c7c0: 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29  onStrlen(zLabel)
c7d0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 25 73  ;.  printf("  %s
c7e0: 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61  %.*s %5d\n", zLa
c7f0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35  bel,.         35
c800: 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e  -nLabel, "......
c810: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c820: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20  ..........",.   
c830: 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d        iValue);.}
c840: 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72  ../* The main pr
c850: 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68  ogram.  Parse th
c860: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
c870: 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69  nd do it... */.i
c880: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
c890: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b  , char **argv).{
c8a0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65  .  static int ve
c8b0: 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61  rsion = 0;.  sta
c8c0: 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d  tic int rpflag =
c8d0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
c8e0: 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a   basisflag = 0;.
c8f0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d    static int com
c900: 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61  press = 0;.  sta
c910: 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20  tic int quiet = 
c920: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
c930: 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a  statistics = 0;.
c940: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66    static int mhf
c950: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
c960: 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66  c int nolinenosf
c970: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
c980: 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d  c int noResort =
c990: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   0;.  static str
c9a0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70  uct s_options op
c9b0: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  tions[] = {.    
c9c0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20  {OPT_FLAG, "b", 
c9d0: 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61  (char*)&basisfla
c9e0: 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74  g, "Print only t
c9f0: 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f  he basis in repo
ca00: 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  rt."},.    {OPT_
ca10: 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72  FLAG, "c", (char
ca20: 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f  *)&compress, "Do
ca30: 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65  n't compress the
ca40: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d   action table."}
ca50: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
ca60: 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e   "D", (char*)han
ca70: 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44  dle_D_option, "D
ca80: 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20  efine an %ifdef 
ca90: 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f  macro."},.    {O
caa0: 50 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c  PT_FSTR, "f", 0,
cab0: 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61   "Ignored.  (Pla
cac0: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20  ceholder for -f 
cad0: 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73  compiler options
cae0: 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  .)"},.    {OPT_F
caf0: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
cb00: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
cb10: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
cb20: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
cb30: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c   {OPT_FSTR, "I",
cb40: 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28   0, "Ignored.  (
cb50: 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  Placeholder for 
cb60: 27 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70  '-I' compiler op
cb70: 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b  tions.)"},.    {
cb80: 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28  OPT_FLAG, "m", (
cb90: 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22  char*)&mhflag, "
cba0: 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61  Output a makehea
cbb0: 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  ders compatible 
cbc0: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
cbd0: 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68  T_FLAG, "l", (ch
cbe0: 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  ar*)&nolinenosfl
cbf0: 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e  ag, "Do not prin
cc00: 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e  t #line statemen
cc10: 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ts."},.    {OPT_
cc20: 46 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49  FSTR, "O", 0, "I
cc30: 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68  gnored.  (Placeh
cc40: 6f 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63  older for '-O' c
cc50: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
cc60: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
cc70: 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29  AG, "p", (char*)
cc80: 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43  &showPrecedenceC
cc90: 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20  onflict,.       
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68               "Sh
ccb0: 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73  ow conflicts res
ccc0: 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65  olved by precede
ccd0: 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20  nce rules"},.   
cce0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c   {OPT_FLAG, "q",
ccf0: 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20   (char*)&quiet, 
cd00: 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70  "(Quiet) Don't p
cd10: 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20  rint the report 
cd20: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
cd30: 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68  T_FLAG, "r", (ch
cd40: 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22  ar*)&noResort, "
cd50: 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72  Do not sort or r
cd60: 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d  enumber states"}
cd70: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
cd80: 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74   "s", (char*)&st
cd90: 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20  atistics,.      
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72               "Pr
cdc0: 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73  int parser stats
cdd0: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
cde0: 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  put."},.    {OPT
cdf0: 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61  _FLAG, "x", (cha
ce00: 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72  r*)&version, "Pr
ce10: 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20  int the version 
ce20: 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b  number."},.    {
ce30: 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28  OPT_FSTR, "T", (
ce40: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f  char*)handle_T_o
ce50: 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20  ption, "Specify 
ce60: 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e  a template file.
ce70: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
ce80: 52 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f  R, "W", 0, "Igno
ce90: 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64  red.  (Placehold
cea0: 65 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70  er for '-W' comp
ceb0: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d  iler options.)"}
cec0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
ced0: 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0,0,0}.  };.  in
cee0: 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63  t i;.  int exitc
cef0: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65  ode;.  struct le
cf00: 6d 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63  mon lem;.  struc
cf10: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f  t rule *rp;..  O
cf20: 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69  ptInit(argv,opti
cf30: 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69  ons,stderr);.  i
cf40: 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20  f( version ){.  
cf50: 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e     printf("Lemon
cf60: 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29   version 1.0\n")
cf70: 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  ;.     exit(0);.
cf80: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
cf90: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
cfa0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
cfb0: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
cfc0: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
cfd0: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
cfe0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
cff0: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
d000: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
d010: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
d020: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
d030: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
d040: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
d050: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
d060: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
d070: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
d080: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
d090: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
d0a0: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
d0b0: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
d0c0: 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c  sflag;.  lem.nol
d0d0: 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c  inenosflag = nol
d0e0: 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79  inenosflag;.  Sy
d0f0: 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20  mbol_new("$");. 
d100: 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79   lem.errsym = Sy
d110: 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22  mbol_new("error"
d120: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d  );.  lem.errsym-
d130: 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20  >useCnt = 0;..  
d140: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
d150: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72  ut file */.  Par
d160: 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20  se(&lem);.  if( 
d170: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65  lem.errorcnt ) e
d180: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
d190: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75  );.  if( lem.nru
d1a0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
d1b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70  intf(stderr,"Emp
d1c0: 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b  ty grammar.\n");
d1d0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
d1e0: 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e  }..  /* Count an
d1f0: 64 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62  d index the symb
d200: 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ols of the gramm
d210: 61 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e  ar */.  Symbol_n
d220: 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
d230: 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d  .  lem.nsymbol =
d240: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b   Symbol_count();
d250: 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d  .  lem.symbols =
d260: 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28   Symbol_arrayof(
d270: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
d280: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
d290: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
d2a0: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
d2b0: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
d2c0: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a  ,lem.nsymbol,siz
d2d0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
d2e0: 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29  l*), Symbolcmpp)
d2f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d300: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d310: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d320: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68  >index = i;.  wh
d330: 69 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  ile( lem.symbols
d340: 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c  [i-1]->type==MUL
d350: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d  TITERMINAL ){ i-
d360: 2d 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  -; }.  assert( s
d370: 74 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c  trcmp(lem.symbol
d380: 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64  s[i-1]->name,"{d
d390: 65 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a  efault}")==0 );.
d3a0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d3b0: 69 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31  i - 1;.  for(i=1
d3c0: 3b 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79  ; ISUPPER(lem.sy
d3d0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
d3e0: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
d3f0: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
d400: 20 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75    /* Assign sequ
d410: 65 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62  ential rule numb
d420: 65 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68  ers.  Start with
d430: 20 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74   0.  Put rules t
d440: 68 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a  hat have no.  **
d450: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43   reduce action C
d460: 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64  -code associated
d470: 20 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c   with them last,
d480: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69   so that the swi
d490: 74 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65  tch().  ** state
d4a0: 6d 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74  ment that select
d4b0: 73 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69  s reduction acti
d4c0: 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20  ons will have a 
d4d0: 73 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62  smaller jump tab
d4e0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
d4f0: 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b  =0, rp=lem.rule;
d500: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
d510: 29 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65  ){.    rp->iRule
d520: 20 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b   = rp->code ? i+
d530: 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f  + : -1;.  }.  fo
d540: 72 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72  r(rp=lem.rule; r
d550: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
d560: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75  .    if( rp->iRu
d570: 6c 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65  le<0 ) rp->iRule
d580: 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65   = i++;.  }.  le
d590: 6d 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65  m.startRule = le
d5a0: 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75  m.rule;.  lem.ru
d5b0: 6c 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c  le = Rule_sort(l
d5c0: 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20  em.rule);..  /* 
d5d0: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69  Generate a repri
d5e0: 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  nt of the gramma
d5f0: 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  r, if requested 
d600: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
d610: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66  ine */.  if( rpf
d620: 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69  lag ){.    Repri
d630: 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73  nt(&lem);.  }els
d640: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
d650: 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f  lize the size fo
d660: 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64  r all follow and
d670: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
d680: 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e     SetSize(lem.n
d690: 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20  terminal+1);..  
d6a0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72    /* Find the pr
d6b0: 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65  ecedence for eve
d6c0: 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ry production ru
d6d0: 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65  le (that has one
d6e0: 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c  ) */.    FindRul
d6f0: 65 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65  ePrecedences(&le
d700: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
d710: 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e  ute the lambda-n
d720: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  onterminals and 
d730: 74 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66  the first-sets f
d740: 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20  or every.    ** 
d750: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20  nonterminal */. 
d760: 20 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73     FindFirstSets
d770: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
d780: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
d790: 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20  ) states.  Also 
d7a0: 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65  record follow-se
d7b0: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20  t propagation.  
d7c0: 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68    ** links so th
d7d0: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  at the follow-se
d7e0: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  t can be compute
d7f0: 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c  d later */.    l
d800: 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20  em.nstate = 0;. 
d810: 20 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c     FindStates(&l
d820: 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72  em);.    lem.sor
d830: 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61  ted = State_arra
d840: 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  yof();..    /* T
d850: 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73  ie up loose ends
d860: 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74   on the propagat
d870: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20  ion links */.   
d880: 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29   FindLinks(&lem)
d890: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
d8a0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74  e the follow set
d8b0: 20 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69   of every reduci
d8c0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
d8d0: 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c  n */.    FindFol
d8e0: 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  lowSets(&lem);..
d8f0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
d900: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
d910: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69   */.    FindActi
d920: 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ons(&lem);..    
d930: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20  /* Compress the 
d940: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
d950: 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73  .    if( compres
d960: 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54  s==0 ) CompressT
d970: 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ables(&lem);..  
d980: 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64    /* Reorder and
d990: 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74   renumber the st
d9a0: 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
d9b0: 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
d9c0: 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63  hoices.    ** oc
d9d0: 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
d9e0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
d9f0: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65  mization that he
da00: 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  lps make the.   
da10: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61   ** generated pa
da20: 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c  rser tables smal
da30: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ler. */.    if( 
da40: 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65  noResort==0 ) Re
da50: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
da60: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
da70: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
da80: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
da90: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
daa0: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
dab0: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
dac0: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
dad0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
dae0: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
daf0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
db00: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
db10: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
db20: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
db30: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
db40: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
db50: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
db60: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
db70: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
db80: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
db90: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
dba0: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
dbb0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
dbc0: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
dbd0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
dbe0: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
dbf0: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
dc00: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
dc10: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
dc20: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c  ser statistics:\
dc30: 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  n");.    stats_l
dc40: 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79  ine("terminal sy
dc50: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72  mbols", lem.nter
dc60: 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74  minal);.    stat
dc70: 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d  s_line("non-term
dc80: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  inal symbols", l
dc90: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
dca0: 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20  .nterminal);.   
dcb0: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74   stats_line("tot
dcc0: 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d  al symbols", lem
dcd0: 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73  .nsymbol);.    s
dce0: 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73  tats_line("rules
dcf0: 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  ", lem.nrule);. 
dd00: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73     stats_line("s
dd10: 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74  tates", lem.nxst
dd20: 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  ate);.    stats_
dd30: 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22  line("conflicts"
dd40: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
dd50: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
dd60: 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65  ("action table e
dd70: 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63  ntries", lem.nac
dd80: 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74  tiontab);.    st
dd90: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
dda0: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
ddb0: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
ddc0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
ddd0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
dde0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
ddf0: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
de00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
de10: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
de20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
de30: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
de40: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
de50: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
de60: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
de70: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
de80: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
de90: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
dea0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
deb0: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
dec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ded0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
dee0: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
def0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
df10: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
df20: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
df30: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
df40: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
df50: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
df60: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
df70: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
df80: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
df90: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
dfa0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
dfb0: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
dfc0: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
dfd0: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
dfe0: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
dff0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
e000: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
e010: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
e020: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
e030: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
e040: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
e050: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
e060: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
e070: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
e080: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
e090: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
e0a0: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
e0b0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
e0c0: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
e0d0: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
e0e0: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
e0f0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
e100: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
e110: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
e120: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
e130: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
e140: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
e150: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
e160: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
e170: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
e180: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
e190: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e1a0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
e1b0: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
e1c0: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
e1d0: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
e1e0: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
e1f0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
e200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e210: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e220: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
e230: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
e240: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
e250: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
e260: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
e270: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
e280: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
e290: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
e2a0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
e2b0: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
e2c0: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
e2d0: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
e2e0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
e2f0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
e300: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
e310: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
e320: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
e330: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
e340: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
e350: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
e360: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
e370: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
e380: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
e390: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
e3a0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
e3b0: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
e3c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
e3d0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
e3e0: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
e3f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
e400: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
e410: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
e420: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
e430: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
e440: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
e450: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
e460: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
e470: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
e480: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
e490: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
e4a0: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
e4b0: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
e4c0: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
e4d0: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
e4e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
e4f0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
e500: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e510: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
e520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
e530: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
e540: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
e550: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
e560: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
e570: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
e580: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
e590: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
e5a0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
e5b0: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
e5c0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
e5d0: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
e5e0: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
e5f0: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
e600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
e610: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
e620: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
e630: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
e640: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e650: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
e660: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
e670: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
e680: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
e690: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
e6a0: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
e6b0: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
e6c0: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
e6d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
e6e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
e6f0: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
e700: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
e710: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
e720: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
e730: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
e740: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
e750: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
e760: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
e770: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
e780: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
e790: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
e7a0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
e7b0: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
e7c0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
e7d0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
e7e0: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
e7f0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
e800: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
e810: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
e820: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
e830: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
e840: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
e850: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
e860: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
e870: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e880: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
e890: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
e8a0: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
e8b0: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
e8c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
e8d0: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
e8e0: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
e8f0: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
e900: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
e910: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
e920: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
e930: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
e940: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
e950: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
e960: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
e970: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
e980: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
e990: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
e9a0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
e9b0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
e9c0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
e9d0: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
e9e0: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
e9f0: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
ea00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
ea10: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
ea20: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
ea30: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
ea40: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
ea50: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
ea60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea70: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ea80: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
ea90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaa0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
eab0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
eac0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
ead0: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
eae0: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
eaf0: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
eb00: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
eb10: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
eb20: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
eb30: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
eb40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
eb50: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
eb60: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
eb70: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
eb80: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
eb90: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
eba0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
ebb0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
ebc0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
ebd0: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
ebe0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
ebf0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
ec00: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
ec10: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
ec20: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
ec30: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
ec40: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
ec50: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
ec60: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
ec70: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
ec80: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
ec90: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
eca0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
ecb0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
ecc0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
ecd0: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
ece0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ecf0: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
ed00: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
ed10: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
ed20: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
ed30: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
ed40: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
ed50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
ed60: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
ed70: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
ed80: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
ed90: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
eda0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
edb0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
edc0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
edd0: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
ede0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
edf0: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
ee00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
ee10: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ee20: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
ee30: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
ee40: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
ee50: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
ee60: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
ee70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee80: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
ee90: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
eea0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
eeb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
eec0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
eed0: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
eee0: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
eef0: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
ef00: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
ef10: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
ef20: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
ef30: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
ef40: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
ef50: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
ef60: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
ef70: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
ef80: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
ef90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
efa0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
efb0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
efc0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
efd0: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
efe0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
eff0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
f000: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
f010: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
f020: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
f030: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f040: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
f050: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
f060: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f070: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
f080: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
f090: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
f0a0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
f0b0: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
f0c0: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
f0d0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f0e0: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
f0f0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
f100: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
f110: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f120: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
f130: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
f140: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
f150: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f160: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
f170: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
f180: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
f190: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
f1a0: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
f1b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f1c0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
f1d0: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
f1e0: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
f1f0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
f200: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
f210: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
f220: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
f230: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
f240: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
f250: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
f260: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
f270: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f280: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
f290: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
f2a0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
f2b0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
f2c0: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
f2d0: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
f2e0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
f2f0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
f300: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
f310: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
f320: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
f330: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
f340: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
f350: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
f360: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
f370: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
f380: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
f390: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
f3a0: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
f3b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
f3c0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
f3d0: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
f3e0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
f3f0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
f400: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
f410: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
f420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
f430: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
f440: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
f450: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
f460: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
f470: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
f480: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f490: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
f4a0: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
f4b0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
f4c0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
f4d0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f4e0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
f4f0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
f500: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
f510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f520: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
f530: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
f540: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
f550: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
f560: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
f570: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
f580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
f590: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
f5b0: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
f5c0: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
f5d0: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
f5e0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
f5f0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
f600: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
f610: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
f620: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
f630: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
f640: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
f650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f660: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
f670: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
f680: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
f690: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
f6a0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
f6b0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
f6c0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
f6d0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
f6e0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
f6f0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
f700: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
f710: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
f720: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f730: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
f740: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
f750: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
f760: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
f770: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
f780: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f790: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
f7a0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
f7b0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f7c0: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
f7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f7e0: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
f7f0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f800: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f810: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f820: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
f830: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f840: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
f850: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
f860: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
f870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f880: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
f890: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
f8a0: 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
f8b0: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
f8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f8d0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f8e0: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
f8f0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
f900: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f910: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f920: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
f930: 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
f940: 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
f950: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f960: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f970: 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
f980: 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
f990: 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
f9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f9b0: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
f9c0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
f9d0: 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
f9e0: 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
f9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fa00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
fa10: 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
fa20: 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
fa30: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
fa40: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
fa50: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
fa60: 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
fa70: 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
fa80: 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
fa90: 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
faa0: 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
fab0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
fac0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
fad0: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
fae0: 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
faf0: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
fb00: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
fb10: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
fb20: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
fb30: 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
fb40: 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
fb50: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
fb60: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
fb70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fb80: 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
fb90: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
fba0: 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
fbb0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
fbc0: 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
fbd0: 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
fbe0: 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
fbf0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
fc00: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
fc10: 74 4e 41 72 67 73 28 76 6f 69 64 29 7b 0a 20 20  tNArgs(void){.  
fc20: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
fc30: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
fc40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
fc50: 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b  argv!=0 && argv[
fc60: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  0]!=0 ){.    for
fc70: 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
fc80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
fc90: 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
fca0: 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74  T(argv[i]) ) cnt
fcb0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
fcc0: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
fcd0: 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
fce0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
fcf0: 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a    return cnt;.}.
fd00: 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69 6e  .char *OptArg(in
fd10: 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
fd20: 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
fd30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30  );.  return i>=0
fd40: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a   ? argv[i] : 0;.
fd50: 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 69  }..void OptErr(i
fd60: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
fd70: 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
fd80: 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  n);.  if( i>=0 )
fd90: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
fda0: 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64  stream);.}..void
fdb0: 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 7b   OptPrint(void){
fdc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
fdd0: 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
fde0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
fdf0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
fe00: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  ){.    len = lem
fe10: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
fe20: 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73  abel) + 1;.    s
fe30: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
fe40: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
fe50: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
fe60: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
fe70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fe80: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
fe90: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
fea0: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
feb0: 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20  len += 9;       
fec0: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69  /* length of "<i
fed0: 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20  nteger>" */.    
fee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fef0: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
ff00: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
ff10: 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  BL:.        len 
ff20: 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 6;       /* l
ff30: 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e  ength of "<real>
ff40: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
ff50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
ff60: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
ff70: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
ff80: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20       len += 8;  
ff90: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
ffa0: 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a  f "<string>" */.
ffb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ffc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e     }.    if( len
ffd0: 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e  >max ) max = len
ffe0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
fff0: 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
10000 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
10010 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
10020 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
10030 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
10040 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
10050 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
10060 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c  am,"  -%-*s  %s\
10070 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62  n",max,op[i].lab
10080 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  el,op[i].message
10090 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
100a0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
100b0 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
100c0 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
100d0 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
100e0 72 65 61 6d 2c 22 20 20 2d 25 73 3c 69 6e 74 65  ream,"  -%s<inte
100f0 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ger>%*s  %s\n",o
10100 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10110 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10120 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10130 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f  ].label)-9),"",o
10140 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
10150 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10160 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
10170 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10180 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66  _FDBL:.        f
10190 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
101a0 2c 22 20 20 2d 25 73 3c 72 65 61 6c 3e 25 2a 73  ,"  -%s<real>%*s
101b0 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
101c0 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
101d0 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
101e0 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
101f0 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-6),"",op[i].me
10200 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
10210 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10220 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
10230 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
10240 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
10250 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
10260 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
10270 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
10280 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
10290 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
102a0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
102b0 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
102c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
102d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
10300 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
10330 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
10340 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
10350 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10360 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
10370 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10380 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74  ser */.enum e_st
10390 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49  ate {.  INITIALI
103a0 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ZE,.  WAITING_FO
103b0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
103c0 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
103d0 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41  CL_KEYWORD,.  WA
103e0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
103f0 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RG,.  WAITING_FO
10400 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
10410 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
10420 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52  OR_ARROW,.  IN_R
10430 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  HS,.  LHS_ALIAS_
10440 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  1,.  LHS_ALIAS_2
10450 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c  ,.  LHS_ALIAS_3,
10460 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  RHS_ALIAS_1,.
10470 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    RHS_ALIAS_2,. 
10480 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
10490 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _1,.  PRECEDENCE
104a0 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e  _MARK_2,.  RESYN
104b0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
104c0 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  OR,.  RESYNC_AFT
104d0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20  ER_DECL_ERROR,. 
104e0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
104f0 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
10500 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
10510 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
10520 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
10530 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54  LBACK_ID,.  WAIT
10540 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
10550 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10560 4f 52 5f 43 4c 41 53 53 5f 49 44 2c 0a 20 20 57  OR_CLASS_ID,.  W
10570 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
10580 5f 54 4f 4b 45 4e 0a 7d 3b 0a 73 74 72 75 63 74  _TOKEN.};.struct
10590 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72   pstate {.  char
105a0 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
105b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
105c0 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
105d0 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f   int tokenlineno
105e0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75  ;      /* Linenu
105f0 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75  mber at which cu
10600 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72  rrent token star
10610 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ts */.  int erro
10620 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rcnt;         /*
10630 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
10640 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  s so far */.  ch
10650 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20  ar *tokenstart; 
10660 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63      /* Text of c
10670 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  urrent token */.
10680 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
10690 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  gp;     /* Globa
106a0 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a  l state vector *
106b0 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65  /.  enum e_state
106c0 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 2f   state;        /
106d0 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
106e0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73  he parser */.  s
106f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
10700 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65  llback;   /* The
10710 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
10720 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
10730 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b 20 20 20 20  ol *tkclass;    
10740 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61 73 73 20 73  /* Token class s
10750 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63  ymbol */.  struc
10760 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
10770 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
10780 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65  nd side of curre
10790 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e  nt rule */.  con
107a0 73 74 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61  st char *lhsalia
107b0 73 3b 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s;      /* Alias
107c0 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a   for the LHS */.
107d0 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107f0 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  Number of right-
10800 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c  hand side symbol
10810 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75  s seen */.  stru
10820 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d  ct symbol *rhs[M
10830 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20  AXRHS];  /* RHS 
10840 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e  symbols */.  con
10850 73 74 20 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d  st char *alias[M
10860 41 58 52 48 53 5d 3b 20 2f 2a 20 41 6c 69 61 73  AXRHS]; /* Alias
10870 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  es for each RHS 
10880 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29  symbol (or NULL)
10890 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
108a0 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20  e *prevrule;    
108b0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c   /* Previous rul
108c0 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 6f  e parsed */.  co
108d0 6e 73 74 20 63 68 61 72 20 2a 64 65 63 6c 6b 65  nst char *declke
108e0 79 77 6f 72 64 3b 20 20 20 2f 2a 20 4b 65 79 77  yword;   /* Keyw
108f0 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61  ord of a declara
10900 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
10910 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20  *declargslot;   
10920 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
10930 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
10940 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
10950 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 6e   put */.  int in
10960 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20 20  sertLineMacro;  
10970 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69 6e       /* Add #lin
10980 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72 61  e before declara
10990 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  tion insert */. 
109a0 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f   int *decllineno
109b0 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20 57  slot;       /* W
109c0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 64 65  here to write de
109d0 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20 6e  claration line n
109e0 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  umber */.  enum 
109f0 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f  e_assoc declasso
10a00 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  c;    /* Assign 
10a10 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e  this association
10a20 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
10a30 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  ts */.  int prec
10a40 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
10a50 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
10a60 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  s precedence to 
10a70 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
10a80 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
10a90 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f  *firstrule;    /
10aa0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
10ab0 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  st rule in the g
10ac0 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75  rammar */.  stru
10ad0 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c  ct rule *lastrul
10ae0 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
10af0 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  r to the most re
10b00 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75  cently parsed ru
10b10 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72  le */.};../* Par
10b20 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  se a single toke
10b30 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
10b40 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 73   parseonetoken(s
10b50 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73  truct pstate *ps
10b60 70 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p).{.  const cha
10b70 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73  r *x;.  x = Strs
10b80 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74  afe(psp->tokenst
10b90 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76  art);     /* Sav
10ba0 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d  e the token perm
10bb0 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30  anently */.#if 0
10bc0 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64  .  printf("%s:%d
10bd0 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61  : Token=[%s] sta
10be0 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69  te=%d\n",psp->fi
10bf0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10c00 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70  nlineno,.    x,p
10c10 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64  sp->state);.#end
10c20 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73 70  if.  switch( psp
10c30 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
10c40 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a  ase INITIALIZE:.
10c50 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
10c60 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
10c70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20  sp->preccounter 
10c80 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
10c90 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d  firstrule = psp-
10ca0 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20  >lastrule = 0;. 
10cb0 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72       psp->gp->nr
10cc0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f  ule = 0;.      /
10cd0 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e  * Fall thru to n
10ce0 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
10cf0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
10d00 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20  _DECL_OR_RULE:. 
10d10 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
10d20 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  %' ){.        ps
10d30 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
10d40 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
10d50 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ORD;.      }else
10d60 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b 30   if( ISLOWER(x[0
10d70 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
10d80 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f  p->lhs = Symbol_
10d90 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
10da0 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20  psp->nrhs = 0;. 
10db0 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
10dc0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
10dd0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
10de0 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
10df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10e00 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20  ( x[0]=='{' ){. 
10e10 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
10e20 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
10e30 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
10e40 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10e50 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10e60 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70  ,."There is no p
10e70 72 69 6f 72 20 72 75 6c 65 20 75 70 6f 6e 20 77  rior rule upon w
10e80 68 69 63 68 20 74 6f 20 61 74 74 61 63 68 20 74  hich to attach t
10e90 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65  he code \.fragme
10ea0 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  nt which begins 
10eb0 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b  on this line.");
10ec0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10ed0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10ee0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
10ef0 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
10f00 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
10f10 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10f20 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10f30 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65  kenlineno,."Code
10f40 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e   fragment beginn
10f50 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
10f60 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
10f70 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
10f80 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
10f90 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
10fa0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10fb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10fc0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
10fd0 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73  vrule->line = ps
10fe0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
10ff0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11000 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20  revrule->code = 
11010 26 78 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  &x[1];.         
11020 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
11030 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  noCode = 0;.    
11040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11050 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20  e if( x[0]=='[' 
11060 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11070 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e  state = PRECEDEN
11080 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20  CE_MARK_1;.     
11090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
110a0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
110b0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
110c0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
110d0 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22     "Token \"%s\"
110e0 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65   should be eithe
110f0 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f  r \"%%\" or a no
11100 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22  nterminal name."
11110 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a  ,.          x);.
11120 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11130 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
11140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11150 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
11160 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20  E_MARK_1:.      
11170 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30  if( !ISUPPER(x[0
11180 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
11190 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
111a0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
111b0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
111c0 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65   "The precedence
111d0 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20   symbol must be 
111e0 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20  a terminal.");. 
111f0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11200 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11210 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
11220 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  vrule==0 ){.    
11230 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11240 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11250 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11260 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73         "There is
11270 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74   no prior rule t
11280 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65  o assign precede
11290 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78  nce \"[%s]\".",x
112a0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
112b0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
112c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
112d0 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
112e0 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ym!=0 ){.       
112f0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11300 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11310 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65  enlineno,."Prece
11320 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68  dence mark on th
11330 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
11340 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
11350 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
11360 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
11370 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11380 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
11390 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72  .        psp->pr
113a0 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20  evrule->precsym 
113b0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
113c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
113d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
113e0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20  EDENCE_MARK_2;. 
113f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11400 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f  case PRECEDENCE_
11410 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66  MARK_2:.      if
11420 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20  ( x[0]!=']' ){. 
11430 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11440 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11450 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11460 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
11470 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63  ng \"]\" on prec
11480 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a  edence mark.");.
11490 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
114a0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
114b0 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
114c0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
114d0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
114e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
114f0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11500 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28  ARROW:.      if(
11510 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[0]==':' && x[
11520 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d  1]==':' && x[2]=
11530 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
11540 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
11550 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
11560 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29   if( x[0]=='(' )
11570 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11580 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
11590 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
115a0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
115b0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
115c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
115d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70  ,.          "Exp
115e0 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c  ected to see a \
115f0 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ":\" following t
11600 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he LHS symbol \"
11610 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
11620 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65    psp->lhs->name
11630 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11640 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11650 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11660 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
11670 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
11680 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11690 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
116a0 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 49  S_1:.      if( I
116b0 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
116c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
116d0 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20  alias = x;.     
116e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
116f0 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  LHS_ALIAS_2;.   
11700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11710 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11720 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11730 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11740 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
11750 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
11760 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22  s for the LHS \"
11770 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
11780 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e     x,psp->lhs->n
11790 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
117a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
117b0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
117c0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
117d0 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
117e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
117f0 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
11800 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
11810 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
11820 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11830 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b  e = LHS_ALIAS_3;
11840 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11850 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11860 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11870 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11880 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
11890 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
118a0 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
118b0 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
118c0 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
118d0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
118e0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
118f0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11900 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11920 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
11930 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20  HS_ALIAS_3:.    
11940 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20    if( x[0]==':' 
11950 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  && x[1]==':' && 
11960 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20  x[2]=='=' ){.   
11970 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11980 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
11990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
119a0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
119b0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
119c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
119d0 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c    "Missing \"->\
119e0 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25  " following: \"%
119f0 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20  s(%s)\".",.     
11a00 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
11a10 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  name,psp->lhsali
11a20 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
11a30 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11a40 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11a50 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11a60 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
11a70 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11a80 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53  .    case IN_RHS
11a90 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11aa0 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
11ab0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
11ac0 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28  ;.        rp = (
11ad0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61  struct rule *)ca
11ae0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
11af0 75 63 74 20 72 75 6c 65 29 20 2b 0a 20 20 20 20  uct rule) +.    
11b00 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11b10 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
11b20 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
11b30 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
11b40 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rhs, 1);.       
11b50 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20   if( rp==0 ){.  
11b60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11b70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11b80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
11ba0 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f  n't allocate eno
11bb0 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ugh memory for t
11bc0 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  his rule.");.   
11bd0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11be0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11bf0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
11c00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
11c10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
11c20 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
11c30 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
11c40 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
11c50 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
11c60 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
11c70 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
11c80 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
11c90 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ias = (const cha
11ca0 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
11cb0 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
11cc0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11cd0 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
11ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
11cf0 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
11d00 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
11d10 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
11d20 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
11d30 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i];.          }.
11d40 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
11d50 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
11d60 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
11d70 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
11d80 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
11d90 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
11da0 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
11db0 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
11dc0 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 6f 43 6f          rp->noCo
11dd0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
11de0 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
11df0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
11e00 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70  >index = psp->gp
11e10 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20  ->nrule++;.     
11e20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73       rp->nextlhs
11e30 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65   = rp->lhs->rule
11e40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
11e50 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a  lhs->rule = rp;.
11e60 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65            rp->ne
11e70 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
11e80 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74    if( psp->first
11e90 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
11ea0 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73         psp->firs
11eb0 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
11ec0 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20  trule = rp;.    
11ed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11ee0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
11ef0 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72  strule->next = r
11f00 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p;.            p
11f10 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
11f20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
11f30 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
11f40 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  evrule = rp;.   
11f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11f60 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11f70 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
11f80 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
11f90 65 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b  e if( ISALPHA(x[
11fa0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0]) ){.        i
11fb0 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41  f( psp->nrhs>=MA
11fc0 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20 20  XRHS ){.        
11fd0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11fe0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11ff0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12000 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79         "Too many
12010 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20   symbols on RHS 
12020 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e  of rule beginnin
12030 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  g at \"%s\".",. 
12040 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20             x);. 
12050 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
12060 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12070 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12080 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
12090 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
120a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
120b0 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
120c0 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f  >nrhs] = Symbol_
120d0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
120e0 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
120f0 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20  ->nrhs] = 0;.   
12100 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
12110 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
12120 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 78      }else if( (x
12130 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d  [0]=='|' || x[0]
12140 3d 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e  =='/') && psp->n
12150 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rhs>0 ){.       
12160 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12170 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70  msp = psp->rhs[p
12180 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20  sp->nrhs-1];.   
12190 20 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74 79       if( msp->ty
121a0 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe!=MULTITERMINA
121b0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  L ){.          s
121c0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72  truct symbol *or
121d0 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20  igsp = msp;.    
121e0 20 20 20 20 20 20 6d 73 70 20 3d 20 28 73 74 72        msp = (str
121f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 20 63 61  uct symbol *) ca
12200 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d  lloc(1,sizeof(*m
12210 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sp));.          
12220 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20 73  memset(msp, 0, s
12230 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20  izeof(*msp));.  
12240 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79 70          msp->typ
12250 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
12260 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  L;.          msp
12270 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20  ->nsubsym = 1;. 
12280 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75           msp->su
12290 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
122a0 79 6d 62 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63  ymbol **) calloc
122b0 28 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74  (1,sizeof(struct
122c0 20 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20   symbol*));.    
122d0 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
122e0 6d 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20  m[0] = origsp;. 
122f0 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61           msp->na
12300 6d 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d  me = origsp->nam
12310 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e;.          psp
12320 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
12330 31 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20  1] = msp;.      
12340 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d    }.        msp-
12350 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20  >nsubsym++;.    
12360 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20      msp->subsym 
12370 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
12380 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70   **) realloc(msp
12390 2d 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20 20 20  ->subsym,.      
123a0 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63      sizeof(struc
123b0 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e  t symbol*)*msp->
123c0 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20  nsubsym);.      
123d0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73    msp->subsym[ms
123e0 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20  p->nsubsym-1] = 
123f0 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d  Symbol_new(&x[1]
12400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
12410 53 4c 4f 57 45 52 28 78 5b 31 5d 29 20 7c 7c 20  SLOWER(x[1]) || 
12420 49 53 4c 4f 57 45 52 28 6d 73 70 2d 3e 73 75 62  ISLOWER(msp->sub
12430 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29  sym[0]->name[0])
12440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
12450 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
12460 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
12470 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12480 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20     "Cannot form 
12490 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61  a compound conta
124a0 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d  ining a non-term
124b0 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  inal");.        
124c0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
124d0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
124e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
124f0 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e  ]=='(' && psp->n
12500 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rhs>0 ){.       
12510 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48   psp->state = RH
12520 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
12530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12540 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12550 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12560 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12570 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72     "Illegal char
12580 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20  acter on RHS of 
12590 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78  rule: \"%s\".",x
125a0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
125b0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
125c0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
125d0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
125e0 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
125f0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12600 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
12610 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 49  S_1:.      if( I
12620 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
12630 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
12640 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20  as[psp->nrhs-1] 
12650 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
12660 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c  ->state = RHS_AL
12670 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
12680 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12690 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
126a0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
126b0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
126c0 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
126d0 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
126e0 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c  the RHS symbol \
126f0 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
12700 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70      x,psp->rhs[p
12710 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d  sp->nrhs-1]->nam
12720 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
12730 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12740 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12750 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
12760 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
12770 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12780 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
12790 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_2:.      if( 
127a0 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20  x[0]==')' ){.   
127b0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
127c0 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
127d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
127e0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
127f0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12800 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12810 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22    "Missing \")\"
12820 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61   following LHS a
12830 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22  lias name \"%s\"
12840 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  .",psp->lhsalias
12850 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12860 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12870 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12880 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
12890 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
128a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
128b0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
128c0 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44  FOR_DECL_KEYWORD
128d0 3a 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 4c  :.      if( ISAL
128e0 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
128f0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65       psp->declke
12900 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20  yword = x;.     
12910 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12920 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
12930 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12940 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
12950 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
12960 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20  eMacro = 1;.    
12970 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12980 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12990 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69  L_ARG;.        i
129a0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d  f( strcmp(x,"nam
129b0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
129c0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
129d0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
129e0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
129f0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
12a00 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
12a10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12a20 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65  trcmp(x,"include
12a30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12a40 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12a50 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12a60 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20 20  >include);.     
12a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12a80 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30  cmp(x,"code")==0
12a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12aa0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
12ab0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72   &(psp->gp->extr
12ac0 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  acode);.        
12ad0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12ae0 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75  (x,"token_destru
12af0 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
12b00 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12b10 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
12b20 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20  gp->tokendest;. 
12b30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12b40 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
12b50 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  lt_destructor")=
12b60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12b70 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12b80 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72   = &psp->gp->var
12b90 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  dest;.        }e
12ba0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12bb0 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29  ,"token_prefix")
12bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12bd0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12be0 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
12bf0 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20  kenprefix;.     
12c00 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
12c10 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
12c20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12c30 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61   strcmp(x,"synta
12c40 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a  x_error")==0 ){.
12c50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12c60 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
12c70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a  sp->gp->error);.
12c80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12c90 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
12ca0 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
12cb0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12cc0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12cd0 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
12ce0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12cf0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
12d00 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30  rse_failure")==0
12d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12d20 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
12d30 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c   &(psp->gp->fail
12d40 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ure);.        }e
12d50 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12d60 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77  ,"stack_overflow
12d70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12d80 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12d90 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12da0 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  >overflow);.    
12db0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12dc0 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72  rcmp(x,"extra_ar
12dd0 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20  gument")==0 ){. 
12de0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12df0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12e00 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20  p->gp->arg);.   
12e10 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
12e20 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12e30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12e40 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
12e50 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  en_type")==0 ){.
12e60 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12e70 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
12e80 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70  sp->gp->tokentyp
12e90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
12ea0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12eb0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
12ec0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12ed0 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65  (x,"default_type
12ee0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12ef0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12f00 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12f10 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20  >vartype);.     
12f20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
12f30 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
12f40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12f50 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
12f60 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
12f70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12f80 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
12f90 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  ->gp->stacksize)
12fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12fb0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
12fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
12fd0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12fe0 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29  ,"start_symbol")
12ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13000 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13010 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
13020 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tart);.         
13030 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
13040 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
13050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13060 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30  cmp(x,"left")==0
13070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13080 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
13090 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
130a0 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46  >declassoc = LEF
130b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
130c0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
130d0 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
130e0 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
130f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13100 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20  p(x,"right")==0 
13110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13120 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
13130 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13140 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48  declassoc = RIGH
13150 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
13160 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13170 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
13180 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
13190 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
131a0 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d  p(x,"nonassoc")=
131b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
131c0 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
131d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
131e0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e  p->declassoc = N
131f0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ONE;.          p
13200 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
13210 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
13220 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
13230 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13240 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74 6f  cmp(x,"destructo
13250 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
13260 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13270 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
13280 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a  TRUCTOR_SYMBOL;.
13290 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
132a0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65  ( strcmp(x,"type
132b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
132c0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
132d0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
132e0 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  TYPE_SYMBOL;.   
132f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13300 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63  trcmp(x,"fallbac
13310 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k")==0 ){.      
13320 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
13330 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
13340 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13350 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
13360 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  CK_ID;.        }
13370 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13380 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30  x,"wildcard")==0
13390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
133a0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
133b0 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f  NG_FOR_WILDCARD_
133c0 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
133d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
133e0 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29 3d 3d 30  token_class")==0
133f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13400 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13410 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 3b  NG_FOR_CLASS_ID;
13420 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13430 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
13440 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
13450 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
13460 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
13470 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74  Unknown declarat
13480 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
13490 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %%s\".",x);.    
134a0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
134b0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
134c0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
134d0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
134e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
134f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13500 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13510 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13520 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13530 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
13540 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
13550 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
13560 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13570 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13580 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13590 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
135a0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
135b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
135c0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
135d0 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
135e0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
135f0 28 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29  ( !ISALPHA(x[0])
13600 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13610 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13620 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
13630 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
13640 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
13650 69 6e 67 20 61 66 74 65 72 20 25 25 64 65 73 74  ing after %%dest
13660 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29  ructor keyword")
13670 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
13680 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13690 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
136a0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
136b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
136c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
136d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
136e0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
136f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
13700 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d  clargslot = &sp-
13710 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20  >destructor;.   
13720 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69       psp->declli
13730 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  nenoslot = &sp->
13740 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20  destLineno;.    
13750 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
13760 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20  ineMacro = 1;.  
13770 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13780 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
13790 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
137a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
137b0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
137c0 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
137d0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  OL:.      if( !I
137e0 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
137f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13800 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
13810 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13820 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
13830 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
13840 61 66 74 65 72 20 25 25 74 79 70 65 20 6b 65 79  after %%type key
13850 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
13860 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13870 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
13880 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
13890 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
138a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
138b0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
138c0 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  l *sp = Symbol_f
138d0 69 6e 64 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ind(x);.        
138e0 69 66 28 28 73 70 29 20 26 26 20 28 73 70 2d 3e  if((sp) && (sp->
138f0 64 61 74 61 74 79 70 65 29 29 7b 0a 20 20 20 20  datatype)){.    
13900 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13910 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13920 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13930 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62             "Symb
13940 6f 6c 20 25 25 74 79 70 65 20 5c 22 25 73 5c 22  ol %%type \"%s\"
13950 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
13960 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
13970 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
13980 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
13990 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
139a0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
139b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
139c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21  .          if (!
139d0 73 70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  sp){.           
139e0 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77   sp = Symbol_new
139f0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (x);.          }
13a00 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13a10 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73  declargslot = &s
13a20 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
13a30 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
13a40 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
13a50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13a60 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13a70 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
13a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13aa0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
13ab0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13ac0 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78  BOL:.      if( x
13ad0 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
13ae0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13af0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
13b00 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
13b10 20 7d 65 6c 73 65 20 69 66 28 20 49 53 55 50 50   }else if( ISUPP
13b20 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ER(x[0]) ){.    
13b30 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
13b40 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73  l *sp;.        s
13b50 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
13b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
13b70 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  p->prec>=0 ){.  
13b80 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13b90 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
13ba0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79  .            "Sy
13bc0 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20  mbol \"%s\" has 
13bd0 61 6c 72 65 61 64 79 20 62 65 20 67 69 76 65 6e  already be given
13be0 20 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c   a precedence.",
13bf0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13c00 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13c10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13c20 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
13c30 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
13c40 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
13c50 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
13c60 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20 20 20 20  declassoc;.     
13c70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
13c80 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
13c90 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
13ca0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
13cb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61  o,.          "Ca
13cc0 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65  n't assign a pre
13cd0 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c  cedence to \"%s\
13ce0 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
13cf0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13d10 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13d20 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
13d30 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ARG:.      if( x
13d40 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
13d50 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41 4c 4e 55  =='\"' || ISALNU
13d60 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  M(x[0]) ){.     
13d70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13d80 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  Old, *zNew;.    
13d90 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20      char *zBuf, 
13da0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *z;.        int 
13db0 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 20 3d  nOld, n, nLine =
13dc0 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b   0, nNew, nBack;
13dd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
13de0 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20 20 20 20  LineMacro;.     
13df0 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 35 30     char zLine[50
13e00 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 20  ];.        zNew 
13e10 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = x;.        if(
13e20 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c   zNew[0]=='"' ||
13e30 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27 20 29 20   zNew[0]=='{' ) 
13e40 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zNew++;.        
13e50 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  nNew = lemonStrl
13e60 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20  en(zNew);.      
13e70 20 20 69 66 28 20 2a 70 73 70 2d 3e 64 65 63 6c    if( *psp->decl
13e80 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20 20 20 20  argslot ){.     
13e90 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a 70 73 70       zOld = *psp
13ea0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 3b 0a 20  ->declargslot;. 
13eb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13ec0 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 22          zOld = "
13ed0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
13ee0 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f       nOld = lemo
13ef0 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20  nStrlen(zOld);. 
13f00 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64 20         n = nOld 
13f10 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20 20  + nNew + 20;.   
13f20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d 61 63 72       addLineMacr
13f30 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f  o = !psp->gp->no
13f40 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26 26 20 70  linenosflag && p
13f50 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
13f60 63 72 6f 20 26 26 0a 20 20 20 20 20 20 20 20 20  cro &&.         
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13f80 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
13f90 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e 64  lot==0 || psp->d
13fa0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d  ecllinenoslot[0]
13fb0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
13fc0 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29  ( addLineMacro )
13fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
13fe0 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  z=psp->filename,
13ff0 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b   nBack=0; *z; z+
14000 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
14010 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e  if( *z=='\\' ) n
14020 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Back++;.        
14030 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6c 65    }.          le
14040 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4c 69 6e  mon_sprintf(zLin
14050 65 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20  e, "#line %d ", 
14060 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69  );.          nLi
14080 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ne = lemonStrlen
14090 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
140a0 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20     n += nLine + 
140b0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d  lemonStrlen(psp-
140c0 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61  >filename) + nBa
140d0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
140e0 20 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c        *psp->decl
140f0 61 72 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20  argslot = (char 
14100 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d  *) realloc(*psp-
14110 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29  >declargslot, n)
14120 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d  ;.        zBuf =
14130 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
14140 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20  ot + nOld;.     
14150 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
14160 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
14170 20 69 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75   if( nOld && zBu
14180 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20  f[-1]!='\n' ){. 
14190 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75             *(zBu
141a0 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  f++) = '\n';.   
141b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
141c0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
141d0 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
141e0 20 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d           zBuf +=
141f0 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20   nLine;.        
14200 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
14210 27 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ';.          for
14220 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  (z=psp->filename
14230 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
14240 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
14250 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
14260 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14270 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20  = '\\';.        
14280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14290 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a    *(zBuf++) = *z
142a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
142b0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
142c0 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
142d0 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
142e0 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  \n';.        }. 
142f0 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
14300 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26  decllinenoslot &
14310 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  & psp->decllinen
14320 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20  oslot[0]==0 ){. 
14330 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
14340 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20  cllinenoslot[0] 
14350 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
14360 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
14370 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14380 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a  f, zNew, nNew);.
14390 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20          zBuf += 
143a0 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a  nNew;.        *z
143b0 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Buf = 0;.       
143c0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
143d0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
143e0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
143f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
14400 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14410 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
14420 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14430 22 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e  "Illegal argumen
14440 74 20 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70  t to %%%s: %s",p
14450 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c  sp->declkeyword,
14460 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14470 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
14480 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14490 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
144a0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
144b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
144c0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
144d0 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
144e0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
144f0 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
14500 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14510 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14520 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
14530 6c 73 65 20 69 66 28 20 21 49 53 55 50 50 45 52  lse if( !ISUPPER
14540 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
14550 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
14560 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
14570 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
14580 20 20 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63        "%%fallbac
14590 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c  k argument \"%s\
145a0 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f  " should be a to
145b0 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ken", x);.      
145c0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
145d0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
145e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
145f0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
14600 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
14610 20 20 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c     if( psp->fall
14620 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
14630 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61       psp->fallba
14640 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20  ck = sp;.       
14650 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66   }else if( sp->f
14660 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
14670 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14680 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14690 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
146a0 20 20 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65             "More
146b0 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61   than one fallba
146c0 63 6b 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ck assigned to t
146d0 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20  oken %s", x);.  
146e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
146f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
14700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14710 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d    sp->fallback =
14720 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a   psp->fallback;.
14730 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
14740 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
14750 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
14760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14770 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
14780 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52  TING_FOR_WILDCAR
14790 44 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  D_ID:.      if( 
147a0 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
147b0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
147c0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
147d0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
147e0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55    }else if( !ISU
147f0 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20  PPER(x[0]) ){.  
14800 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
14810 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73  sp->filename, ps
14820 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
14830 20 20 20 20 20 20 20 20 20 20 22 25 25 77 69 6c            "%%wil
14840 64 63 61 72 64 20 61 72 67 75 6d 65 6e 74 20 5c  dcard argument \
14850 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20  "%s\" should be 
14860 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20  a token", x);.  
14870 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
14880 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
14890 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
148a0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
148b0 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
148c0 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
148d0 67 70 2d 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20  gp->wildcard==0 
148e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
148f0 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d  ->gp->wildcard =
14900 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   sp;.        }el
14910 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72  se{.          Er
14920 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14930 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
14940 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14950 20 20 20 20 22 45 78 74 72 61 20 77 69 6c 64 63      "Extra wildc
14960 61 72 64 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73  ard to token: %s
14970 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
14980 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14990 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
149a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
149b0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
149c0 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 3a 0a  G_FOR_CLASS_ID:.
149d0 20 20 20 20 20 20 69 66 28 20 21 49 53 4c 4f 57        if( !ISLOW
149e0 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ER(x[0]) ){.    
149f0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
14a00 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
14a10 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
14a20 20 20 20 20 20 20 20 20 22 25 25 74 6f 6b 65 6e          "%%token
14a30 5f 63 6c 61 73 73 20 6d 75 73 74 20 62 65 20 66  _class must be f
14a40 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69 64  ollowed by an id
14a50 65 6e 74 69 66 69 65 72 3a 20 22 2c 20 78 29 3b  entifier: ", x);
14a60 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
14a70 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14a80 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
14a90 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
14aa0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 7d 65 6c  _ERROR;.     }el
14ab0 73 65 20 69 66 28 20 53 79 6d 62 6f 6c 5f 66 69  se if( Symbol_fi
14ac0 6e 64 28 78 29 20 29 7b 0a 20 20 20 20 20 20 20  nd(x) ){.       
14ad0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
14ae0 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
14af0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
14b00 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25       "Symbol \"%
14b10 73 5c 22 20 61 6c 72 65 61 64 79 20 75 73 65 64  s\" already used
14b20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14b30 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14b40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14b50 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14b60 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b80 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 20     psp->tkclass 
14b90 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
14ba0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
14bb0 63 6c 61 73 73 2d 3e 74 79 70 65 20 3d 20 4d 55  class->type = MU
14bc0 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
14bd0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14be0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c  = WAITING_FOR_CL
14bf0 41 53 53 5f 54 4f 4b 45 4e 3b 0a 20 20 20 20 20  ASS_TOKEN;.     
14c00 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14c10 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
14c20 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e  _FOR_CLASS_TOKEN
14c30 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
14c40 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
14c50 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14c60 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14c70 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
14c80 6c 73 65 20 69 66 28 20 49 53 55 50 50 45 52 28  lse if( ISUPPER(
14c90 78 5b 30 5d 29 20 7c 7c 20 28 28 78 5b 30 5d 3d  x[0]) || ((x[0]=
14ca0 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f  ='|' || x[0]=='/
14cb0 27 29 20 26 26 20 49 53 55 50 50 45 52 28 78 5b  ') && ISUPPER(x[
14cc0 31 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1])) ){.        
14cd0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d  struct symbol *m
14ce0 73 70 20 3d 20 70 73 70 2d 3e 74 6b 63 6c 61 73  sp = psp->tkclas
14cf0 73 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  s;.        msp->
14d00 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20  nsubsym++;.     
14d10 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
14d20 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
14d30 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d  **) realloc(msp-
14d40 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20 20 20 20  >subsym,.       
14d50 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
14d60 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e   symbol*)*msp->n
14d70 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20  subsym);.       
14d80 20 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b   if( !ISUPPER(x[
14d90 30 5d 29 20 29 20 78 2b 2b 3b 0a 20 20 20 20 20  0]) ) x++;.     
14da0 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
14db0 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
14dc0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
14dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14de0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14df0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14e00 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14e10 20 20 20 20 20 20 20 20 20 22 25 25 74 6f 6b 65           "%%toke
14e20 6e 5f 63 6c 61 73 73 20 61 72 67 75 6d 65 6e 74  n_class argument
14e30 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
14e40 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
14e50 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
14e60 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
14e70 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
14e80 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
14e90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
14ea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14eb0 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45  case RESYNC_AFTE
14ec0 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a  R_RULE_ERROR:./*
14ed0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
14ee0 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
14ef0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
14f00 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20  ECL_OR_RULE;.** 
14f10 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20       break; */. 
14f20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41     case RESYNC_A
14f30 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a  FTER_DECL_ERROR:
14f40 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
14f50 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74  ='.' ) psp->stat
14f60 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14f70 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14f80 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25      if( x[0]=='%
14f90 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d  ' ) psp->state =
14fa0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14fb0 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20  L_KEYWORD;.     
14fc0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f   break;.  }.}../
14fd0 2a 20 52 75 6e 20 74 68 65 20 70 72 65 70 72 6f  * Run the prepro
14fe0 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68 65 20  cessor over the 
14ff0 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78 74 2e  input file text.
15000 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76 61 72    The global var
15010 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69  iables.** azDefi
15020 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 7a  ne[0] through az
15030 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31  Define[nDefine-1
15040 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  ] contains the n
15050 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65 66 69  ames of all defi
15060 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20  ned.** macros.  
15070 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  This routine loo
15080 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66 22 20  ks for "%ifdef" 
15090 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20 61 6e  and "%ifndef" an
150a0 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a  d "%endif" and.*
150b0 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20  * comments them 
150c0 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20 62 65  out.  Text in be
150d0 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f  tween is also co
150e0 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73 20 61  mmented out as a
150f0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
15100 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 72  tatic void prepr
15110 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72  ocess_input(char
15120 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *z){.  int i, j
15130 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78  , k, n;.  int ex
15140 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74  clude = 0;.  int
15150 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e   start = 0;.  in
15160 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20  t lineno = 1;.  
15170 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f  int start_lineno
15180 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 1;.  for(i=0;
15190 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
151a0 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
151b0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
151c0 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c  if( z[i]!='%' ||
151d0 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21   (i>0 && z[i-1]!
151e0 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75  ='\n') ) continu
151f0 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  e;.    if( strnc
15200 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66  mp(&z[i],"%endif
15210 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41  ",6)==0 && ISSPA
15220 43 45 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20  CE(z[i+6]) ){.  
15230 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20      if( exclude 
15240 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75  ){.        exclu
15250 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  de--;.        if
15260 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a  ( exclude==0 ){.
15270 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
15280 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  start; j<i; j++)
15290 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20   if( z[j]!='\n' 
152a0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
152b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
152c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a        for(j=i; z
152d0 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e  [j] && z[j]!='\n
152e0 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27  '; j++) z[j] = '
152f0 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   ';.    }else if
15300 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d  ( (strncmp(&z[i]
15310 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d 30 20  ,"%ifdef",6)==0 
15320 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36  && ISSPACE(z[i+6
15330 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ])).          ||
15340 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c   (strncmp(&z[i],
15350 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20  "%ifndef",7)==0 
15360 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 37  && ISSPACE(z[i+7
15370 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ])) ){.      if(
15380 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
15390 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20      exclude++;. 
153a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
153b0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 49      for(j=i+7; I
153c0 53 53 50 41 43 45 28 7a 5b 6a 5d 29 3b 20 6a 2b  SSPACE(z[j]); j+
153d0 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72  +){}.        for
153e0 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20  (n=0; z[j+n] && 
153f0 21 49 53 53 50 41 43 45 28 7a 5b 6a 2b 6e 5d 29  !ISSPACE(z[j+n])
15400 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; n++){}.       
15410 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20   exclude = 1;.  
15420 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
15430 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a  <nDefine; k++){.
15440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
15450 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b  rncmp(azDefine[k
15460 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26  ],&z[j],n)==0 &&
15470 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44   lemonStrlen(azD
15480 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a  efine[k])==n ){.
15490 20 20 20 20 20 20 20 20 20 20 20 20 65 78 63 6c              excl
154a0 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ude = 0;.       
154b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
154c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
154d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  }.        if( z[
154e0 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c  i+3]=='n' ) excl
154f0 75 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a  ude = !exclude;.
15500 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c          if( excl
15510 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ude ){.         
15520 20 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20   start = i;.    
15530 20 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65        start_line
15540 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20  no = lineno;.   
15550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15560 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b       for(j=i; z[
15570 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27  j] && z[j]!='\n'
15580 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20  ; j++) z[j] = ' 
15590 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  ';.    }.  }.  i
155a0 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
155b0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
155c0 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25  ,"unterminated %
155d0 25 69 66 64 65 66 20 73 74 61 72 74 69 6e 67 20  %ifdef starting 
155e0 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73  on line %d\n", s
155f0 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tart_lineno);.  
15600 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d    exit(1);.  }.}
15610 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66  ../* In spite of
15620 20 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20   its name, this 
15630 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c  function is real
15640 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49  ly a scanner.  I
15650 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  t read.** in the
15660 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69   entire input fi
15670 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29  le (all at once)
15680 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20   then tokenizes 
15690 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b  it.  Each.** tok
156a0 65 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  en is passed to 
156b0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61  the function "pa
156c0 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69  rseonetoken" whi
156d0 63 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a  ch builds all.**
156e0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
156f0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
15700 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73   in the global s
15710 74 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22  tate vector "gp"
15720 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ..*/.void Parse(
15730 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
15740 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74  ).{.  struct pst
15750 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a  ate ps;.  FILE *
15760 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  fp;.  char *file
15770 62 75 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  buf;.  unsigned 
15780 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20  int filesize;.  
15790 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e  int lineno;.  in
157a0 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c  t c;.  char *cp,
157b0 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20   *nextcp;.  int 
157c0 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a  startline = 0;..
157d0 20 20 6d 65 6d 73 65 74 28 26 70 73 2c 20 27 5c    memset(&ps, '\
157e0 30 27 2c 20 73 69 7a 65 6f 66 28 70 73 29 29 3b  0', sizeof(ps));
157f0 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20  .  ps.gp = gp;. 
15800 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67   ps.filename = g
15810 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  p->filename;.  p
15820 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  s.errorcnt = 0;.
15830 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49    ps.state = INI
15840 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42  TIALIZE;..  /* B
15850 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20  egin by reading 
15860 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
15870 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70  /.  fp = fopen(p
15880 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29  s.filename,"rb")
15890 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b  ;.  if( fp==0 ){
158a0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
158b0 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
158c0 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  't open this fil
158d0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29  e for reading.")
158e0 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
158f0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
15900 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70  ;.  }.  fseek(fp
15910 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a  ,0,2);.  filesiz
15920 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20  e = ftell(fp);. 
15930 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66   rewind(fp);.  f
15940 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a  ilebuf = (char *
15950 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a  )malloc( filesiz
15960 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c  e+1 );.  if( fil
15970 65 73 69 7a 65 3e 31 30 30 30 30 30 30 30 30 20  esize>100000000 
15980 7c 7c 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b  || filebuf==0 ){
15990 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
159a0 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 49 6e 70  .filename,0,"Inp
159b0 75 74 20 66 69 6c 65 20 74 6f 6f 20 6c 61 72 67  ut file too larg
159c0 65 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  e.");.    gp->er
159d0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63  rorcnt++;.    fc
159e0 6c 6f 73 65 28 66 70 29 3b 0a 20 20 20 20 72 65  lose(fp);.    re
159f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
15a00 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c  fread(filebuf,1,
15a10 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69  filesize,fp)!=fi
15a20 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72  lesize ){.    Er
15a30 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
15a40 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64  me,0,"Can't read
15a50 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73   in all %d bytes
15a60 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c   of this file.",
15a70 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29  .      filesize)
15a80 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62  ;.    free(fileb
15a90 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  uf);.    gp->err
15aa0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c  orcnt++;.    fcl
15ab0 6f 73 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74  ose(fp);.    ret
15ac0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  urn;.  }.  fclos
15ad0 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  e(fp);.  filebuf
15ae0 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a  [filesize] = 0;.
15af0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e  .  /* Make an in
15b00 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75  itial pass throu
15b10 67 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  gh the file to h
15b20 61 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64  andle %ifdef and
15b30 20 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72   %ifndef */.  pr
15b40 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66  eprocess_input(f
15b50 69 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e  ilebuf);..  /* N
15b60 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74  ow scan the text
15b70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
15b80 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d  le */.  lineno =
15b90 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c   1;.  for(cp=fil
15ba0 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d  ebuf; (c= *cp)!=
15bb0 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  0; ){.    if( c=
15bc0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15be0 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  * Keep track of 
15bf0 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
15c00 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 53 50 41  */.    if( ISSPA
15c10 43 45 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63  CE(c) ){ cp++; c
15c20 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53  ontinue; }  /* S
15c30 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70  kip all white sp
15c40 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ace */.    if( c
15c50 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
15c60 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '/' ){          
15c70 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
15c80 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
15c90 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
15ca0 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
15cb0 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
15cc0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
15cd0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
15ce0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
15cf0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20  p[1]=='*' ){    
15d00 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20        /* Skip C 
15d10 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
15d20 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
15d30 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
15d40 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
15d50 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a  /' || cp[-1]!='*
15d60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
15d70 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
15d80 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
15d90 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
15da0 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a    if( c ) cp++;.
15db0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15dc0 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b      }.    ps.tok
15dd0 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20  enstart = cp;   
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15df0 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69  Mark the beginni
15e00 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  ng of the token 
15e10 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c  */.    ps.tokenl
15e20 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20  ineno = lineno; 
15e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
15e40 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68  enumber on which
15e50 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f   token begins */
15e60 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27  .    if( c=='\"'
15e70 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
15e80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
15e90 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  g literals */.  
15ea0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
15eb0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
15ec0 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b  =0 && c!='\"' ){
15ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
15ee0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
15ef0 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
15f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15f10 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
15f20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
15f30 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c  ename,startline,
15f40 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e  ."String startin
15f50 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
15f60 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
15f70 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
15f80 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
15f90 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
15fa0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
15fb0 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15fd0 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
15fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15ff0 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20  e if( c=='{' ){ 
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16010 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f   A block of C co
16020 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  de */.      int 
16030 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b  level;.      cp+
16040 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76  +;.      for(lev
16050 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d  el=1; (c= *cp)!=
16060 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c  0 && (level>1 ||
16070 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b   c!='}'); cp++){
16080 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
16090 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
160a0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
160b0 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c  ( c=='{' ) level
160c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  ++;.        else
160d0 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65   if( c=='}' ) le
160e0 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65  vel--;.        e
160f0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
16100 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20  & cp[1]=='*' ){ 
16110 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74   /* Skip comment
16120 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
16130 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  nt prevc;.      
16140 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
16150 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
16160 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16170 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
16180 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
16190 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a   prevc!='*') ){.
161a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
161b0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
161c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
161d0 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
161e0 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
161f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16200 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f   }else if( c=='/
16210 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20  ' && cp[1]=='/' 
16220 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20  ){  /* Skip C++ 
16230 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74  style comments t
16240 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  oo */.          
16250 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20  cp = &cp[2];.   
16260 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
16270 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
16280 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
16290 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c         if( c ) l
162a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
162b0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
162c0 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b  '' || c=='\"' ){
162d0 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20      /* String a 
162e0 63 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61  character litera
162f0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ls */.          
16300 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70  int startchar, p
16310 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
16320 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20  startchar = c;. 
16330 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
16340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
16350 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29  r(cp++; (c= *cp)
16360 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74  !=0 && (c!=start
16370 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27  char || prevc=='
16380 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  \\'); cp++){.   
16390 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
163a0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
163b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
163c0 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70   prevc=='\\' ) p
163d0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
163e0 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
163f0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
16400 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
16410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16420 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
16430 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
16440 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
16450 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  ps.tokenlineno,.
16460 22 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67  "C code starting
16470 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
16480 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
16490 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
164a0 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
164b0 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
164c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
164d0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
164e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
164f0 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
16500 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
16510 20 69 66 28 20 49 53 41 4c 4e 55 4d 28 63 29 20   if( ISALNUM(c) 
16520 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ){          /* I
16530 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20  dentifiers */.  
16540 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
16550 63 70 29 21 3d 30 20 26 26 20 28 49 53 41 4c 4e  cp)!=0 && (ISALN
16560 55 4d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29  UM(c) || c=='_')
16570 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e   ) cp++;.      n
16580 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
16590 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27  }else if( c==':'
165a0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26   && cp[1]==':' &
165b0 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20  & cp[2]=='=' ){ 
165c0 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  /* The operator 
165d0 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63  "::=" */.      c
165e0 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65  p += 3;.      ne
165f0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
16600 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 2f 27  else if( (c=='/'
16610 20 7c 7c 20 63 3d 3d 27 7c 27 29 20 26 26 20 49   || c=='|') && I
16620 53 41 4c 50 48 41 28 63 70 5b 31 5d 29 20 29 7b  SALPHA(cp[1]) ){
16630 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a  .      cp += 2;.
16640 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20        while( (c 
16650 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 49 53  = *cp)!=0 && (IS
16660 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63 3d 3d 27  ALNUM(c) || c=='
16670 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  _') ) cp++;.    
16680 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
16690 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20     /* All other 
166c0 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72 29 20  (one character) 
166d0 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20  operators */.   
166e0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e     cp++;.      n
166f0 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
16700 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20  }.    c = *cp;. 
16710 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20 20 20     *cp = 0;     
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69     /* Null termi
16740 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  nate the token *
16750 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65 74 6f  /.    parseoneto
16760 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20 20 20  ken(&ps);       
16770 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74        /* Parse t
16780 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
16790 2a 63 70 20 3d 20 28 63 68 61 72 29 63 3b 20 20  *cp = (char)c;  
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 62  /* Restore the b
167c0 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63 70 20  uffer */.    cp 
167d0 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20  = nextcp;.  }.  
167e0 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 20 20  free(filebuf);  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
16810 20 62 75 66 66 65 72 20 61 66 74 65 72 20 70 61   buffer after pa
16820 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72  rsing */.  gp->r
16830 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74 72 75  ule = ps.firstru
16840 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63  le;.  gp->errorc
16850 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74  nt = ps.errorcnt
16860 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
16870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16880 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
16890 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  plink.c" *******
168a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
168b0 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70  /*.** Routines p
168c0 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66 69 67  rocessing config
168d0 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73  uration follow-s
168e0 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
168f0 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  inks.** in the L
16900 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
16910 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
16920 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
16930 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
16940 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  0;../* Allocate 
16950 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73  a new plink */.s
16960 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69  truct plink *Pli
16970 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20  nk_new(void){.  
16980 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
16990 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c  wlink;..  if( pl
169a0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20  ink_freelist==0 
169b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
169c0 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
169d0 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
169e0 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c  ist = (struct pl
169f0 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  ink *)calloc( am
16a00 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
16a10 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69   plink) );.    i
16a20 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
16a30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
16a40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
16a50 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
16a60 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
16a70 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
16a80 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
16a90 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
16aa0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
16ab0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
16ac0 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
16ad0 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
16ae0 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
16af0 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
16b00 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
16b10 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
16b20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c  }.  newlink = pl
16b30 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
16b40 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
16b50 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
16b60 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
16b70 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41  newlink;.}../* A
16b80 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20  dd a plink to a 
16b90 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f  plink list */.vo
16ba0 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
16bb0 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70  uct plink **plpp
16bc0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
16bd0 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp).{.  struct
16be0 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b   plink *newlink;
16bf0 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69  .  newlink = Pli
16c00 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c  nk_new();.  newl
16c10 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70  ink->next = *plp
16c20 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77  p;.  *plpp = new
16c30 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d  link;.  newlink-
16c40 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
16c50 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
16c60 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
16c70 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
16c80 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
16c90 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
16ca0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c  ruct plink **to,
16cb0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66   struct plink *f
16cc0 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  rom).{.  struct 
16cd0 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20  plink *nextpl;. 
16ce0 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a   while( from ){.
16cf0 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f      nextpl = fro
16d00 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f  m->next;.    fro
16d10 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20  m->next = *to;. 
16d20 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20     *to = from;. 
16d30 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c     from = nextpl
16d40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65  ;.  }.}../* Dele
16d50 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  te every plink o
16d60 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f  n the list */.vo
16d70 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
16d80 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
16d90 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p).{.  struct pl
16da0 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
16db0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
16dc0 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
16dd0 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
16de0 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
16df0 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
16e00 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
16e10 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
16e20 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
16e50 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
16e80 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
16e90 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
16ea0 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
16eb0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
16ec0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
16ed0 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
16ee0 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
16ef0 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
16f00 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
16f10 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
16f20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
16f30 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
16f40 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
16f50 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
16f60 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
16f70 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c 65 6d  ename(struct lem
16f80 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20  on *lemp, const 
16f90 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a  char *suffix).{.
16fa0 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
16fb0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
16fc0 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  e = (char*)mallo
16fd0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
16fe0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
16ff0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
17000 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
17010 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
17020 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
17030 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
17040 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
17050 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
17060 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65  xit(1);.  }.  le
17070 6d 6f 6e 5f 73 74 72 63 70 79 28 6e 61 6d 65 2c  mon_strcpy(name,
17080 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
17090 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
170a0 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
170b0 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20   cp ) *cp = 0;. 
170c0 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28 6e 61   lemon_strcat(na
170d0 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20 72 65  me,suffix);.  re
170e0 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  turn name;.}../*
170f0 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77 69 74   Open a file wit
17100 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64 20 6f  h a name based o
17110 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
17120 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a  e input file,.**
17130 20 62 75 74 20 77 69 74 68 20 61 20 64 69 66 66   but with a diff
17140 65 72 65 6e 74 20 28 73 70 65 63 69 66 69 65 64  erent (specified
17150 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65  ) suffix, and re
17160 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
17170 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61 6d 20  * to the stream 
17180 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20  */.PRIVATE FILE 
17190 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20 73 74  *file_open(.  st
171a0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
171b0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
171c0 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20  suffix,.  const 
171d0 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20  char *mode.){.  
171e0 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28  FILE *fp;..  if(
171f0 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29   lemp->outname )
17200 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e   free(lemp->outn
17210 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75  ame);.  lemp->ou
17220 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  tname = file_mak
17230 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66  ename(lemp, suff
17240 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65  ix);.  fp = fope
17250 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c  n(lemp->outname,
17260 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66 70 3d  mode);.  if( fp=
17270 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27  =0 && *mode=='w'
17280 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
17290 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70  stderr,"Can't op
172a0 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  en file \"%s\".\
172b0 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  n",lemp->outname
172c0 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
172d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
172e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
172f0 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75  urn fp;.}../* Du
17300 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70 75  plicate the inpu
17310 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63  t file without c
17320 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68  omments and with
17330 6f 75 74 20 61 63 74 69 6f 6e 73 0a 2a 2a 20 6f  out actions.** o
17340 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20  n rules */.void 
17350 52 65 70 72 69 6e 74 28 73 74 72 75 63 74 20 6c  Reprint(struct l
17360 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
17370 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
17380 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
17390 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   *sp;.  int i, j
173a0 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e  , maxlen, len, n
173b0 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20  columns, skip;. 
173c0 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72   printf("// Repr
173d0 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  int of input fil
173e0 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79  e \"%s\".\n// Sy
173f0 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e  mbols:\n",lemp->
17400 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78  filename);.  max
17410 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28  len = 10;.  for(
17420 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
17430 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
17440 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
17450 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  ls[i];.    len =
17460 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d   lemonStrlen(sp-
17470 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  >name);.    if( 
17480 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78  len>maxlen ) max
17490 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  len = len;.  }. 
174a0 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28   ncolumns = 76/(
174b0 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28  maxlen+5);.  if(
174c0 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63   ncolumns<1 ) nc
174d0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b  olumns = 1;.  sk
174e0 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d  ip = (lemp->nsym
174f0 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d  bol + ncolumns -
17500 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20   1)/ncolumns;.  
17510 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b  for(i=0; i<skip;
17520 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74   i++){.    print
17530 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72  f("//");.    for
17540 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73  (j=i; j<lemp->ns
17550 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b  ymbol; j+=skip){
17560 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  .      sp = lemp
17570 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
17580 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d 3e      assert( sp->
17590 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20  index==j );.    
175a0 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20 25    printf(" %3d %
175b0 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c  -*.*s",j,maxlen,
175c0 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29  maxlen,sp->name)
175d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
175e0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
175f0 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
17600 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
17610 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  xt){.    printf(
17620 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  "%s",rp->lhs->na
17630 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20 20 20 69  me);.    /*    i
17640 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
17650 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c  ) printf("(%s)",
17660 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20 2a  rp->lhsalias); *
17670 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 3a  /.    printf(" :
17680 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  :=");.    for(i=
17690 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
176a0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20  ++){.      sp = 
176b0 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
176c0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
176d0 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
176e0 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
176f0 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79  " %s", sp->subsy
17700 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[0]->name);.   
17710 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
17720 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
17730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
17740 6e 74 66 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73  ntf("|%s", sp->s
17750 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[j]->name);
17760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17780 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70  printf(" %s", sp
17790 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
177a0 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70  .      /* if( rp
177b0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20  ->rhsalias[i] ) 
177c0 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70  printf("(%s)",rp
177d0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20  ->rhsalias[i]); 
177e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  */.    }.    pri
177f0 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66  ntf(".");.    if
17800 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20  ( rp->precsym ) 
17810 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72  printf(" [%s]",r
17820 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65  p->precsym->name
17830 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70  );.    /* if( rp
17840 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28  ->code ) printf(
17850 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63  "\n    %s",rp->c
17860 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ode); */.    pri
17870 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
17880 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  ../* Print a sin
17890 67 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69  gle rule..*/.voi
178a0 64 20 52 75 6c 65 50 72 69 6e 74 28 46 49 4c 45  d RulePrint(FILE
178b0 20 2a 66 70 2c 20 73 74 72 75 63 74 20 72 75 6c   *fp, struct rul
178c0 65 20 2a 72 70 2c 20 69 6e 74 20 69 43 75 72 73  e *rp, int iCurs
178d0 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79  or){.  struct sy
178e0 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20  mbol *sp;.  int 
178f0 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28  i, j;.  fprintf(
17900 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e  fp,"%s ::=",rp->
17910 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f  lhs->name);.  fo
17920 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72  r(i=0; i<=rp->nr
17930 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  hs; i++){.    if
17940 28 20 69 3d 3d 69 43 75 72 73 6f 72 20 29 20 66  ( i==iCursor ) f
17950 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b  printf(fp," *");
17960 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e  .    if( i==rp->
17970 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20  nrhs ) break;.  
17980 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69    sp = rp->rhs[i
17990 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  ];.    if( sp->t
179a0 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
179b0 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  AL ){.      fpri
179c0 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70  ntf(fp," %s", sp
179d0 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
179e0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
179f0 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; j<sp->nsubsym
17a00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
17a10 66 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22  fprintf(fp,"|%s"
17a20 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e  ,sp->subsym[j]->
17a30 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
17a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17a50 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
17a60 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
17a70 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69   }.  }.}../* Pri
17a80 6e 74 20 74 68 65 20 72 75 6c 65 20 66 6f 72 20  nt the rule for 
17a90 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  a configuration.
17aa0 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50  .*/.void ConfigP
17ab0 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73  rint(FILE *fp, s
17ac0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
17ad0 70 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74 28  p){.  RulePrint(
17ae0 66 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66 70  fp, cfp->rp, cfp
17af0 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64  ->dot);.}../* #d
17b00 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
17b10 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  f 0./* Print a s
17b20 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  et */.PRIVATE vo
17b30 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c  id SetPrint(out,
17b40 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a  set,lemp).FILE *
17b50 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a  out;.char *set;.
17b60 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17b70 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
17b80 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20   char *spacer;. 
17b90 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20   spacer = "";.  
17ba0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
17bb0 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69  s[","");.  for(i
17bc0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
17bd0 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
17be0 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74   if( SetFind(set
17bf0 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ,i) ){.      fpr
17c00 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c  intf(out,"%s%s",
17c10 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d  spacer,lemp->sym
17c20 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
17c30 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22        spacer = "
17c40 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ";.    }.  }.  
17c50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e  fprintf(out,"]\n
17c60 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
17c70 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f  a plink chain */
17c80 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c  .PRIVATE void Pl
17c90 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  inkPrint(out,plp
17ca0 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  ,tag).FILE *out;
17cb0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
17cc0 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b  lp;.char *tag;.{
17cd0 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
17ce0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17cf0 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20  ,"%12s%s (state 
17d00 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c  %2d) ","",tag,pl
17d10 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61  p->cfp->stp->sta
17d20 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66  tenum);.    Conf
17d30 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d  igPrint(out,plp-
17d40 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  >cfp);.    fprin
17d50 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  tf(out,"\n");.  
17d60 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78    plp = plp->nex
17d70 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  t;.  }.}.#endif.
17d80 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74  ./* Print an act
17d90 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ion to the given
17da0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17db0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
17dc0 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61  if.** nothing wa
17dd0 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74  s actually print
17de0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74  ed..*/.int Print
17df0 41 63 74 69 6f 6e 28 0a 20 20 73 74 72 75 63 74  Action(.  struct
17e00 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20   action *ap,    
17e10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 63 74        /* The act
17e20 69 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a  ion to print */.
17e30 20 20 46 49 4c 45 20 2a 66 70 2c 20 20 20 20 20    FILE *fp,     
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e50 20 50 72 69 6e 74 20 74 68 65 20 61 63 74 69 6f   Print the actio
17e60 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
17e70 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20  indent          
17e80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e          /* Inden
17e90 74 20 62 79 20 74 68 69 73 20 61 6d 6f 75 6e 74  t by this amount
17ea0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73   */.){.  int res
17eb0 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63  ult = 1;.  switc
17ec0 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20  h( ap->type ){. 
17ed0 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 7b     case SHIFT: {
17ee0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
17ef0 61 74 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78  ate *stp = ap->x
17f00 2e 73 74 70 3b 0a 20 20 20 20 20 20 66 70 72 69  .stp;.      fpri
17f10 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
17f20 74 20 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69  t        %-7d",i
17f30 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
17f40 6d 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  me,stp->statenum
17f50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17f60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52      }.    case R
17f70 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73  EDUCE: {.      s
17f80 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d  truct rule *rp =
17f90 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
17fa0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17fb0 20 72 65 64 75 63 65 20 20 20 20 20 20 20 25 2d   reduce       %-
17fc0 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  7d",indent,ap->s
17fd0 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c  p->name,rp->iRul
17fe0 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72  e);.      RulePr
17ff0 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b  int(fp, rp, -1);
18000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18010 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 48 49    }.    case SHI
18020 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20  FTREDUCE: {.    
18030 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
18040 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20  p = ap->x.rp;.  
18050 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
18060 25 2a 73 20 73 68 69 66 74 2d 72 65 64 75 63 65  %*s shift-reduce
18070 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70   %-7d",indent,ap
18080 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69  ->sp->name,rp->i
18090 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c  Rule);.      Rul
180a0 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d  ePrint(fp, rp, -
180b0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
180c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
180d0 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70  ACCEPT:.      fp
180e0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63  rintf(fp,"%*s ac
180f0 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  cept",indent,ap-
18100 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
18110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
18120 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66  e ERROR:.      f
18130 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65  printf(fp,"%*s e
18140 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  rror",indent,ap-
18150 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
18160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
18170 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e SRCONFLICT:.  
18180 20 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43    case RRCONFLIC
18190 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
181a0 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
181b0 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61        %-7d ** Pa
181c0 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a  rsing conflict *
181d0 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65  *",.        inde
181e0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
181f0 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29  ap->x.rp->iRule)
18200 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18210 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49     case SSCONFLI
18220 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  CT:.      fprint
18230 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
18240 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50         %-7d ** P
18250 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  arsing conflict 
18260 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64  **",.        ind
18270 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
18280 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74  ,ap->x.stp->stat
18290 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  enum);.      bre
182a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f  ak;.    case SH_
182b0 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20  RESOLVED:.      
182c0 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e  if( showPreceden
182d0 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  ceConflict ){.  
182e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
182f0 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20 20 20  ,"%*s shift     
18300 20 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70     %-7d -- dropp
18310 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
18320 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18330 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
18340 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
18350 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
18360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18370 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20    result = 0;.  
18380 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
18390 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52  k;.    case RD_R
183a0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69  ESOLVED:.      i
183b0 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  f( showPrecedenc
183c0 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20  eConflict ){.   
183d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
183e0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64  "%*s reduce %-7d
183f0 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70   -- dropped by p
18400 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20  recedence",.    
18410 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
18420 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
18430 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29  ap->x.rp->iRule)
18440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18450 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
18460 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
18470 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18480 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20   NOT_USED:.     
18490 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
184a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
184b0 69 66 28 20 72 65 73 75 6c 74 20 26 26 20 61 70  if( result && ap
184c0 2d 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66  ->spOpt ){.    f
184d0 70 72 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20  printf(fp,"  /* 
184e0 62 65 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a  because %s==%s *
184f0 2f 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  /", ap->sp->name
18500 2c 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d  , ap->spOpt->nam
18510 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
18520 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47   result;.}../* G
18530 65 6e 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f  enerate the "*.o
18540 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
18550 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
18560 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
18570 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
18580 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
18590 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63  *stp;.  struct c
185a0 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
185b0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
185c0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
185d0 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  fp = file_open(l
185e0 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29  emp,".out","wb")
185f0 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20  ;.  if( fp==0 ) 
18600 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
18610 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61  0; i<lemp->nxsta
18620 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
18630 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
18640 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [i];.    fprintf
18650 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e  (fp,"State %d:\n
18660 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  ",stp->statenum)
18670 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
18680 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
18690 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73  stp->bp;.    els
186a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
186b0 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b     cfp=stp->cfp;
186c0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70 20  .    while( cfp 
186d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75  ){.      char bu
186e0 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28  f[20];.      if(
186f0 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e   cfp->dot==cfp->
18700 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
18710 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
18720 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70  f(buf,"(%d)",cfp
18730 2d 3e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20  ->rp->iRule);.  
18740 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
18750 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29  ,"    %5s ",buf)
18760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18770 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
18780 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b  p,"          ");
18790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43  .      }.      C
187a0 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
187b0 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  p);.      fprint
187c0 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20  f(fp,"\n");.#if 
187d0 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74  0.      SetPrint
187e0 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d  (fp,cfp->fws,lem
187f0 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50  p);.      PlinkP
18800 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c  rint(fp,cfp->fpl
18810 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20  p,"To  ");.     
18820 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
18830 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29  fp->bplp,"From")
18840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
18850 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c  f( lemp->basisfl
18860 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70  ag ) cfp=cfp->bp
18870 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20  ;.      else    
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66                cf
18890 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  p=cfp->next;.   
188a0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
188b0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  p,"\n");.    for
188c0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
188d0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
188e0 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63       if( PrintAc
188f0 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29  tion(ap,fp,30) )
18900 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
18910 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
18920 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
18930 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c   }.  fprintf(fp,
18940 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
18950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18970 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70  ------\n");.  fp
18980 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f  rintf(fp, "Symbo
18990 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  ls:\n");.  for(i
189a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
189b0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
189c0 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74  nt j;.    struct
189d0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
189e0 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
189f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72  bols[i];.    fpr
18a00 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a  intf(fp, "  %3d:
18a10 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d   %s", i, sp->nam
18a20 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
18a30 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
18a40 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
18a50 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20  tf(fp, ":");.   
18a60 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
18a70 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  a ){.        fpr
18a80 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62  intf(fp, " <lamb
18a90 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  da>");.      }. 
18aa0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
18ab0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
18ac0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
18ad0 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20  f( sp->firstset 
18ae0 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66  && SetFind(sp->f
18af0 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20  irstset, j) ){. 
18b00 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
18b10 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70  (fp, " %s", lemp
18b20 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61  ->symbols[j]->na
18b30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
18b40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18b50 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e   fprintf(fp, "\n
18b60 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
18b70 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
18b80 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
18b90 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
18ba0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
18bb0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
18bc0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
18bd0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
18be0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
18bf0 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68  (char *argv0, ch
18c00 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f  ar *name, int mo
18c10 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73  demask).{.  cons
18c20 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74  t char *pathlist
18c30 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75  ;.  char *pathbu
18c40 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61  fptr;.  char *pa
18c50 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70  thbuf;.  char *p
18c60 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20  ath,*cp;.  char 
18c70 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  c;..#ifdef __WIN
18c80 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
18c90 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
18ca0 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
18cb0 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
18cc0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
18cd0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
18ce0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
18cf0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
18d00 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
18d10 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c  trlen(argv0) + l
18d20 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
18d30 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20   + 2 );.    if( 
18d40 70 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72  path ) lemon_spr
18d50 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
18d60 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20  ",argv0,name);. 
18d70 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65     *cp = c;.  }e
18d80 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c 69 73  lse{.    pathlis
18d90 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48  t = getenv("PATH
18da0 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68  ");.    if( path
18db0 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69  list==0 ) pathli
18dc0 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73  st = ".:/bin:/us
18dd0 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68  r/bin";.    path
18de0 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  buf = (char *) m
18df0 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
18e00 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b 20 31  en(pathlist) + 1
18e10 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28   );.    path = (
18e20 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c  char *)malloc( l
18e30 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c  emonStrlen(pathl
18e40 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ist)+lemonStrlen
18e50 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20  (name)+2 );.    
18e60 69 66 28 20 28 70 61 74 68 62 75 66 20 21 3d 20  if( (pathbuf != 
18e70 30 29 20 26 26 20 28 70 61 74 68 21 3d 30 29 20  0) && (path!=0) 
18e80 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62 75 66  ){.      pathbuf
18e90 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b 0a 20  ptr = pathbuf;. 
18ea0 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70       lemon_strcp
18eb0 79 28 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c  y(pathbuf, pathl
18ec0 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
18ed0 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20  e( *pathbuf ){. 
18ee0 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63         cp = strc
18ef0 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b  hr(pathbuf,':');
18f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
18f10 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 62  =0 ) cp = &pathb
18f20 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70  uf[lemonStrlen(p
18f30 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20  athbuf)];.      
18f40 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20    c = *cp;.     
18f50 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
18f60 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
18f70 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70  f(path,"%s/%s",p
18f80 61 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20  athbuf,name);.  
18f90 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20        *cp = c;. 
18fa0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
18fb0 29 20 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30  ) pathbuf[0] = 0
18fc0 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70  ;.        else p
18fd0 61 74 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b  athbuf = &cp[1];
18fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63  .        if( acc
18ff0 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73  ess(path,modemas
19000 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  k)==0 ) break;. 
19010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
19020 65 28 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20  e(pathbufptr);. 
19030 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19040 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69  n path;.}../* Gi
19050 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63  ven an action, c
19060 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67  ompute the integ
19070 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61  er value for tha
19080 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  t action.** whic
19090 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69  h is to be put i
190a0 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  n the action tab
190b0 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  le of the genera
190c0 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ted machine..** 
190d0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
190e0 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f  if no action sho
190f0 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
19100 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
19110 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
19120 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
19130 6d 70 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f  mp, struct actio
19140 6e 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61  n *ap).{.  int a
19150 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70  ct;.  switch( ap
19160 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  ->type ){.    ca
19170 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d  se SHIFT:  act =
19180 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74   ap->x.stp->stat
19190 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  enum;           
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
191b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 49  ak;.    case SHI
191c0 46 54 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  FTREDUCE: act = 
191d0 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 20  ap->x.rp->iRule 
191e0 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
191f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19200 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61    case REDUCE: a
19210 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69  ct = ap->x.rp->i
19220 52 75 6c 65 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74  Rule + lemp->nst
19230 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  ate+lemp->nrule;
19240 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19250 20 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c   ERROR:  act = l
19260 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
19270 6d 70 2d 3e 6e 72 75 6c 65 2a 32 3b 20 20 20 20  mp->nrule*2;    
19280 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19290 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
192a0 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  T: act = lemp->n
192b0 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
192c0 75 6c 65 2a 32 20 2b 20 31 3b 20 20 20 20 20 20  ule*2 + 1;      
192d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
192e0 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
192f0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
19300 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
19310 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
19320 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
19330 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
19340 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
19350 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
19360 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
19370 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
19380 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
19390 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
193a0 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
193b0 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
193c0 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
193d0 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
193e0 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
193f0 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
19400 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
19410 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
19420 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
19430 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
19440 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
19450 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
19460 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
19470 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
19480 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
19490 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
194a0 5f 78 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65  _xfer(char *name
194b0 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45  , FILE *in, FILE
194c0 20 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65   *out, int *line
194d0 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69  no).{.  int i, i
194e0 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69  Start;.  char li
194f0 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
19500 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e  while( fgets(lin
19510 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26  e,LINESIZE,in) &
19520 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20  & (line[0]!='%' 
19530 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29  || line[1]!='%')
19540 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f   ){.    (*lineno
19550 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20  )++;.    iStart 
19560 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d  = 0;.    if( nam
19570 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  e ){.      for(i
19580 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b  =0; line[i]; i++
19590 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  ){.        if( l
195a0 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73  ine[i]=='P' && s
195b0 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c  trncmp(&line[i],
195c0 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20  "Parse",5)==0.  
195d0 20 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30          && (i==0
195e0 20 7c 7c 20 21 49 53 41 4c 50 48 41 28 6c 69 6e   || !ISALPHA(lin
195f0 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20  e[i-1])).       
19600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
19610 28 20 69 3e 69 53 74 61 72 74 20 29 20 66 70 72  ( i>iStart ) fpr
19620 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c  intf(out,"%.*s",
19630 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69  i-iStart,&line[i
19640 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20  Start]);.       
19650 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19660 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  %s",name);.     
19670 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
19680 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
19690 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i+1;.        }. 
196a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
196b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
196c0 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  ",&line[iStart])
196d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20  ;.  }.}../* The 
196e0 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69  next function fi
196f0 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65  nds the template
19700 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20   file and opens 
19710 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  it, returning.**
19720 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19730 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a  e opened file. *
19740 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a  /.PRIVATE FILE *
19750 74 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74  tplt_open(struct
19760 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
19770 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74 65    static char te
19780 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22  mplatename[] = "
19790 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61  lempar.c";.  cha
197a0 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46  r buf[1000];.  F
197b0 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
197c0 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61  *tpltname;.  cha
197d0 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72  r *cp;..  /* fir
197e0 73 74 2c 20 73 65 65 20 69 66 20 75 73 65 72 20  st, see if user 
197f0 73 70 65 63 69 66 69 65 64 20 61 20 74 65 6d 70  specified a temp
19800 6c 61 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e  late filename on
19810 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
19820 65 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72  e. */.  if (user
19830 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d  _templatename !=
19840 20 30 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63   0) {.    if( ac
19850 63 65 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61  cess(user_templa
19860 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20  tename,004)==-1 
19870 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
19880 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66  (stderr,"Can't f
19890 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64  ind the parser d
198a0 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66  river template f
198b0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
198c0 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d          user_tem
198d0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
198e0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
198f0 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
19900 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e   0;.    }.    in
19910 20 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65   = fopen(user_te
19920 6d 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29  mplatename,"rb")
19930 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
19940 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
19950 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
19960 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
19970 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
19980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19990 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
199a0 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  e);.      lemp->
199b0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
199c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
199d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 3b  }.    return in;
199e0 0a 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72  .  }..  cp = str
199f0 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rchr(lemp->filen
19a00 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20  ame,'.');.  if( 
19a10 63 70 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  cp ){.    lemon_
19a20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a  sprintf(buf,"%.*
19a30 73 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c  s.lt",(int)(cp-l
19a40 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c  emp->filename),l
19a50 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
19a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d    }else{.    lem
19a70 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22  on_sprintf(buf,"
19a80 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c  %s.lt",lemp->fil
19a90 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ename);.  }.  if
19aa0 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34  ( access(buf,004
19ab0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
19ac0 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65  name = buf;.  }e
19ad0 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74  lse if( access(t
19ae0 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29  emplatename,004)
19af0 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
19b00 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61  ame = templatena
19b10 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
19b20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68   tpltname = path
19b30 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67  search(lemp->arg
19b40 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  v0,templatename,
19b50 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70  0);.  }.  if( tp
19b60 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ltname==0 ){.   
19b70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
19b80 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20  "Can't find the 
19b90 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65  parser driver te
19ba0 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
19bb0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70  \".\n",.    temp
19bc0 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
19bd0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
19be0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19bf0 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
19c00 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  tpltname,"rb");.
19c10 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
19c20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
19c30 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  r,"Can't open th
19c40 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  e template file 
19c50 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c  \"%s\".\n",templ
19c60 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  atename);.    le
19c70 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
19c80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19c90 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d  }.  return in;.}
19ca0 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69  ../* Print a #li
19cb0 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e  ne directive lin
19cc0 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  e to the output 
19cd0 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
19ce0 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64   void tplt_lined
19cf0 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e  ir(FILE *out, in
19d00 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a  t lineno, char *
19d10 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70  filename).{.  fp
19d20 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65  rintf(out,"#line
19d30 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b   %d \"",lineno);
19d40 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e  .  while( *filen
19d50 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  ame ){.    if( *
19d60 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27  filename == '\\'
19d70 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74   ) putc('\\',out
19d80 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69 6c  );.    putc(*fil
19d90 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20  ename,out);.    
19da0 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  filename++;.  }.
19db0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
19dc0 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69  "\n");.}../* Pri
19dd0 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74  nt a string to t
19de0 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70  he file and keep
19df0 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20   the linenumber 
19e00 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52  up to date */.PR
19e10 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
19e20 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c  print(FILE *out,
19e30 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
19e40 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c 20  emp, char *str, 
19e50 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20  int *lineno).{. 
19e60 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65   if( str==0 ) re
19e70 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a  turn;.  while( *
19e80 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63 28  str ){.    putc(
19e90 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69  *str,out);.    i
19ea0 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20  f( *str=='\n' ) 
19eb0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
19ec0 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66   str++;.  }.  if
19ed0 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20  ( str[-1]!='\n' 
19ee0 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e 27  ){.    putc('\n'
19ef0 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e  ,out);.    (*lin
19f00 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  eno)++;.  }.  if
19f10 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
19f20 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a  osflag) {.    (*
19f30 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f  lineno)++; tplt_
19f40 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
19f50 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
19f60 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
19f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
19f80 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
19f90 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20   emits code for 
19fa0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
19fb0 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c  or the.** symbol
19fc0 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74   sp.*/.void emit
19fd0 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
19fe0 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20  (.  FILE *out,. 
19ff0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1a000 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  sp,.  struct lem
1a010 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20  on *lemp,.  int 
1a020 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72  *lineno.){. char
1a030 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20   *cp = 0;.. if( 
1a040 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1a050 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  AL ){.   cp = le
1a060 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20  mp->tokendest;. 
1a070 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
1a080 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
1a090 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
1a0a0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
1a0b0 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63   if( sp->destruc
1a0c0 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73  tor ){.   cp = s
1a0d0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20  p->destructor;. 
1a0e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
1a0f0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1a100 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d  +;.   if( !lemp-
1a110 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29  >nolinenosflag )
1a120 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  {.     (*lineno)
1a130 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69  ++;.     tplt_li
1a140 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65  nedir(out,sp->de
1a150 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66  stLineno,lemp->f
1a160 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20  ilename);.   }. 
1a170 7d 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e  }else if( lemp->
1a180 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70  vardest ){.   cp
1a190 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74   = lemp->vardest
1a1a0 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  ;.   if( cp==0 )
1a1b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69   return;.   fpri
1a1c0 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
1a1d0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65  (*lineno)++;. }e
1a1e0 6c 73 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20  lse{.   assert( 
1a1f0 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1a200 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f  happen */. }. fo
1a210 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  r(; *cp; cp++){.
1a220 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20     if( *cp=='$' 
1a230 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b  && cp[1]=='$' ){
1a240 0a 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  .     fprintf(ou
1a250 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79  t,"(yypminor->yy
1a260 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b  %d)",sp->dtnum);
1a270 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  .     cp++;.    
1a280 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a   continue;.   }.
1a290 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
1a2a0 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a   ) (*lineno)++;.
1a2b0 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74     fputc(*cp,out
1a2c0 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f  );. }. fprintf(o
1a2d0 75 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  ut,"\n"); (*line
1a2e0 6e 6f 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d  no)++;. if (!lem
1a2f0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1a300 29 20 7b 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  ) {.   (*lineno)
1a310 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
1a320 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1a330 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 0a  p->outname);. }.
1a340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c   fprintf(out,"}\
1a350 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1a360 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ;. return;.}../*
1a370 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a380 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
1a390 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68  e given symbol h
1a3a0 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e  as a destructor.
1a3b0 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74  .*/.int has_dest
1a3c0 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79  ructor(struct sy
1a3d0 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74  mbol *sp, struct
1a3e0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
1a3f0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28    int ret;.  if(
1a400 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1a410 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  NAL ){.    ret =
1a420 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
1a430 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1a440 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61    ret = lemp->va
1a450 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e  rdest!=0 || sp->
1a460 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20  destructor!=0;. 
1a470 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1a480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1a490 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d   text to a dynam
1a4a0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1a4b0 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65   string.  If zTe
1a4c0 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20  xt is 0 then.** 
1a4d0 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67  reset the string
1a4e0 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61   to be empty aga
1a4f0 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  in.  Always retu
1a500 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  rn the complete 
1a510 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  text.** of the s
1a520 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20  tring (which is 
1a530 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
1a540 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a   each call)..**.
1a550 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54  ** n bytes of zT
1a560 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20  ext are stored. 
1a570 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c   If n==0 then al
1a580 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f  l of zText up to
1a590 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30   the first.** \0
1a5a0 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73  00 terminator is
1a5b0 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20   stored.  zText 
1a5c0 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74  can contain up t
1a5d0 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  o two instances 
1a5e0 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76  of.** %d.  The v
1a5f0 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20  alues of p1 and 
1a600 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  p2 are written i
1a610 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e  nto the first an
1a620 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a  d second.** %d..
1a630 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20  **.** If n==-1, 
1a640 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75  then the previou
1a650 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f  s character is o
1a660 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50  verwritten..*/.P
1a670 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70  RIVATE char *app
1a680 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68  end_str(const ch
1a690 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
1a6a0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1a6b0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
1a6c0 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20   empty[1] = { 0 
1a6d0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  };.  static char
1a6e0 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
1a6f0 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
1a700 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
1a710 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
1a720 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
1a730 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d  0];.  if( zText=
1a740 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 73  =0 ){.    if( us
1a750 65 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29 20  ed==0 && z!=0 ) 
1a760 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75 73  z[0] = 0;.    us
1a770 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ed = 0;.    retu
1a780 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn z;.  }.  if( 
1a790 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n<=0 ){.    if( 
1a7a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  n<0 ){.      use
1a7b0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73  d += n;.      as
1a7c0 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b  sert( used>=0 );
1a7d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c  .    }.    n = l
1a7e0 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74  emonStrlen(zText
1a7f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 6e  );.  }.  if( (in
1a800 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e  t) (n+sizeof(zIn
1a810 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61 6c  t)*2+used) >= al
1a820 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c  loced ){.    all
1a830 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f  oced = n + sizeo
1a840 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64  f(zInt)*2 + used
1a850 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20   + 200;.    z = 
1a860 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
1a870 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20  (z,  alloced);. 
1a880 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20   }.  if( z==0 ) 
1a890 72 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20  return empty;.  
1a8a0 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
1a8b0 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78  {.    c = *(zTex
1a8c0 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  t++);.    if( c=
1a8d0 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20 7a  ='%' && n>0 && z
1a8e0 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a  Text[0]=='d' ){.
1a8f0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
1a900 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20  ntf(zInt, "%d", 
1a910 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20  p1);.      p1 = 
1a920 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  p2;.      lemon_
1a930 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c  strcpy(&z[used],
1a940 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73   zInt);.      us
1a950 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  ed += lemonStrle
1a960 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20  n(&z[used]);.   
1a970 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20     zText++;.    
1a980 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
1a990 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b  {.      z[used++
1a9a0 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20 20  ] = (char)c;.   
1a9b0 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
1a9c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1a9d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1a9e0 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 74   and transform t
1a9f0 68 65 20 72 70 2d 3e 63 6f 64 65 20 73 74 72 69  he rp->code stri
1aa00 6e 67 20 73 6f 20 74 68 61 74 20 73 79 6d 62 6f  ng so that symbo
1aa10 6c 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ls are expanded.
1aa20 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
1aa30 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1aa40 61 6e 64 20 72 70 2d 3e 63 6f 64 65 53 75 66 66  and rp->codeSuff
1aa50 69 78 20 73 74 72 69 6e 67 73 2c 20 61 73 20 61  ix strings, as a
1aa60 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a  ppropriate..**.*
1aa70 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
1aa80 65 20 65 78 70 61 6e 64 65 64 20 63 6f 64 65 20  e expanded code 
1aa90 72 65 71 75 69 72 65 73 20 74 68 61 74 20 22 79  requires that "y
1aaa0 79 6c 68 73 6d 69 6e 6f 72 22 20 6c 6f 63 61 6c  ylhsminor" local
1aab0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f 20   variable.** to 
1aac0 62 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 50  be defined..*/.P
1aad0 52 49 56 41 54 45 20 69 6e 74 20 74 72 61 6e 73  RIVATE int trans
1aae0 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
1aaf0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
1ab00 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
1ab10 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
1ab20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1ab30 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1ab40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 79 79     /* True if yy
1ab50 6c 68 73 6d 69 6e 6f 72 20 69 73 20 75 73 65 64  lhsminor is used
1ab60 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 74 55 73   */.  int dontUs
1ab70 65 52 68 73 30 20 3d 20 30 3b 20 20 20 2f 2a 20  eRhs0 = 0;   /* 
1ab80 49 66 20 74 72 75 65 2c 20 75 73 65 20 6f 66 20  If true, use of 
1ab90 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61  left-most RHS la
1aba0 62 65 6c 20 69 73 20 69 6c 6c 65 67 61 6c 20 2a  bel is illegal *
1abb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1abc0 7a 53 6b 69 70 20 3d 20 30 3b 20 2f 2a 20 54 68  zSkip = 0; /* Th
1abd0 65 20 7a 4f 76 77 72 74 20 63 6f 6d 6d 65 6e 74  e zOvwrt comment
1abe0 20 77 69 74 68 69 6e 20 72 70 2d 3e 63 6f 64 65   within rp->code
1abf0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1ac00 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  har lhsused = 0;
1ac10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ac20 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74   the LHS element
1ac30 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
1ac40 2f 0a 20 20 63 68 61 72 20 6c 68 73 64 69 72 65  /.  char lhsdire
1ac50 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
1ac60 75 65 20 69 66 20 4c 48 53 20 77 72 69 74 65 73  ue if LHS writes
1ac70 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 73   directly into s
1ac80 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 75  tack */.  char u
1ac90 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20  sed[MAXRHS];    
1aca0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63   /* True for eac
1acb0 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68  h RHS element wh
1acc0 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 20  ich is used */. 
1acd0 20 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b 20   char zLhs[50]; 
1ace0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
1acf0 72 74 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  rt the LHS symbo
1ad00 6c 20 69 6e 74 6f 20 74 68 69 73 20 73 74 72 69  l into this stri
1ad10 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4f 76  ng */.  char zOv
1ad20 77 72 74 5b 39 30 30 5d 3b 20 20 20 20 20 20 2f  wrt[900];      /
1ad30 2a 20 43 6f 6d 6d 65 6e 74 20 74 68 61 74 20 74  * Comment that t
1ad40 6f 20 61 6c 6c 6f 77 20 4c 48 53 20 74 6f 20 6f  o allow LHS to o
1ad50 76 65 72 77 72 69 74 65 20 52 48 53 20 2a 2f 0a  verwrite RHS */.
1ad60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .  for(i=0; i<rp
1ad70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65  ->nrhs; i++) use
1ad80 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75  d[i] = 0;.  lhsu
1ad90 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  sed = 0;..  if( 
1ada0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20  rp->code==0 ){. 
1adb0 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 6e     static char n
1adc0 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20 7b  ewlinestr[2] = {
1add0 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a 20   '\n', '\0' };. 
1ade0 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e 65     rp->code = ne
1adf0 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72 70  wlinestr;.    rp
1ae00 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75 6c  ->line = rp->rul
1ae10 65 6c 69 6e 65 3b 0a 20 20 20 20 72 70 2d 3e 6e  eline;.    rp->n
1ae20 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  oCode = 1;.  }el
1ae30 73 65 7b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f  se{.    rp->noCo
1ae40 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 0a 20 20  de = 0;.  }...  
1ae50 69 66 28 20 72 70 2d 3e 6e 72 68 73 3d 3d 30 20  if( rp->nrhs==0 
1ae60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1ae70 72 65 20 61 72 65 20 6e 6f 20 52 48 53 20 73 79  re are no RHS sy
1ae80 6d 62 6f 6c 73 2c 20 74 68 65 6e 20 77 72 69 74  mbols, then writ
1ae90 69 6e 67 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ing directly to 
1aea0 74 68 65 20 4c 48 53 20 69 73 20 6f 6b 20 2a 2f  the LHS is ok */
1aeb0 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1aec0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1aed0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 3d  rp->rhsalias[0]=
1aee0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1aef0 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73   left-most RHS s
1af00 79 6d 62 6f 6c 20 68 61 73 20 6e 6f 20 76 61 6c  ymbol has no val
1af10 75 65 2e 20 20 4c 48 53 20 64 69 72 65 63 74 20  ue.  LHS direct 
1af20 69 73 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20 20  is ok.  But.    
1af30 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63 61  ** we have to ca
1af40 6c 6c 20 74 68 65 20 64 69 73 74 72 75 63 74 6f  ll the distructo
1af50 72 20 6f 6e 20 74 68 65 20 52 48 53 20 73 79 6d  r on the RHS sym
1af60 62 6f 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20  bol first. */.  
1af70 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1af80 0a 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73  .    if( has_des
1af90 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b  tructor(rp->rhs[
1afa0 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20  0],lemp) ){.    
1afb0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1afc0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ,0,0);.      app
1afd0 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65  end_str("  yy_de
1afe0 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73  structor(yypPars
1aff0 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d  er,%d,&yymsp[%d]
1b000 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a  .minor);\n", 0,.
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e 64   rp->rhs[0]->ind
1b030 65 78 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b 0a  ex,1-rp->nrhs);.
1b040 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 50 72        rp->codePr
1b050 65 66 69 78 20 3d 20 53 74 72 73 61 66 65 28 61  efix = Strsafe(a
1b060 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1b070 30 29 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 6e  0));.      rp->n
1b080 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 7d  oCode = 0;.    }
1b090 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d  .  }else if( rp-
1b0a0 3e 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b 0a  >lhsalias==0 ){.
1b0b0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1b0c0 6e 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79 6d  no LHS value sym
1b0d0 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64  bol. */.    lhsd
1b0e0 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  irect = 1;.  }el
1b0f0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 72 70  se if( strcmp(rp
1b100 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72  ->lhsalias,rp->r
1b110 68 73 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20 29  hsalias[0])==0 )
1b120 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53  {.    /* The LHS
1b130 20 73 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65 20   symbol and the 
1b140 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79  left-most RHS sy
1b150 6d 62 6f 6c 20 61 72 65 20 74 68 65 20 73 61 6d  mbol are the sam
1b160 65 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 64 69 72  e, so.    ** dir
1b170 65 63 74 20 77 72 69 74 69 6e 67 20 69 73 20 61  ect writing is a
1b180 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 6c 68  llowed */.    lh
1b190 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20  sdirect = 1;.   
1b1a0 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
1b1b0 20 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b 0a 20    used[0] = 1;. 
1b1c0 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e     if( rp->lhs->
1b1d0 64 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73 5b 30  dtnum!=rp->rhs[0
1b1e0 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20 20 20  ]->dtnum ){.    
1b1f0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1b200 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1b210 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1b220 22 25 73 28 25 73 29 20 61 6e 64 20 25 73 28 25  "%s(%s) and %s(%
1b230 73 29 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  s) share the sam
1b240 65 20 6c 61 62 65 6c 20 62 75 74 20 68 61 76 65  e label but have
1b250 20 22 0a 20 20 20 20 20 20 20 20 22 64 69 66 66   ".        "diff
1b260 65 72 65 6e 74 20 64 61 74 61 74 79 70 65 73 2e  erent datatypes.
1b270 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  ",.        rp->l
1b280 68 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 6c 68  hs->name, rp->lh
1b290 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73 5b  salias, rp->rhs[
1b2a0 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68  0]->name, rp->rh
1b2b0 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20  salias[0]);.    
1b2c0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1b2d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
1b2e0 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  e{.    lemon_spr
1b2f0 69 6e 74 66 28 7a 4f 76 77 72 74 2c 20 22 2f 2a  intf(zOvwrt, "/*
1b300 25 73 2d 6f 76 65 72 77 72 69 74 65 73 2d 25 73  %s-overwrites-%s
1b310 2a 2f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  */",.           
1b320 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c         rp->lhsal
1b330 69 61 73 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61  ias, rp->rhsalia
1b340 73 5b 30 5d 29 3b 0a 20 20 20 20 7a 53 6b 69 70  s[0]);.    zSkip
1b350 20 3d 20 73 74 72 73 74 72 28 72 70 2d 3e 63 6f   = strstr(rp->co
1b360 64 65 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20  de, zOvwrt);.   
1b370 20 69 66 28 20 7a 53 6b 69 70 21 3d 30 20 29 7b   if( zSkip!=0 ){
1b380 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1b390 64 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70  de contains a sp
1b3a0 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 20 74 68  ecial comment th
1b3b0 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1b3c0 74 20 69 74 20 69 73 20 73 61 66 65 0a 20 20 20  t it is safe.   
1b3d0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48     ** for the LH
1b3e0 53 20 6c 61 62 65 6c 20 74 6f 20 6f 76 65 72 77  S label to overw
1b3f0 72 69 74 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52  rite left-most R
1b400 48 53 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20 20  HS label. */.   
1b410 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31     lhsdirect = 1
1b420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b430 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 30     lhsdirect = 0
1b440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1b450 28 20 6c 68 73 64 69 72 65 63 74 20 29 7b 0a 20  ( lhsdirect ){. 
1b460 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c     sprintf(zLhs,
1b470 20 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f   "yymsp[%d].mino
1b480 72 2e 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e 72  r.yy%d",1-rp->nr
1b490 68 73 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75  hs,rp->lhs->dtnu
1b4a0 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
1b4b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 70 72   rc = 1;.    spr
1b4c0 69 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6c 68  intf(zLhs, "yylh
1b4d0 73 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d  sminor.yy%d",rp-
1b4e0 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  >lhs->dtnum);.  
1b4f0 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28  }..  append_str(
1b500 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20  0,0,0,0);..  /* 
1b510 54 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74 20  This const cast 
1b520 69 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61 72  is wrong but har
1b530 6d 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65 20  mless, if we're 
1b540 63 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f  careful. */.  fo
1b550 72 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70 2d  r(cp=(char *)rp-
1b560 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
1b570 29 7b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 7a  ){.    if( cp==z
1b580 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 61 70  Skip ){.      ap
1b590 70 65 6e 64 5f 73 74 72 28 7a 4f 76 77 72 74 2c  pend_str(zOvwrt,
1b5a0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 63 70  0,0,0);.      cp
1b5b0 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28   += lemonStrlen(
1b5c0 7a 4f 76 77 72 74 29 2d 31 3b 0a 20 20 20 20 20  zOvwrt)-1;.     
1b5d0 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 31   dontUseRhs0 = 1
1b5e0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1b5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b600 49 53 41 4c 50 48 41 28 2a 63 70 29 20 26 26 20  ISALPHA(*cp) && 
1b610 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c  (cp==rp->code ||
1b620 20 28 21 49 53 41 4c 4e 55 4d 28 63 70 5b 2d 31   (!ISALNUM(cp[-1
1b630 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f  ]) && cp[-1]!='_
1b640 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ')) ){.      cha
1b650 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66  r saved;.      f
1b660 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 49  or(xp= &cp[1]; I
1b670 53 41 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c 20 2a  SALNUM(*xp) || *
1b680 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a  xp=='_'; xp++);.
1b690 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78        saved = *x
1b6a0 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30  p;.      *xp = 0
1b6b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
1b6c0 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63  lhsalias && strc
1b6d0 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69  mp(cp,rp->lhsali
1b6e0 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  as)==0 ){.      
1b6f0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68    append_str(zLh
1b700 73 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  s,0,0,0);.      
1b710 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
1b720 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
1b730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b740 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b750 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
1b760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70            if( rp
1b770 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
1b780 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72   strcmp(cp,rp->r
1b790 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29  hsalias[i])==0 )
1b7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1b7b0 28 20 69 3d 3d 30 20 26 26 20 64 6f 6e 74 55 73  ( i==0 && dontUs
1b7c0 65 52 68 73 30 20 29 7b 0a 20 20 20 20 20 20 20  eRhs0 ){.       
1b7d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
1b7e0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1b7f0 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
1b810 61 62 65 6c 20 25 73 20 75 73 65 64 20 61 66 74  abel %s used aft
1b820 65 72 20 27 25 73 27 2e 22 2c 0a 20 20 20 20 20  er '%s'.",.     
1b830 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
1b840 72 68 73 61 6c 69 61 73 5b 30 5d 2c 20 7a 4f 76  rhsalias[0], zOv
1b850 77 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wrt);.          
1b860 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1b870 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
1b880 20 20 7d 65 6c 73 65 20 69 66 28 20 63 70 21 3d    }else if( cp!=
1b890 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d  rp->code && cp[-
1b8a0 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20  1]=='@' ){.     
1b8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b8c0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  he argument is o
1b8d0 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68  f the form @X th
1b8e0 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a 20  en substituted. 
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1b900 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72  the token number
1b910 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76   of X, not the v
1b920 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20  alue of X */.   
1b930 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
1b940 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
1b950 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d  .major",-1,i-rp-
1b960 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20  >nrhs+1,0);.    
1b970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1b990 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1b9a0 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
1b9b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1b9c0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
1b9d0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
1b9e0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
1b9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ba00 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73     dtnum = sp->s
1ba10 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b  ubsym[0]->dtnum;
1ba20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1ba30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ba40 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
1ba50 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
1ba60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ba70 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
1ba80 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  r("yymsp[%d].min
1ba90 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d  or.yy%d",0,i-rp-
1baa0 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b  >nrhs+1, dtnum);
1bab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1bac0 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
1bad0 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
1bae0 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20  used[i] = 1;.   
1baf0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bb00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bb10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bb20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b      *xp = saved;
1bb30 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e  .    }.    appen
1bb40 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20  d_str(cp, 1, 0, 
1bb50 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  0);.  } /* End l
1bb60 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 69  oop */..  /* Mai
1bb70 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  n code generatio
1bb80 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 20  n completed */. 
1bb90 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72   cp = append_str
1bba0 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28  (0,0,0,0);.  if(
1bbb0 20 63 70 20 26 26 20 63 70 5b 30 5d 20 29 20 72   cp && cp[0] ) r
1bbc0 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66  p->code = Strsaf
1bbd0 65 28 63 70 29 3b 0a 20 20 61 70 70 65 6e 64 5f  e(cp);.  append_
1bbe0 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20  str(0,0,0,0);.. 
1bbf0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
1bc00 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68  e sure the LHS h
1bc10 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
1bc20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
1bc30 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29  as && !lhsused )
1bc40 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  {.    ErrorMsg(l
1bc50 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1bc60 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1bc70 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20    "Label \"%s\" 
1bc80 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
1bc90 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
1bca0 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
1bcb0 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  lias,rp->lhs->na
1bcc0 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  me,rp->lhsalias)
1bcd0 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
1bce0 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  rcnt++;.  }..  /
1bcf0 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
1bd00 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
1bd10 48 53 20 6d 69 6e 6f 72 20 76 61 6c 75 65 73 20  HS minor values 
1bd20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72 65  which are not re
1bd30 66 65 72 65 6e 63 65 64 2e 0a 20 20 2a 2a 20 47  ferenced..  ** G
1bd40 65 6e 65 72 61 74 65 20 65 72 72 6f 72 20 6d 65  enerate error me
1bd50 73 73 61 67 65 73 20 66 6f 72 20 75 6e 75 73 65  ssages for unuse
1bd60 64 20 6c 61 62 65 6c 73 20 61 6e 64 20 64 75 70  d labels and dup
1bd70 6c 69 63 61 74 65 20 6c 61 62 65 6c 73 2e 0a 20  licate labels.. 
1bd80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1bd90 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
1bda0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73  .    if( rp->rhs
1bdb0 61 6c 69 61 73 5b 69 5d 20 29 7b 0a 20 20 20 20  alias[i] ){.    
1bdc0 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
1bdd0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1bde0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
1bdf0 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 72  lias && strcmp(r
1be00 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
1be10 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
1be20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
1be30 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1be40 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1be50 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e,.            "
1be60 25 73 28 25 73 29 20 68 61 73 20 74 68 65 20 73  %s(%s) has the s
1be70 61 6d 65 20 6c 61 62 65 6c 20 61 73 20 74 68 65  ame label as the
1be80 20 4c 48 53 20 62 75 74 20 69 73 20 6e 6f 74 20   LHS but is not 
1be90 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 22 0a  the left-most ".
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 79 6d              "sym
1beb0 62 6f 6c 20 6f 6e 20 74 68 65 20 52 48 53 2e 22  bol on the RHS."
1bec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  ,.            rp
1bed0 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 20  ->rhs[i]->name, 
1bee0 72 70 2d 3e 72 68 73 61 6c 69 61 73 29 3b 0a 20  rp->rhsalias);. 
1bef0 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65           lemp->e
1bf00 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1bf10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
1bf20 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
1bf30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1bf40 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 20 26  p->rhsalias[j] &
1bf50 26 20 73 74 72 63 6d 70 28 72 70 2d 3e 72 68 73  & strcmp(rp->rhs
1bf60 61 6c 69 61 73 5b 6a 5d 2c 72 70 2d 3e 72 68 73  alias[j],rp->rhs
1bf70 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a  alias[i])==0 ){.
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f              Erro
1bf90 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1bfa0 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1bfb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bfc0 22 4c 61 62 65 6c 20 25 73 20 75 73 65 64 20 66  "Label %s used f
1bfd0 6f 72 20 6d 75 6c 74 69 70 6c 65 20 73 79 6d 62  or multiple symb
1bfe0 6f 6c 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ols on the RHS o
1bff0 66 20 61 20 72 75 6c 65 2e 22 2c 0a 20 20 20 20  f a rule.",.    
1c000 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1c010 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20  salias[i]);.    
1c020 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
1c030 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1c040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c060 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1c070 20 69 66 28 20 21 75 73 65 64 5b 69 5d 20 29 7b   if( !used[i] ){
1c080 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
1c090 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
1c0a0 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
1c0b0 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20           "Label 
1c0c0 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c  %s for \"%s(%s)\
1c0d0 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  " is never used.
1c0e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  ",.          rp-
1c0f0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d  >rhsalias[i],rp-
1c100 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70  >rhs[i]->name,rp
1c110 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
1c120 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
1c130 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1c140 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1c150 69 3e 30 20 26 26 20 68 61 73 5f 64 65 73 74 72  i>0 && has_destr
1c160 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d  uctor(rp->rhs[i]
1c170 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20  ,lemp) ){.      
1c180 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79  append_str("  yy
1c190 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70 50  _destructor(yypP
1c1a0 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b  arser,%d,&yymsp[
1c1b0 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20  %d].minor);\n", 
1c1c0 30 2c 0a 20 20 20 20 20 20 20 20 20 72 70 2d 3e  0,.         rp->
1c1d0 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d  rhs[i]->index,i-
1c1e0 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20  rp->nrhs+1);.   
1c1f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1c200 75 6e 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20  unable to write 
1c210 4c 48 53 20 76 61 6c 75 65 73 20 64 69 72 65 63  LHS values direc
1c220 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 73 74 61  tly into the sta
1c230 63 6b 2c 20 77 72 69 74 65 20 74 68 65 0a 20 20  ck, write the.  
1c240 2a 2a 20 73 61 76 65 64 20 4c 48 53 20 76 61 6c  ** saved LHS val
1c250 75 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  ue now. */.  if(
1c260 20 6c 68 73 64 69 72 65 63 74 3d 3d 30 20 29 7b   lhsdirect==0 ){
1c270 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28  .    append_str(
1c280 22 20 20 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  "  yymsp[%d].min
1c290 6f 72 2e 79 79 25 64 20 3d 20 22 2c 20 30 2c 20  or.yy%d = ", 0, 
1c2a0 31 2d 72 70 2d 3e 6e 72 68 73 2c 20 72 70 2d 3e  1-rp->nrhs, rp->
1c2b0 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20  lhs->dtnum);.   
1c2c0 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73   append_str(zLhs
1c2d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1c2e0 61 70 70 65 6e 64 5f 73 74 72 28 22 3b 5c 6e 22  append_str(";\n"
1c2f0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
1c300 0a 20 20 2f 2a 20 53 75 66 66 69 78 20 63 6f 64  .  /* Suffix cod
1c310 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d  e generation com
1c320 70 6c 65 74 65 20 2a 2f 0a 20 20 63 70 20 3d 20  plete */.  cp = 
1c330 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1c340 2c 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26  ,0);.  if( cp &&
1c350 20 63 70 5b 30 5d 20 29 7b 0a 20 20 20 20 72 70   cp[0] ){.    rp
1c360 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 3d 20 53  ->codeSuffix = S
1c370 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20 20 20  trsafe(cp);.    
1c380 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a  rp->noCode = 0;.
1c390 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c3a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1c3b0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1c3c0 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
1c3d0 20 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65   rule "rp" is re
1c3e0 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a  duced.  Write.**
1c3f0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75   the code to "ou
1c400 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c  t".  Make sure l
1c410 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74  ineno stays up-t
1c420 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41  o-date..*/.PRIVA
1c430 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64  TE void emit_cod
1c440 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a  e(.  FILE *out,.
1c450 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1c460 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  p,.  struct lemo
1c470 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a  n *lemp,.  int *
1c480 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74  lineno.){. const
1c490 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20   char *cp;.. /* 
1c4a0 53 65 74 75 70 20 63 6f 64 65 20 70 72 69 6f 72  Setup code prior
1c4b0 20 74 6f 20 74 68 65 20 23 6c 69 6e 65 20 64 69   to the #line di
1c4c0 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20  rective */. if( 
1c4d0 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 26  rp->codePrefix &
1c4e0 26 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  & rp->codePrefix
1c4f0 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74  [0] ){.   fprint
1c500 66 28 6f 75 74 2c 20 22 7b 25 73 22 2c 20 72 70  f(out, "{%s", rp
1c510 2d 3e 63 6f 64 65 50 72 65 66 69 78 29 3b 0a 20  ->codePrefix);. 
1c520 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
1c530 65 50 72 65 66 69 78 3b 20 2a 63 70 3b 20 63 70  ePrefix; *cp; cp
1c540 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c  ++){ if( *cp=='\
1c550 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
1c560 3b 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65  ; }. }.. /* Gene
1c570 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20  rate code to do 
1c580 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
1c590 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f  n */. if( rp->co
1c5a0 64 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c 65  de ){.   if( !le
1c5b0 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
1c5c0 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65  g ){.     (*line
1c5d0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74  no)++;.     tplt
1c5e0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d  _linedir(out,rp-
1c5f0 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  >line,lemp->file
1c600 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20 66  name);.   }.   f
1c610 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22  printf(out,"{%s"
1c620 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66  ,rp->code);.   f
1c630 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20  or(cp=rp->code; 
1c640 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20  *cp; cp++){ if( 
1c650 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1c660 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 66 70  neno)++; }.   fp
1c670 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
1c680 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
1c690 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c    if( !lemp->nol
1c6a0 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20  inenosflag ){.  
1c6b0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
1c6c0 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69       tplt_linedi
1c6d0 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
1c6e0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20  mp->outname);.  
1c6f0 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72   }. }.. /* Gener
1c700 61 74 65 20 62 72 65 61 6b 64 6f 77 6e 20 63 6f  ate breakdown co
1c710 64 65 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  de that occurs a
1c720 66 74 65 72 20 74 68 65 20 23 6c 69 6e 65 20 64  fter the #line d
1c730 69 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28  irective */. if(
1c740 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20   rp->codeSuffix 
1c750 26 26 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69  && rp->codeSuffi
1c760 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e  x[0] ){.   fprin
1c770 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 72 70  tf(out, "%s", rp
1c780 2d 3e 63 6f 64 65 53 75 66 66 69 78 29 3b 0a 20  ->codeSuffix);. 
1c790 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
1c7a0 65 53 75 66 66 69 78 3b 20 2a 63 70 3b 20 63 70  eSuffix; *cp; cp
1c7b0 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c  ++){ if( *cp=='\
1c7c0 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
1c7d0 3b 20 7d 0a 20 7d 0a 0a 20 69 66 28 20 72 70 2d  ; }. }.. if( rp-
1c7e0 3e 63 6f 64 65 50 72 65 66 69 78 20 29 7b 0a 20  >codePrefix ){. 
1c7f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c800 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  }\n"); (*lineno)
1c810 2b 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75 72 6e 3b  ++;. }.. return;
1c820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
1c830 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  the definition o
1c840 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64  f the union used
1c850 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27   for the parser'
1c860 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a  s data stack..**
1c870 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74   This union cont
1c880 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20  ains fields for 
1c890 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64  every possible d
1c8a0 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b  ata type for tok
1c8b0 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65  ens.** and nonte
1c8c0 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65  rminals.  In the
1c8d0 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70   process of comp
1c8e0 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69  uting and printi
1c8f0 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e  ng this.** union
1c900 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22  , also set the "
1c910 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
1c920 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20   every terminal 
1c930 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a  and nonterminal.
1c940 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f  ** symbol..*/.vo
1c950 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75  id print_stack_u
1c960 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75  nion(.  FILE *ou
1c970 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1c980 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
1c990 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74  t stream */.  st
1c9a0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1c9b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1c9c0 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63   main info struc
1c9d0 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 70 61  ture for this pa
1c9e0 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rser */.  int *p
1c9f0 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20  lineno,         
1ca00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ca10 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   to the line num
1ca20 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66  ber */.  int mhf
1ca30 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1ca40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ca50 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68  generating makeh
1ca60 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f  eaders output */
1ca70 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  .){.  int lineno
1ca80 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20   = *plineno;    
1ca90 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62  /* The line numb
1caa0 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  er of the output
1cab0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70   */.  char **typ
1cac0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1cad0 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20  /* A hash table 
1cae0 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a  of datatypes */.
1caf0 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b    int arraysize;
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1cb10 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65  ize of the "type
1cb20 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  s" array */.  in
1cb30 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20  t maxdtlength;  
1cb40 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1cb50 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79  um length of any
1cb60 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65   ".datatype" fie
1cb70 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  ld. */.  char *s
1cb80 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20  tddt;           
1cb90 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a     /* Standardiz
1cba0 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61  ed name for a da
1cbb0 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20  tatype */.  int 
1cbc0 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  i,j;            
1cbd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1cbe0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73 69  unters */.  unsi
1cbf0 67 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20 20  gned hash;      
1cc00 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73        /* For has
1cc10 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  hing the name of
1cc20 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e   a type */.  con
1cc30 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  st char *name;  
1cc40 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1cc50 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
1cc60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1cc70 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79  nd initialize ty
1cc80 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61  pes[] and alloca
1cc90 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20  te stddt[] */.  
1cca0 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70  arraysize = lemp
1ccb0 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20  ->nsymbol * 2;. 
1ccc0 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a   types = (char**
1ccd0 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69  )calloc( arraysi
1cce0 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ze, sizeof(char*
1ccf0 29 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73  ) );.  if( types
1cd00 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
1cd10 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
1cd20 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
1cd30 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
1cd40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
1cd50 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70  aysize; i++) typ
1cd60 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78  es[i] = 0;.  max
1cd70 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20  dtlength = 0;.  
1cd80 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70  if( lemp->vartyp
1cd90 65 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65  e ){.    maxdtle
1cda0 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  ngth = lemonStrl
1cdb0 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  en(lemp->vartype
1cdc0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1cdd0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1cde0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
1cdf0 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74   len;.    struct
1ce00 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
1ce10 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
1ce20 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61      if( sp->data
1ce30 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  type==0 ) contin
1ce40 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65  ue;.    len = le
1ce50 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61  monStrlen(sp->da
1ce60 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  tatype);.    if(
1ce70 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68   len>maxdtlength
1ce80 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d   ) maxdtlength =
1ce90 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64   len;.  }.  stdd
1cea0 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  t = (char*)mallo
1ceb0 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32  c( maxdtlength*2
1cec0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74   + 1 );.  if( st
1ced0 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ddt==0 ){.    fp
1cee0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
1cef0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
1cf00 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1cf10 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61   }..  /* Build a
1cf20 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64   hash table of d
1cf30 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e  atatypes. The ".
1cf40 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
1cf50 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a  each symbol.  **
1cf60 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
1cf70 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65  th the hash inde
1cf80 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64  x plus 1.  A ".d
1cf90 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30  tnum" value of 0
1cfa0 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f   is.  ** used fo
1cfb0 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  r terminal symbo
1cfc0 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ls.  If there is
1cfd0 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70   no %default_typ
1cfe0 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20  e defined then. 
1cff0 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73   ** 0 is also us
1d000 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d  ed as the .dtnum
1d010 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65   value for nonte
1d020 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f  rminals which do
1d030 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a   not specify.  *
1d040 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69  * a datatype usi
1d050 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72  ng the %type dir
1d060 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66  ective..  */.  f
1d070 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d080 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1d090 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1d0a0 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
1d0b0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61  bols[i];.    cha
1d0c0 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73  r *cp;.    if( s
1d0d0 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20  p==lemp->errsym 
1d0e0 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1d0f0 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31  um = arraysize+1
1d100 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1d110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d120 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52  sp->type!=NONTER
1d130 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61  MINAL || (sp->da
1d140 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d  tatype==0 && lem
1d150 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29  p->vartype==0) )
1d160 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
1d170 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  m = 0;.      con
1d180 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1d190 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79   cp = sp->dataty
1d1a0 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d  pe;.    if( cp==
1d1b0 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76  0 ) cp = lemp->v
1d1c0 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20  artype;.    j = 
1d1d0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 53  0;.    while( IS
1d1e0 53 50 41 43 45 28 2a 63 70 29 20 29 20 63 70 2b  SPACE(*cp) ) cp+
1d1f0 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63  +;.    while( *c
1d200 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d  p ) stddt[j++] =
1d210 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c   *cp++;.    whil
1d220 65 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41 43  e( j>0 && ISSPAC
1d230 45 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20  E(stddt[j-1]) ) 
1d240 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a  j--;.    stddt[j
1d250 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  ] = 0;.    if( l
1d260 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26  emp->tokentype &
1d270 26 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20  & strcmp(stddt, 
1d280 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29  lemp->tokentype)
1d290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  ==0 ){.      sp-
1d2a0 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  >dtnum = 0;.    
1d2b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1d2c0 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a  }.    hash = 0;.
1d2d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64      for(j=0; std
1d2e0 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  dt[j]; j++){.   
1d2f0 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35     hash = hash*5
1d300 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20  3 + stddt[j];.  
1d310 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28    }.    hash = (
1d320 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66  hash & 0x7ffffff
1d330 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20  f)%arraysize;.  
1d340 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68    while( types[h
1d350 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66  ash] ){.      if
1d360 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68  ( strcmp(types[h
1d370 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29  ash],stddt)==0 )
1d380 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74  {.        sp->dt
1d390 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a  num = hash + 1;.
1d3a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73       }.      has
1d3c0 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68  h++;.      if( h
1d3d0 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29 61  ash>=(unsigned)a
1d3e0 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20  rraysize ) hash 
1d3f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1d400 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
1d410 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
1d420 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
1d430 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73  .      types[has
1d440 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  h] = (char*)mall
1d450 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
1d460 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20  stddt)+1 );.    
1d470 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
1d480 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
1d490 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1d4a0 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
1d4b0 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
1d4c0 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
1d4d0 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
1d4e0 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
1d4f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
1d500 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68   /* Print out th
1d510 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1d520 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20  YYTOKENTYPE and 
1d530 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20  YYMINORTYPE */. 
1d540 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61   name = lemp->na
1d550 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me ? lemp->name 
1d560 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e  : "Parse";.  lin
1d570 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a  eno = *plineno;.
1d580 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
1d590 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
1d5a0 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
1d5b0 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70  lineno++; }.  fp
1d5c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d5d0 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25  ne %sTOKENTYPE %
1d5e0 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c  s\n",name,.    l
1d5f0 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c  emp->tokentype?l
1d600 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22  emp->tokentype:"
1d610 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f  void*");  lineno
1d620 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  ++;.  if( mhflag
1d630 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1d640 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1d650 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e  eno++; }.  fprin
1d660 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20  tf(out,"typedef 
1d670 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e  union {\n"); lin
1d680 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1d690 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e  (out,"  int yyin
1d6a0 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  it;\n"); lineno+
1d6b0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1d6c0 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ,"  %sTOKENTYPE 
1d6d0 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  yy0;\n",name); l
1d6e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1d6f0 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b  =0; i<arraysize;
1d700 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74   i++){.    if( t
1d710 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ypes[i]==0 ) con
1d720 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1d730 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25  tf(out,"  %s yy%
1d740 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69  d;\n",types[i],i
1d750 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +1); lineno++;. 
1d760 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d     free(types[i]
1d770 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  );.  }.  if( lem
1d780 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e  p->errsym->useCn
1d790 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  t ){.    fprintf
1d7a0 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64  (out,"  int yy%d
1d7b0 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  ;\n",lemp->errsy
1d7c0 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
1d7d0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  o++;.  }.  free(
1d7e0 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74  stddt);.  free(t
1d7f0 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66  ypes);.  fprintf
1d800 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54  (out,"} YYMINORT
1d810 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  YPE;\n"); lineno
1d820 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d  ++;.  *plineno =
1d830 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a   lineno;.}../*.*
1d840 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1d850 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70  e of a C datatyp
1d860 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73  e able to repres
1d870 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65  ent values betwe
1d880 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70  en.** lwr and up
1d890 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 49  r, inclusive.  I
1d8a0 66 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20 74  f pnByte!=NULL t
1d8b0 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20 74  hen also write t
1d8c0 68 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72  he sizeof.** for
1d8d0 20 74 68 61 74 20 74 79 70 65 20 28 31 2c 20 32   that type (1, 2
1d8e0 2c 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70 6e  , or 4) into *pn
1d8f0 42 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Byte..*/.static 
1d900 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
1d910 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
1d920 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20  t lwr, int upr, 
1d930 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20  int *pnByte){.  
1d940 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
1d950 65 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e 74  e = "int";.  int
1d960 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66   nByte = 4;.  if
1d970 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ( lwr>=0 ){.    
1d980 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a  if( upr<=255 ){.
1d990 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75        zType = "u
1d9a0 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  nsigned char";. 
1d9b0 20 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a       nByte = 1;.
1d9c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70      }else if( up
1d9d0 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20  r<65535 ){.     
1d9e0 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e   zType = "unsign
1d9f0 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20  ed short int";. 
1da00 20 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a       nByte = 2;.
1da10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e   zType = "unsign
1da30 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e  ed int";.      n
1da40 42 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d 0a  Byte = 4;.    }.
1da50 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1da60 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32  =-127 && upr<=12
1da70 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  7 ){.    zType =
1da80 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a   "signed char";.
1da90 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20      nByte = 1;. 
1daa0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1dab0 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32  -32767 && upr<32
1dac0 37 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  767 ){.    zType
1dad0 20 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20 20   = "short";.    
1dae0 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a 20  nByte = 2;.  }. 
1daf0 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70   if( pnByte ) *p
1db00 6e 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a 20  nByte = nByte;. 
1db10 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
1db20 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61  ../*.** Each sta
1db30 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65  te contains a se
1db40 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73  t of token trans
1db50 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74  action and a set
1db60 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e   of.** nontermin
1db70 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  al transactions.
1db80 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20    Each of these 
1db90 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e  sets makes an in
1dba0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  stance.** of the
1dbb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1dbc0 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20  ture.  An array 
1dbd0 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
1dbe0 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74  res is used.** t
1dbf0 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61  o order the crea
1dc00 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20  tion of entries 
1dc10 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  in the yy_action
1dc20 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  [] table..*/.str
1dc30 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74  uct axset {.  st
1dc40 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1dc50 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20     /* A pointer 
1dc60 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20  to a state */.  
1dc70 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20  int isTkn;      
1dc80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1dc90 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c  use tokens.  Fal
1dca0 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69  se for non-termi
1dcb0 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  nals */.  int nA
1dcc0 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f  ction;         /
1dcd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  * Number of acti
1dce0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72  ons */.  int iOr
1dcf0 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
1dd00 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20   Original order 
1dd10 6f 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a  of action sets *
1dd20 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.};../*.** Comp
1dd30 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72  are to axset str
1dd40 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74  uctures for sort
1dd50 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
1dd60 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74  static int axset
1dd70 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  _compare(const v
1dd80 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
1dd90 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74  id *b){.  struct
1dda0 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74   axset *p1 = (st
1ddb0 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20  ruct axset*)a;. 
1ddc0 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70   struct axset *p
1ddd0 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65  2 = (struct axse
1dde0 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  t*)b;.  int c;. 
1ddf0 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e   c = p2->nAction
1de00 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a   - p1->nAction;.
1de10 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1de20 20 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65 72    c = p1->iOrder
1de30 20 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a 20   - p2->iOrder;. 
1de40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d   }.  assert( c!=
1de50 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20  0 || p1==p2 );. 
1de60 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
1de70 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f  .** Write text o
1de80 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73  n "out" that des
1de90 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20  cribes the rule 
1dea0 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "rp"..*/.static 
1deb0 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65  void writeRuleTe
1dec0 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74  xt(FILE *out, st
1ded0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
1dee0 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e    int j;.  fprin
1def0 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c  tf(out,"%s ::=",
1df00 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b   rp->lhs->name);
1df10 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70  .  for(j=0; j<rp
1df20 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nrhs; j++){.  
1df30 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1df40 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d  *sp = rp->rhs[j]
1df50 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
1df60 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe!=MULTITERMINA
1df70 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
1df80 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
1df90 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  ->name);.    }el
1dfa0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  se{.      int k;
1dfb0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1dfc0 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75  ut," %s", sp->su
1dfd0 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[0]->name);.
1dfe0 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
1dff0 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b  <sp->nsubsym; k+
1e000 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
1e010 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70  ntf(out,"|%s",sp
1e020 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d  ->subsym[k]->nam
1e030 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e040 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e  }.  }.}.../* Gen
1e050 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63  erate C source c
1e060 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
1e070 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
1e080 74 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74  tTable(.  struct
1e090 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
1e0a0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f  int mhflag     /
1e0b0 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65  * Output in make
1e0c0 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69  headers format i
1e0d0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46  f true */.){.  F
1e0e0 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1e0f0 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1e100 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e  IZE];.  int  lin
1e110 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74  eno;.  struct st
1e120 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1e130 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
1e140 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1e150 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61  ;.  struct actta
1e160 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e  b *pActtab;.  in
1e170 74 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20  t i, j, n, sz;. 
1e180 20 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79 70   int szActionTyp
1e190 65 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66  e;     /* sizeof
1e1a0 28 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20 2a  (YYACTIONTYPE) *
1e1b0 2f 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54 79  /.  int szCodeTy
1e1c0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 7a  pe;       /* siz
1e1d0 65 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29 20  eof(YYCODETYPE) 
1e1e0 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
1e1f0 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d  r *name;.  int m
1e200 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f  nTknOfst, mxTknO
1e210 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f  fst;.  int mnNtO
1e220 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20  fst, mxNtOfst;. 
1e230 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61   struct axset *a
1e240 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f  x;..  in = tplt_
1e250 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66  open(lemp);.  if
1e260 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
1e270 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  ;.  out = file_o
1e280 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77  pen(lemp,".c","w
1e290 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
1e2a0 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28  0 ){.    fclose(
1e2b0 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  in);.    return;
1e2c0 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  .  }.  lineno = 
1e2d0 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  1;.  tplt_xfer(l
1e2e0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e2f0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e300 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e   Generate the in
1e310 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61  clude code, if a
1e320 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ny */.  tplt_pri
1e330 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1e340 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e  ->include,&linen
1e350 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  o);.  if( mhflag
1e360 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e   ){.    char *in
1e370 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  cName = file_mak
1e380 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1e390 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1e3a0 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1e3b0 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29  s\"\n", incName)
1e3c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1e3d0 66 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20  free(incName);. 
1e3e0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1e3f0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e400 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e410 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
1e420 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
1e430 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
1e440 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  g ){.    const c
1e450 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
1e460 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1e470 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1e480 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
1e490 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1e4a0 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1e4b0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1e4c0 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e4e0 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1e4f0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1e500 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1e510 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1e520 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1e530 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1e540 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1e550 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1e560 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1e570 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1e580 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1e590 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1e5a0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1e5b0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1e5c0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1e5d0 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
1e5e0 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
1e5f0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
1e600 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
1e610 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1e620 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
1e630 6d 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54  mbol+1, &szCodeT
1e640 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ype)); lineno++;
1e650 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1e660 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45  #define YYNOCODE
1e670 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79   %d\n",lemp->nsy
1e680 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f  mbol+1);  lineno
1e690 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1e6a0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54  t,"#define YYACT
1e6b0 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  IONTYPE %s\n",. 
1e6c0 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1e6d0 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6e 73 74  type(0,lemp->nst
1e6e0 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a  ate+lemp->nrule*
1e6f0 32 2b 35 2c 26 73 7a 41 63 74 69 6f 6e 54 79 70  2+5,&szActionTyp
1e700 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e)); lineno++;. 
1e710 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63   if( lemp->wildc
1e720 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ard ){.    fprin
1e730 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1e740 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22  YYWILDCARD %d\n"
1e750 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77  ,.       lemp->w
1e760 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b  ildcard->index);
1e770 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1e780 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69   print_stack_uni
1e790 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e  on(out,lemp,&lin
1e7a0 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66  eno,mhflag);.  f
1e7b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66  printf(out, "#if
1e7c0 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54  ndef YYSTACKDEPT
1e7d0 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  H\n"); lineno++;
1e7e0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
1e7f0 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70  cksize ){.    fp
1e800 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1e810 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1e820 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
1e830 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
1e840 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1e850 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1e860 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
1e870 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
1e880 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1e890 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66  ntf(out, "#endif
1e8a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1e8b0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1e8c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e8d0 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1e8e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1e8f0 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  }.  name = lemp-
1e900 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1e910 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1e920 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26  if( lemp->arg &&
1e930 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b   lemp->arg[0] ){
1e940 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74  .    i = lemonSt
1e950 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
1e960 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1e970 20 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d 70   && ISSPACE(lemp
1e980 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
1e990 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
1e9a0 3d 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c  =1 && (ISALNUM(l
1e9b0 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
1e9c0 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
1e9d0 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
1e9e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e9f0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1ea00 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
1ea10 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1ea20 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1ea30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1ea40 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
1ea50 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1ea60 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ea70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ea80 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1ea90 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
1eaa0 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
1eab0 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1eac0 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
1ead0 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1eae0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1eaf0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1eb00 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
1eb10 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
1eb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb30 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
1eb40 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
1eb50 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1eb60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1eb70 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1eb80 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
1eb90 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1eba0 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1ebb0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1ebc0 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
1ebd0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ebe0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ebf0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1ec00 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
1ec10 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1ec20 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1ec30 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
1ec40 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1ec50 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
1ec60 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1ec70 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1ec80 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1ec90 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1eca0 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1ecb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ecc0 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42  fine YYERRORSYMB
1ecd0 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  OL %d\n",lemp->e
1ece0 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c  rrsym->index); l
1ecf0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1ed00 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1ed10 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25  e YYERRSYMDT yy%
1ed20 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1ed30 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
1ed40 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1ed50 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1ed60 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  k ){.    fprintf
1ed70 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1ed80 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20  FALLBACK 1\n"); 
1ed90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a   lineno++;.  }..
1eda0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1edb0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62   action table, b
1edc0 75 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74  ut do not output
1edd0 20 69 74 20 79 65 74 2e 20 20 54 68 65 20 61 63   it yet.  The ac
1ede0 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20  tion.  ** table 
1edf0 6d 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64  must be computed
1ee00 20 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69   before generati
1ee10 6e 67 20 74 68 65 20 59 59 4e 53 54 41 54 45 20  ng the YYNSTATE 
1ee20 6d 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20  macro because.  
1ee30 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  ** we need to kn
1ee40 6f 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74  ow how many stat
1ee50 65 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e  es can be elimin
1ee60 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20  ated..  */.  ax 
1ee70 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20  = (struct axset 
1ee80 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e  *) calloc(lemp->
1ee90 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  nxstate*2, sizeo
1eea0 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28  f(ax[0]));.  if(
1eeb0 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   ax==0 ){.    fp
1eec0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
1eed0 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
1eee0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1eef0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
1ef00 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b  emp->nxstate; i+
1ef10 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
1ef20 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1ef30 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d     ax[i*2].stp =
1ef40 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
1ef50 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20  ].isTkn = 1;.   
1ef60 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e   ax[i*2].nAction
1ef70 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b   = stp->nTknAct;
1ef80 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73  .    ax[i*2+1].s
1ef90 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1efa0 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20  [i*2+1].isTkn = 
1efb0 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  0;.    ax[i*2+1]
1efc0 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1efd0 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78  nNtAct;.  }.  mx
1efe0 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f  TknOfst = mnTknO
1eff0 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f  fst = 0;.  mxNtO
1f000 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst = mnNtOfst =
1f010 20 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65   0;.  /* In an e
1f020 66 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a  ffort to minimiz
1f030 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1f040 6c 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65  le size, use the
1f050 20 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20   heuristic.  ** 
1f060 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c  of placing the l
1f070 61 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65  argest action se
1f080 74 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f  ts first */.  fo
1f090 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1f0a0 78 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61  xstate*2; i++) a
1f0b0 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b  x[i].iOrder = i;
1f0c0 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d  .  qsort(ax, lem
1f0d0 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69  p->nxstate*2, si
1f0e0 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73  zeof(ax[0]), axs
1f0f0 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70  et_compare);.  p
1f100 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f  Acttab = acttab_
1f110 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
1f120 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74  =0; i<lemp->nxst
1f130 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e  ate*2 && ax[i].n
1f140 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a  Action>0; i++){.
1f150 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e      stp = ax[i].
1f160 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b  stp;.    if( ax[
1f170 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20  i].isTkn ){.    
1f180 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1f190 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1f1a0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1f1b0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1f1c0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1f1d0 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  x>=lemp->ntermin
1f1e0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1f1f0 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1f200 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1f210 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1f220 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1f230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f240 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1f250 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1f260 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1f270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f280 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
1f290 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
1f2a0 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66  cttab);.      if
1f2b0 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c  ( stp->iTknOfst<
1f2c0 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b  mnTknOfst ) mnTk
1f2d0 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1f2e0 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nOfst;.      if(
1f2f0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d   stp->iTknOfst>m
1f300 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e  xTknOfst ) mxTkn
1f310 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1f320 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ofst;.    }else{
1f330 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
1f340 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1f350 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1f360 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
1f370 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1f380 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1f390 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
1f3a0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
1f3b0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
1f3c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f  mp->nsymbol ) co
1f3d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1f3e0 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1f3f0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1f400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1f410 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1f420 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1f430 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1f440 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1f450 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1f460 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e   }.      stp->iN
1f470 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  tOfst = acttab_i
1f480 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a  nsert(pActtab);.
1f490 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1f4a0 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20  NtOfst<mnNtOfst 
1f4b0 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mnNtOfst = stp
1f4c0 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20  ->iNtOfst;.     
1f4d0 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1f4e0 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e  t>mxNtOfst ) mxN
1f4f0 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1f500 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20  Ofst;.    }.#if 
1f510 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20  0  /* Uncomment 
1f520 66 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20 68  for a trace of h
1f530 6f 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ow the yy_action
1f540 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f  [] table fills o
1f550 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20  ut */.    { int 
1f560 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f  jj, nn;.      fo
1f570 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41  r(jj=nn=0; jj<pA
1f580 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20  cttab->nAction; 
1f590 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
1f5a0 66 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74  f( pActtab->aAct
1f5b0 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30  ion[jj].action<0
1f5c0 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d   ) nn++;.      }
1f5d0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
1f5e0 34 64 3a 20 53 74 61 74 65 20 25 33 64 20 25 73  4d: State %3d %s
1f5f0 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35   n: %2d size: %5
1f600 64 20 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c  d freespace: %d\
1f610 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f620 20 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75   i, stp->statenu
1f630 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f  m, ax[i].isTkn ?
1f640 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20   "Token" : "Var 
1f650 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ",.            
1f660 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20   ax[i].nAction, 
1f670 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e  pActtab->nAction
1f680 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  , nn);.    }.#en
1f690 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61  dif.  }.  free(a
1f6a0 78 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72  x);..  /* Mark r
1f6b0 75 6c 65 73 20 74 68 61 74 20 61 72 65 20 61 63  ules that are ac
1f6c0 74 75 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20  tually used for 
1f6d0 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61  reduce actions a
1f6e0 66 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70  fter all.  ** op
1f6f0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65  timizations have
1f700 20 62 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20   been applied.  
1f710 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1f720 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1f730 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65  p->next) rp->doe
1f740 73 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  sReduce = LEMON_
1f750 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30  FALSE;.  for(i=0
1f760 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
1f770 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
1f780 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  (ap=lemp->sorted
1f790 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  [i]->ap; ap; ap=
1f7a0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1f7b0 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
1f7c0 45 44 55 43 45 20 7c 7c 20 61 70 2d 3e 74 79 70  EDUCE || ap->typ
1f7d0 65 3d 3d 53 48 49 46 54 52 45 44 55 43 45 20 29  e==SHIFTREDUCE )
1f7e0 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e  {.        ap->x.
1f7f0 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d  rp->doesReduce =
1f800 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f810 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
1f820 73 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65  sh rendering the
1f830 20 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74   constants now t
1f840 68 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74  hat the action t
1f850 61 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  able has.  ** be
1f860 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20  en computed */. 
1f870 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1f880 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20  efine YYNSTATE  
1f890 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
1f8a0 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b  ,lemp->nxstate);
1f8b0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1f8c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1f8d0 6e 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20  ne YYNRULE      
1f8e0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65          %d\n",le
1f8f0 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e  mp->nrule);  lin
1f900 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1f910 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1f920 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20 20  _MAX_SHIFT      
1f930 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e     %d\n",lemp->n
1f940 78 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e  xstate-1); linen
1f950 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1f960 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
1f970 49 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20 20  IN_SHIFTREDUCE  
1f980 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74   %d\n",lemp->nst
1f990 61 74 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ate); lineno++;.
1f9a0 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61    i = lemp->nsta
1f9b0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1f9c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1f9d0 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f  "#define YY_MAX_
1f9e0 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64  SHIFTREDUCE   %d
1f9f0 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e  \n", i-1); linen
1fa00 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1fa10 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
1fa20 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20  IN_REDUCE       
1fa30 20 25 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65   %d\n", i); line
1fa40 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70  no++;.  i = lemp
1fa50 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
1fa60 3e 6e 72 75 6c 65 2a 32 3b 0a 20 20 66 70 72 69  >nrule*2;.  fpri
1fa70 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fa80 20 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20   YY_MAX_REDUCE  
1fa90 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31        %d\n", i-1
1faa0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1fab0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fac0 69 6e 65 20 59 59 5f 45 52 52 4f 52 5f 41 43 54  ine YY_ERROR_ACT
1fad0 49 4f 4e 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  ION      %d\n", 
1fae0 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  i); lineno++;.  
1faf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1fb00 66 69 6e 65 20 59 59 5f 41 43 43 45 50 54 5f 41  fine YY_ACCEPT_A
1fb10 43 54 49 4f 4e 20 20 20 20 20 25 64 5c 6e 22 2c  CTION     %d\n",
1fb20 20 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   i+1); lineno++;
1fb30 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1fb40 23 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41 43  #define YY_NO_AC
1fb50 54 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64 5c  TION         %d\
1fb60 6e 22 2c 20 69 2b 32 29 3b 20 6c 69 6e 65 6e 6f  n", i+2); lineno
1fb70 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
1fb80 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1fb90 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1fba0 2a 20 4e 6f 77 20 6f 75 74 70 75 74 20 74 68 65  * Now output the
1fbb0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e   action table an
1fbc0 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 73  d its associates
1fbd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f  :.  **.  **  yy_
1fbe0 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20  action[]        
1fbf0 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63  A single table c
1fc00 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63  ontaining all ac
1fc10 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  tions..  **  yy_
1fc20 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20  lookahead[]     
1fc30 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  A table containi
1fc40 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  ng the lookahead
1fc50 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20   for each entry 
1fc60 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  in.  **         
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 79 79 5f 61              yy_a
1fc80 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f 20  ction.  Used to 
1fc90 64 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c 6c  detect hash coll
1fca0 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79  isions..  **  yy
1fcb0 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20  _shift_ofst[]   
1fcc0 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
1fcd0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
1fce0 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
1fcf0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1fd00 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
1fd10 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a   terminals..  **
1fd20 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74    yy_reduce_ofst
1fd30 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73 74  []   For each st
1fd40 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20  ate, the offset 
1fd50 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66  into yy_action f
1fd60 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  or.  **         
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
1fd80 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ting non-termina
1fd90 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75 63  ls after a reduc
1fda0 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66 61  e..  **  yy_defa
1fdb0 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66 61  ult[]       Defa
1fdc0 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 65  ult action for e
1fdd0 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ach state..  */.
1fde0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1fdf0 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
1fe00 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 61 63 74   */.  lemp->nact
1fe10 69 6f 6e 74 61 62 20 3d 20 6e 20 3d 20 61 63 74  iontab = n = act
1fe20 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62  tab_size(pActtab
1fe30 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65  );.  lemp->table
1fe40 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69  size += n*szActi
1fe50 6f 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74  onType;.  fprint
1fe60 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1fe70 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28  Y_ACTTAB_COUNT (
1fe80 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65  %d)\n", n); line
1fe90 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1fea0 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73  out,"static cons
1feb0 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
1fec0 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e  y_action[] = {\n
1fed0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1fee0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1fef0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1ff00 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1ff10 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1ff20 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1ff30 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1ff40 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1ff50 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1ff60 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1ff70 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1ff80 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1ff90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ffa0 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1ffb0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1ffc0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1ffd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1ffe0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1fff0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
20000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
20010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
20020 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
20030 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
20040 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
20050 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
20060 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 74 61 62  e */.  lemp->tab
20070 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 43 6f  lesize += n*szCo
20080 64 65 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74  deType;.  fprint
20090 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f  f(out,"static co
200a0 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79  nst YYCODETYPE y
200b0 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20  y_lookahead[] = 
200c0 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
200d0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
200e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
200f0 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c   la = acttab_yyl
20100 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62  ookahead(pActtab
20110 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61  , i);.    if( la
20120 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e  <0 ) la = lemp->
20130 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28  nsymbol;.    if(
20140 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
20150 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
20160 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
20170 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
20180 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d   la);.    if( j=
20190 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
201a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
201b0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
201c0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
201d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
201e0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
201f0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
20200 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
20210 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
20220 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  the yy_shift_ofs
20230 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e  t[] table */.  n
20240 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
20250 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
20260 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
20270 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e  -1]->iTknOfst==N
20280 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
20290 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
202a0 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
202b0 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e  _USE_DFLT (%d)\n
202c0 22 2c 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e  ", lemp->naction
202d0 74 61 62 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  tab); lineno++;.
202e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
202f0 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
20300 5f 43 4f 55 4e 54 20 20 20 20 28 25 64 29 5c 6e  _COUNT    (%d)\n
20310 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  ", n-1); lineno+
20320 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
20330 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48  , "#define YY_SH
20340 49 46 54 5f 4d 49 4e 20 20 20 20 20 20 28 25 64  IFT_MIN      (%d
20350 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29  )\n", mnTknOfst)
20360 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
20370 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
20380 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58  ine YY_SHIFT_MAX
20390 20 20 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d        (%d)\n", m
203a0 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  xTknOfst); linen
203b0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
203c0 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
203d0 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66  t %s yy_shift_of
203e0 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20  st[] = {\n",.   
203f0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
20400 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2c  _type(mnTknOfst,
20410 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c   lemp->nterminal
20420 2b 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61  +lemp->nactionta
20430 62 2c 20 26 73 7a 29 29 3b 0a 20 20 20 20 20 20  b, &sz));.      
20440 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d   lineno++;.  lem
20450 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20  p->tablesize += 
20460 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  n*sz;.  for(i=j=
20470 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
20480 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
20490 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
204a0 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
204b0 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
204c0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
204d0 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
204e0 3d 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74  = lemp->nactiont
204f0 61 62 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ab;.    if( j==0
20500 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
20510 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
20520 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20530 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
20540 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
20550 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
20560 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20570 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
20580 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
20590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
205a0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
205b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
205c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
205d0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
205e0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
205f0 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
20600 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
20610 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53 45  ne YY_REDUCE_USE
20620 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
20630 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  nNtOfst-1); line
20640 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
20650 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69  ->nxstate;.  whi
20660 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
20670 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e  >sorted[n-1]->iN
20680 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  tOfst==NO_OFFSET
20690 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
206a0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
206b0 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20  YY_REDUCE_COUNT 
206c0 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
206d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
206e0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
206f0 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20   YY_REDUCE_MIN  
20700 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
20710 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  st); lineno++;. 
20720 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
20730 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
20740 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
20750 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mxNtOfst); linen
20760 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
20770 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
20780 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f  t %s yy_reduce_o
20790 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20  fst[] = {\n",.  
207a0 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
207b0 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66  size_type(mnNtOf
207c0 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c 20  st-1, mxNtOfst, 
207d0 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  &sz)); lineno++;
207e0 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
207f0 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f  ze += n*sz;.  fo
20800 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
20810 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
20820 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
20830 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
20840 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74   ofst = stp->iNt
20850 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
20860 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
20870 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  ofst = mnNtOfst 
20880 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
20890 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
208a0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
208b0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
208c0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
208d0 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
208e0 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
208f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20900 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
20910 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
20920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20930 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
20940 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
20950 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
20960 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
20970 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
20980 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
20990 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
209a0 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
209b0 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  YPE yy_default[]
209c0 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
209d0 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
209e0 6e 78 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d  nxstate;.  lemp-
209f0 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
20a00 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20  szActionType;.  
20a10 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
20a20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
20a30 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
20a40 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
20a50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
20a60 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
20a70 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20a80 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44  " %4d,", stp->iD
20a90 66 6c 74 52 65 64 75 63 65 2b 6c 65 6d 70 2d 3e  fltReduce+lemp->
20aa0 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
20ab0 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  le);.    if( j==
20ac0 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
20ad0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
20ae0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
20af0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
20b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b10 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
20b20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20b30 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
20b40 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
20b50 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
20b60 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
20b70 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
20b80 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74  le of fallback t
20b90 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  okens..  */.  if
20ba0 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
20bb0 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  back ){.    int 
20bc0 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d  mx = lemp->nterm
20bd0 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68  inal - 1;.    wh
20be0 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d  ile( mx>0 && lem
20bf0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e  p->symbols[mx]->
20c00 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d  fallback==0 ){ m
20c10 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65 6d 70 2d  x--; }.    lemp-
20c20 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 28 6d  >tablesize += (m
20c30 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79 70 65 3b  x+1)*szCodeType;
20c40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20c50 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  =mx; i++){.     
20c60 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
20c70 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
20c80 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
20c90 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  p->fallback==0 )
20ca0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
20cb0 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20 20  f(out, "    0,  
20cc0 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69  /* %10s => nothi
20cd0 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d  ng */\n", p->nam
20ce0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
20cf0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
20d00 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20 2f  (out, "  %3d,  /
20d10 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c  * %10s => %s */\
20d20 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  n", p->fallback-
20d30 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20  >index,.        
20d40 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61    p->name, p->fa
20d50 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20  llback->name);. 
20d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e       }.      lin
20d70 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
20d80 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
20d90 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74  p->name, in, out
20da0 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  , &lineno);..  /
20db0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62  * Generate a tab
20dc0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
20dd0 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
20de0 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a  of every symbol.
20df0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
20e00 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
20e10 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e   i++){.    lemon
20e20 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c  _sprintf(line,"\
20e30 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79  "%s\",",lemp->sy
20e40 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b  mbols[i]->name);
20e50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20e60 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29  ,"  %-15s",line)
20e70 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29 3d  ;.    if( (i&3)=
20e80 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =3 ){ fprintf(ou
20e90 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
20ea0 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28  +; }.  }.  if( (
20eb0 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e  i&3)!=0 ){ fprin
20ec0 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
20ed0 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74  neno++; }.  tplt
20ee0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
20ef0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
20f00 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
20f10 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   a table contain
20f20 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69 6e  ing a text strin
20f30 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
20f40 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65   every.  ** rule
20f50 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74   in the rule set
20f60 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
20f70 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
20f80 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  on is used.  ** 
20f90 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44  when tracing RED
20fa0 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  UCE actions..  *
20fb0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d  /.  for(i=0, rp=
20fc0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
20fd0 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b  rp=rp->next, i++
20fe0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
20ff0 70 2d 3e 69 52 75 6c 65 3d 3d 69 20 29 3b 0a 20  p->iRule==i );. 
21000 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21010 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20   /* %3d */ \"", 
21020 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c  i);.    writeRul
21030 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a  eText(out, rp);.
21040 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21050 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  "\",\n"); lineno
21060 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
21070 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
21080 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
21090 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
210a0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
210b0 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61 20  es every time a 
210c0 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64  symbol is popped
210d0 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73   from.  ** the s
210e0 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65  tack while proce
210f0 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20  ssing errors or 
21100 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67  while destroying
21110 20 74 68 65 20 70 61 72 73 65 72 2e 0a 20 20 2a   the parser..  *
21120 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  * (In other word
21130 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  s, generate the 
21140 25 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69  %destructor acti
21150 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons).  */.  if( 
21160 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20  lemp->tokendest 
21170 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  ){.    int once 
21180 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
21190 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
211a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
211b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
211c0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
211d0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [i];.      if( s
211e0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
211f0 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e  !=TERMINAL ) con
21200 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
21210 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
21220 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
21230 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c       /* TERMINAL
21240 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e   Destructor */\n
21250 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21260 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
21270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
21280 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
21290 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
212a0 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
212b0 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
212c0 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  o++;.    }.    f
212d0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
212e0 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d  nsymbol && lemp-
212f0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70  >symbols[i]->typ
21300 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b  e!=TERMINAL; i++
21310 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d  );.    if( i<lem
21320 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
21330 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
21340 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d  tor_code(out,lem
21350 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65  p->symbols[i],le
21360 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
21370 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21380 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
21390 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
213a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  }.  }.  if( lemp
213b0 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20  ->vardest ){.   
213c0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
213d0 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20  dflt_sp = 0;.   
213e0 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
213f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
21400 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
21410 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
21420 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
21430 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
21440 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
21450 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
21460 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  INAL ||.        
21470 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c    sp->index<=0 |
21480 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
21490 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
214a0 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29        if( once )
214b0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
214c0 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a  f(out, "      /*
214d0 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52   Default NON-TER
214e0 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72  MINAL Destructor
214f0 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
21500 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  +;.        once 
21510 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21520 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21530 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
21540 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e  %s */\n", sp->in
21550 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
21560 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
21570 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20  dflt_sp = sp;.  
21580 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74    }.    if( dflt
21590 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  _sp!=0 ){.      
215a0 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
215b0 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70  code(out,dflt_sp
215c0 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
215d0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
215e0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
215f0 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
21600 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
21610 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
21620 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
21630 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
21640 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
21650 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  ];.    if( sp==0
21660 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
21670 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65  RMINAL || sp->de
21680 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f  structor==0 ) co
21690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
216a0 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3c 30  sp->destLineno<0
216b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
216c0 20 41 6c 72 65 61 64 79 20 65 6d 69 74 74 65 64   Already emitted
216d0 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
216e0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
216f0 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
21700 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
21710 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  me); lineno++;..
21720 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
21730 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
21740 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
21750 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
21760 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
21770 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
21780 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
21790 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
217a0 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
217b0 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
217c0 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
217d0 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
217e0 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
217f0 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
21800 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
21810 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
21820 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
21830 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
21840 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
21850 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
21860 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
21870 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21880 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20      sp2->index, 
21890 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  sp2->name); line
218a0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73  no++;.         s
218b0 70 32 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d  p2->destLineno =
218c0 20 2d 31 3b 20 20 2f 2a 20 41 76 6f 69 64 20 65   -1;  /* Avoid e
218d0 6d 69 74 74 69 6e 67 20 74 68 69 73 20 64 65 73  mitting this des
218e0 74 72 75 63 74 6f 72 20 61 67 61 69 6e 20 2a 2f  tructor again */
218f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21900 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
21910 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d  tor_code(out,lem
21920 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65  p->symbols[i],le
21930 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
21940 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
21950 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
21960 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
21970 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
21980 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
21990 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
219a0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
219b0 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65  executes wheneve
219c0 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  r the parser sta
219d0 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a  ck overflows */.
219e0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
219f0 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72  ,lemp,lemp->over
21a00 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  flow,&lineno);. 
21a10 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
21a20 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
21a30 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
21a40 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
21a50 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74  of rule informat
21a60 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ion.  **.  ** No
21a70 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65  te: This code de
21a80 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
21a90 74 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65  t that rules are
21aa0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71   number.  ** seq
21ab0 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e  uentually beginn
21ac0 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f  ing with 0..  */
21ad0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
21ae0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
21af0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69  >next){.    fpri
21b00 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c  ntf(out,"  { %d,
21b10 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68   %d },\n",rp->lh
21b20 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68  s->index,rp->nrh
21b30 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  s); lineno++;.  
21b40 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
21b50 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
21b60 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
21b70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
21b80 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75  ich execution du
21b90 72 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45  ring each REDUCE
21ba0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 20 3d   action */.  i =
21bb0 20 30 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   0;.  for(rp=lem
21bc0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
21bd0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
21be0 20 2b 3d 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f   += translate_co
21bf0 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20  de(lemp, rp);.  
21c00 7d 0a 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20  }.  if( i ){.   
21c10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
21c20 20 20 20 20 20 20 59 59 4d 49 4e 4f 52 54 59 50        YYMINORTYP
21c30 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b 5c 6e 22  E yylhsminor;\n"
21c40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
21c50 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f 75 74 70  .  /* First outp
21c60 75 74 20 72 75 6c 65 73 20 6f 74 68 65 72 20 74  ut rules other t
21c70 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74 3a  han the default:
21c80 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72   rule */.  for(r
21c90 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
21ca0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
21cb0 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
21cc0 2a 72 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  *rp2;           
21cd0 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c      /* Other rul
21ce0 65 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  es with the same
21cf0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   action */.    i
21d00 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74  f( rp->codeEmitt
21d10 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ed ) continue;. 
21d20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f 43 6f 64     if( rp->noCod
21d30 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  e ){.      /* No
21d40 20 43 20 63 6f 64 65 20 61 63 74 69 6f 6e 73 2c   C code actions,
21d50 20 73 6f 20 74 68 69 73 20 77 69 6c 6c 20 62 65   so this will be
21d60 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 64 65   part of the "de
21d70 66 61 75 6c 74 3a 22 20 72 75 6c 65 20 2a 2f 0a  fault:" rule */.
21d80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
21d90 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
21da0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
21db0 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e  e %d: /* ", rp->
21dc0 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72 69 74  iRule);.    writ
21dd0 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72  eRuleText(out, r
21de0 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
21df0 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c  out, " */\n"); l
21e00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72  ineno++;.    for
21e10 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72  (rp2=rp->next; r
21e20 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78  p2; rp2=rp2->nex
21e30 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
21e40 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64  2->code==rp->cod
21e50 65 20 26 26 20 72 70 32 2d 3e 63 6f 64 65 50 72  e && rp2->codePr
21e60 65 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65 50 72  efix==rp->codePr
21e70 65 66 69 78 0a 20 20 20 20 20 20 20 20 20 20 20  efix.           
21e80 20 20 26 26 20 72 70 32 2d 3e 63 6f 64 65 53 75    && rp2->codeSu
21e90 66 66 69 78 3d 3d 72 70 2d 3e 63 6f 64 65 53 75  ffix==rp->codeSu
21ea0 66 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ffix ){.        
21eb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
21ec0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22     case %d: /* "
21ed0 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b 0a 20  , rp2->iRule);. 
21ee0 20 20 20 20 20 20 20 77 72 69 74 65 52 75 6c 65         writeRule
21ef0 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a  Text(out, rp2);.
21f00 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
21f10 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63  out," */ yytestc
21f20 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
21f30 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 52 75 6c  );\n", rp2->iRul
21f40 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
21f50 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 45        rp2->codeE
21f60 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  mitted = 1;.    
21f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d    }.    }.    em
21f80 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c  it_code(out,rp,l
21f90 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
21fa0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
21fb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22         break;\n"
21fc0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
21fd0 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64   rp->codeEmitted
21fe0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   = 1;.  }.  /* F
21ff0 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74  inally, output t
22000 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65  he default: rule
22010 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61 73 20  .  We choose as 
22020 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c  the default: all
22030 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63 74 69  .  ** empty acti
22040 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ons. */.  fprint
22050 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64 65 66  f(out,"      def
22060 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ault:\n"); linen
22070 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65  o++;.  for(rp=le
22080 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
22090 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
220a0 69 66 28 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74  if( rp->codeEmit
220b0 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
220c0 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
220d0 6e 6f 43 6f 64 65 20 29 3b 0a 20 20 20 20 66 70  noCode );.    fp
220e0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
220f0 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d 3e   /* (%d) ", rp->
22100 69 52 75 6c 65 29 3b 0a 20 20 20 20 77 72 69 74  iRule);.    writ
22110 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72  eRuleText(out, r
22120 70 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  p);.    if( rp->
22130 64 6f 65 73 52 65 64 75 63 65 20 29 7b 0a 20 20  doesReduce ){.  
22140 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22150 20 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65   " */ yytestcase
22160 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c  (yyruleno==%d);\
22170 6e 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29 3b 20  n", rp->iRule); 
22180 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65  lineno++;.    }e
22190 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
221a0 74 66 28 6f 75 74 2c 20 22 20 28 4f 50 54 49 4d  tf(out, " (OPTIM
221b0 49 5a 45 44 20 4f 55 54 29 20 2a 2f 20 61 73 73  IZED OUT) */ ass
221c0 65 72 74 28 79 79 72 75 6c 65 6e 6f 21 3d 25 64  ert(yyruleno!=%d
221d0 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  );\n",.         
221e0 20 20 20 20 20 72 70 2d 3e 69 52 75 6c 65 29 3b       rp->iRule);
221f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
22200 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
22210 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61  ut,"        brea
22220 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
22230 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
22240 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
22250 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
22260 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
22270 69 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20  ich executes if 
22280 61 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f  a parse fails */
22290 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
222a0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69  t,lemp,lemp->fai
222b0 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lure,&lineno);. 
222c0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
222d0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
222e0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
222f0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
22300 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61   executes when a
22310 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63   syntax error oc
22320 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  curs */.  tplt_p
22330 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
22340 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e  mp->error,&linen
22350 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
22360 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
22370 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
22380 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
22390 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
223a0 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  hen the parser a
223b0 63 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74  ccepts its input
223c0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
223d0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
223e0 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b  accept,&lineno);
223f0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
22400 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
22410 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41  lineno);..  /* A
22420 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69  ppend any additi
22430 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72  on code the user
22440 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70   desires */.  tp
22450 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
22460 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64  p,lemp->extracod
22470 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66  e,&lineno);..  f
22480 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c  close(in);.  fcl
22490 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75  ose(out);.  retu
224a0 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  rn;.}../* Genera
224b0 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65  te a header file
224c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
224d0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65  */.void ReportHe
224e0 61 64 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f  ader(struct lemo
224f0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c  n *lemp).{.  FIL
22500 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
22510 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69  onst char *prefi
22520 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  x;.  char line[L
22530 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72  INESIZE];.  char
22540 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a   pattern[LINESIZ
22550 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  E];.  int i;..  
22560 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
22570 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
22580 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
22590 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20  ix;.  else      
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
225b0 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20  efix = "";.  in 
225c0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
225d0 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69  ,".h","rb");.  i
225e0 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  f( in ){.    int
225f0 20 6e 65 78 74 43 68 61 72 3b 0a 20 20 20 20 66   nextChar;.    f
22600 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
22610 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65  nterminal && fge
22620 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
22630 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ,in); i++){.    
22640 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
22650 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65  pattern,"#define
22660 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c   %s%-30s %3d\n",
22670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22680 20 20 20 20 20 70 72 65 66 69 78 2c 6c 65 6d 70       prefix,lemp
22690 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
226a0 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28  me,i);.      if(
226b0 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74   strcmp(line,pat
226c0 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20  tern) ) break;. 
226d0 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 43 68 61     }.    nextCha
226e0 72 20 3d 20 66 67 65 74 63 28 69 6e 29 3b 0a 20  r = fgetc(in);. 
226f0 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
22700 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e     if( i==lemp->
22710 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 6e 65 78  nterminal && nex
22720 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b 0a 20 20  tChar==EOF ){.  
22730 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65      /* No change
22740 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44   in the file.  D
22750 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e  on't rewrite it.
22760 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
22770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75  ;.    }.  }.  ou
22780 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
22790 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20  mp,".h","wb");. 
227a0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
227b0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
227c0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
227d0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
227e0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
227f0 2d 33 30 73 20 25 33 64 5c 6e 22 2c 70 72 65 66  -30s %3d\n",pref
22800 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
22810 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
22820 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
22830 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
22840 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20  n;.}../* Reduce 
22850 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
22860 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69  action tables, i
22870 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d  f possible, by m
22880 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20  aking use.** of 
22890 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  defaults..**.** 
228a0 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c  In this version,
228b0 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73   we take the mos
228c0 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43  t frequent REDUC
228d0 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b  E action and mak
228e0 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61  e.** it the defa
228f0 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ult.  Except, th
22900 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c  ere is no defaul
22910 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  t if the wildcar
22920 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20  d token.** is a 
22930 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68  possible look-ah
22940 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d  ead..*/.void Com
22950 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72 75  pressTables(stru
22960 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
22970 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
22980 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
22990 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32  action *ap, *ap2
229a0 2c 20 2a 6e 65 78 74 61 70 3b 0a 20 20 73 74 72  , *nextap;.  str
229b0 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72  uct rule *rp, *r
229c0 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e  p2, *rbest;.  in
229d0 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e  t nbest, n;.  in
229e0 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57  t i;.  int usesW
229f0 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28  ildcard;..  for(
22a00 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
22a10 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
22a20 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
22a30 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20  d[i];.    nbest 
22a40 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d  = 0;.    rbest =
22a50 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64   0;.    usesWild
22a60 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66  card = 0;..    f
22a70 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
22a80 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
22a90 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
22aa0 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
22ab0 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64  ->sp==lemp->wild
22ac0 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20  card ){.        
22ad0 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31  usesWildcard = 1
22ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22af0 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45  if( ap->type!=RE
22b00 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
22b10 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
22b20 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
22b30 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63  rp->lhsStart ) c
22b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
22b50 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
22b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
22b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
22b80 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
22b90 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
22ba0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
22bb0 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
22bc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22bd0 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
22be0 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
22bf0 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
22c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22c10 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
22c20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
22c30 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
22c40 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
22c50 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
22c60 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
22c70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
22c80 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61   not make a defa
22c90 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  ult if the numbe
22ca0 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65  r of rules to de
22cb0 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20  fault.    ** is 
22cc0 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f  not at least 1 o
22cd0 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  r if the wildcar
22ce0 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73  d token is a pos
22cf0 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  sible.    ** loo
22d00 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20  kahead..    */. 
22d10 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c     if( nbest<1 |
22d20 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 29  | usesWildcard )
22d30 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20   continue;...   
22d40 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63   /* Combine matc
22d50 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  hing REDUCE acti
22d60 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ons into a singl
22d70 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  e default */.   
22d80 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
22d90 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
22da0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
22db0 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
22dc0 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
22dd0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
22de0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29      assert( ap )
22df0 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53  ;.    ap->sp = S
22e00 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
22e10 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28  ult}");.    for(
22e20 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b  ap=ap->next; ap;
22e30 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
22e40 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
22e50 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
22e60 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61  >x.rp==rbest ) a
22e70 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53  p->type = NOT_US
22e80 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ED;.    }.    st
22e90 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
22ea0 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 0a 20  ort(stp->ap);.. 
22eb0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
22ec0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
22ed0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
22ee0 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29  p->type==SHIFT )
22ef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
22f00 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
22f10 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 21 3d  CE && ap->x.rp!=
22f20 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rbest ) break;. 
22f30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 70 3d     }.    if( ap=
22f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 70 2d  =0 ){.      stp-
22f50 3e 61 75 74 6f 52 65 64 75 63 65 20 3d 20 31 3b  >autoReduce = 1;
22f60 0a 20 20 20 20 20 20 73 74 70 2d 3e 70 44 66 6c  .      stp->pDfl
22f70 74 52 65 64 75 63 65 20 3d 20 72 62 65 73 74 3b  tReduce = rbest;
22f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
22f90 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20 70   Make a second p
22fa0 61 73 73 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  ass over all sta
22fb0 74 65 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 2e  tes and actions.
22fc0 20 20 43 6f 6e 76 65 72 74 0a 20 20 2a 2a 20 65    Convert.  ** e
22fd0 76 65 72 79 20 61 63 74 69 6f 6e 20 74 68 61 74  very action that
22fe0 20 69 73 20 61 20 53 48 49 46 54 20 74 6f 20 61   is a SHIFT to a
22ff0 6e 20 61 75 74 6f 52 65 64 75 63 65 20 73 74 61  n autoReduce sta
23000 74 65 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 53  te into.  ** a S
23010 48 49 46 54 52 45 44 55 43 45 20 61 63 74 69 6f  HIFTREDUCE actio
23020 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
23030 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
23040 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
23050 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
23060 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  i];.    for(ap=s
23070 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
23080 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
23090 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 4e  struct state *pN
230a0 65 78 74 53 74 61 74 65 3b 0a 20 20 20 20 20 20  extState;.      
230b0 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 53 48  if( ap->type!=SH
230c0 49 46 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  IFT ) continue;.
230d0 20 20 20 20 20 20 70 4e 65 78 74 53 74 61 74 65        pNextState
230e0 20 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20   = ap->x.stp;.  
230f0 20 20 20 20 69 66 28 20 70 4e 65 78 74 53 74 61      if( pNextSta
23100 74 65 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 26  te->autoReduce &
23110 26 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 70 44  & pNextState->pD
23120 66 6c 74 52 65 64 75 63 65 21 3d 30 20 29 7b 0a  fltReduce!=0 ){.
23130 20 20 20 20 20 20 20 20 61 70 2d 3e 74 79 70 65          ap->type
23140 20 3d 20 53 48 49 46 54 52 45 44 55 43 45 3b 0a   = SHIFTREDUCE;.
23150 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e 72 70          ap->x.rp
23160 20 3d 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 70   = pNextState->p
23170 44 66 6c 74 52 65 64 75 63 65 3b 0a 20 20 20 20  DfltReduce;.    
23180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
23190 20 2f 2a 20 49 66 20 61 20 53 48 49 46 54 52 45   /* If a SHIFTRE
231a0 44 55 43 45 20 61 63 74 69 6f 6e 20 73 70 65 63  DUCE action spec
231b0 69 66 69 65 73 20 61 20 72 75 6c 65 20 74 68 61  ifies a rule tha
231c0 74 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 52  t has a single R
231d0 48 53 20 74 65 72 6d 0a 20 20 2a 2a 20 28 6d 65  HS term.  ** (me
231e0 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 53  aning that the S
231f0 48 49 46 54 52 45 44 55 43 45 20 77 69 6c 6c 20  HIFTREDUCE will 
23200 6c 61 6e 64 20 62 61 63 6b 20 69 6e 20 74 68 65  land back in the
23210 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 0a   state where it.
23220 20 20 2a 2a 20 73 74 61 72 74 65 64 29 20 61 6e    ** started) an
23230 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  d if there is no
23240 20 43 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74   C-code associat
23250 65 64 20 77 69 74 68 20 74 68 65 20 72 65 64 75  ed with the redu
23260 63 65 20 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ce action,.  ** 
23270 74 68 65 6e 20 77 65 20 63 61 6e 20 67 6f 20 61  then we can go a
23280 68 65 61 64 20 61 6e 64 20 63 6f 6e 76 65 72 74  head and convert
23290 20 74 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 62   the action to b
232a0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
232b0 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 6f  e.  ** action fo
232c0 72 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  r the RHS of the
232d0 20 72 75 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   rule..  */.  fo
232e0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
232f0 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
23300 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
23310 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
23320 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
23330 61 70 3d 6e 65 78 74 61 70 29 7b 0a 20 20 20 20  ap=nextap){.    
23340 20 20 6e 65 78 74 61 70 20 3d 20 61 70 2d 3e 6e    nextap = ap->n
23350 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ext;.      if( a
23360 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 52 45  p->type!=SHIFTRE
23370 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
23380 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
23390 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
233a0 72 70 2d 3e 6e 6f 43 6f 64 65 3d 3d 30 20 29 20  rp->noCode==0 ) 
233b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
233c0 69 66 28 20 72 70 2d 3e 6e 72 68 73 21 3d 31 20  if( rp->nrhs!=1 
233d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 20  ) continue;.#if 
233e0 31 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  1.      /* Only 
233f0 61 70 70 6c 79 20 74 68 69 73 20 6f 70 74 69 6d  apply this optim
23400 69 7a 61 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74  ization to non-t
23410 65 72 6d 69 6e 61 6c 73 2e 20 20 49 74 20 77 6f  erminals.  It wo
23420 75 6c 64 20 62 65 20 4f 4b 20 74 6f 0a 20 20 20  uld be OK to.   
23430 20 20 20 2a 2a 20 61 70 70 6c 79 20 69 74 20 74     ** apply it t
23440 6f 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  o terminal symbo
23450 6c 73 20 74 6f 6f 2c 20 62 75 74 20 74 68 61 74  ls too, but that
23460 20 6d 61 6b 65 73 20 74 68 65 20 70 61 72 73 65   makes the parse
23470 72 20 74 61 62 6c 65 73 0a 20 20 20 20 20 20 2a  r tables.      *
23480 2a 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20  * larger. */.   
23490 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
234a0 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ndex<lemp->nterm
234b0 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  inal ) continue;
234c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2f 2a  .#endif.      /*
234d0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
234e0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
234f0 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  s the optimizati
23500 6f 6e 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65  on can be applie
23510 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 78 74 61  d */.      nexta
23520 70 20 3d 20 61 70 3b 0a 20 20 20 20 20 20 66 6f  p = ap;.      fo
23530 72 28 61 70 32 3d 73 74 70 2d 3e 61 70 3b 20 61  r(ap2=stp->ap; a
23540 70 32 20 26 26 20 28 61 70 32 3d 3d 61 70 20 7c  p2 && (ap2==ap |
23550 7c 20 61 70 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c  | ap2->sp!=rp->l
23560 68 73 29 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65  hs); ap2=ap2->ne
23570 78 74 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  xt){}.      asse
23580 72 74 28 20 61 70 32 21 3d 30 20 29 3b 0a 20 20  rt( ap2!=0 );.  
23590 20 20 20 20 61 70 2d 3e 73 70 4f 70 74 20 3d 20      ap->spOpt = 
235a0 61 70 32 2d 3e 73 70 3b 0a 20 20 20 20 20 20 61  ap2->sp;.      a
235b0 70 2d 3e 74 79 70 65 20 3d 20 61 70 32 2d 3e 74  p->type = ap2->t
235c0 79 70 65 3b 0a 20 20 20 20 20 20 61 70 2d 3e 78  ype;.      ap->x
235d0 20 3d 20 61 70 32 2d 3e 78 3b 0a 20 20 20 20 7d   = ap2->x;.    }
235e0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
235f0 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65  ompare two state
23600 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
23610 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61  rposes.  The sma
23620 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74 68  ller state is th
23630 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68  e.** one with th
23640 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69  e most non-termi
23650 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  nal actions.  If
23660 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20 73   they have the s
23670 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  ame number.** of
23680 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
23690 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  tions, then the 
236a0 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f  smaller is the o
236b0 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
236c0 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e  .** token action
236d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
236e0 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70   stateResortComp
236f0 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  are(const void *
23700 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  a, const void *b
23710 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  ){.  const struc
23720 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28  t state *pA = *(
23730 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
23740 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20  te**)a;.  const 
23750 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 42  struct state *pB
23760 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
23770 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69  t state**)b;.  i
23780 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d  nt n;..  n = pB-
23790 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e  >nNtAct - pA->nN
237a0 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  tAct;.  if( n==0
237b0 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e   ){.    n = pB->
237c0 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54  nTknAct - pA->nT
237d0 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20 6e  knAct;.    if( n
237e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ==0 ){.      n =
237f0 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20   pB->statenum - 
23800 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20  pA->statenum;.  
23810 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
23820 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n!=0 );.  retu
23830 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
23840 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73  Renumber and res
23850 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20 74 68  ort states so th
23860 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66  at states with f
23870 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20  ewer choices.** 
23880 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
23890 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20  .  Except, keep 
238a0 73 74 61 74 65 20 30 20 61 73 20 74 68 65 20 66  state 0 as the f
238b0 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76  irst state..*/.v
238c0 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73  oid ResortStates
238d0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
238e0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
238f0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
23900 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
23910 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72  tion *ap;..  for
23920 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
23930 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
23940 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
23950 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e  ed[i];.    stp->
23960 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e  nTknAct = stp->n
23970 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73  NtAct = 0;.    s
23980 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20  tp->iDfltReduce 
23990 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20  = lemp->nrule;  
239a0 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74  /* Init dflt act
239b0 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65  ion to "syntax e
239c0 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70  rror" */.    stp
239d0 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
239e0 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
239f0 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
23a00 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
23a10 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
23a20 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
23a30 20 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20    int iAction = 
23a40 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
23a50 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69  emp,ap);.      i
23a60 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b  f( iAction>=0 ){
23a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
23a80 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
23a90 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
23aa0 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b          stp->nTk
23ab0 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nAct++;.        
23ac0 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70  }else if( ap->sp
23ad0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73  ->index<lemp->ns
23ae0 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ymbol ){.       
23af0 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b     stp->nNtAct++
23b00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23b10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23b20 74 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75  t( stp->autoRedu
23b30 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44  ce==0 || stp->pD
23b40 66 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78  fltReduce==ap->x
23b50 2e 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20  .rp );.         
23b60 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
23b70 65 20 3d 20 69 41 63 74 69 6f 6e 20 2d 20 6c 65  e = iAction - le
23b80 6d 70 2d 3e 6e 73 74 61 74 65 20 2d 20 6c 65 6d  mp->nstate - lem
23b90 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 20 20  p->nrule;.      
23ba0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23bb0 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c  }.  }.  qsort(&l
23bc0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20  emp->sorted[1], 
23bd0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20  lemp->nstate-1, 
23be0 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72  sizeof(lemp->sor
23bf0 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  ted[0]),.       
23c00 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70   stateResortComp
23c10 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  are);.  for(i=0;
23c20 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
23c30 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
23c40 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74  >sorted[i]->stat
23c50 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  enum = i;.  }.  
23c60 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20  lemp->nxstate = 
23c70 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
23c80 77 68 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73  while( lemp->nxs
23c90 74 61 74 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e  tate>1 && lemp->
23ca0 73 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73  sorted[lemp->nxs
23cb0 74 61 74 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64  tate-1]->autoRed
23cc0 75 63 65 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d  uce ){.    lemp-
23cd0 3e 6e 78 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a  >nxstate--;.  }.
23ce0 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
23cf0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
23d00 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a  file "set.c" ***
23d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d30 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e  */./*.** Set man
23d40 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ipulation routin
23d50 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  es for the LEMON
23d60 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
23d70 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  r..*/..static in
23d80 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20  t size = 0;../* 
23d90 53 65 74 20 74 68 65 20 73 65 74 20 73 69 7a 65  Set the set size
23da0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65   */.void SetSize
23db0 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65  (int n).{.  size
23dc0 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c   = n+1;.}../* Al
23dd0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74  locate a new set
23de0 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77   */.char *SetNew
23df0 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  (void){.  char *
23e00 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29  s;.  s = (char*)
23e10 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29  calloc( size, 1)
23e20 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a  ;.  if( s==0 ){.
23e30 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
23e40 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
23e50 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72      memory_error
23e60 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
23e70 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f   s;.}../* Deallo
23e80 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f  cate a set */.vo
23e90 69 64 20 53 65 74 46 72 65 65 28 63 68 61 72 20  id SetFree(char 
23ea0 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b  *s).{.  free(s);
23eb0 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77  .}../* Add a new
23ec0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
23ed0 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55  set.  Return TRU
23ee0 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74  E if the element
23ef0 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e   was added.** an
23f00 64 20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61  d FALSE if it wa
23f10 73 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e  s already there.
23f20 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63   */.int SetAdd(c
23f30 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b  har *s, int e).{
23f40 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73  .  int rv;.  ass
23f50 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73  ert( e>=0 && e<s
23f60 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b  ize );.  rv = s[
23f70 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a  e];.  s[e] = 1;.
23f80 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a    return !rv;.}.
23f90 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c  ./* Add every el
23fa0 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73  ement of s2 to s
23fb0 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  1.  Return TRUE 
23fc0 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a  if s1 changes. *
23fd0 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63  /.int SetUnion(c
23fe0 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73  har *s1, char *s
23ff0 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72  2).{.  int i, pr
24000 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65  ogress;.  progre
24010 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ss = 0;.  for(i=
24020 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b  0; i<size; i++){
24030 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d  .    if( s2[i]==
24040 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
24050 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29    if( s1[i]==0 )
24060 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73 73  {.      progress
24070 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69   = 1;.      s1[i
24080 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 1;.    }.  }
24090 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65  .  return progre
240a0 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ss;.}./*********
240b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
240c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
240d0 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.c" **********
240e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240f0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
24100 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
24110 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
24120 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
24130 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
24140 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
24150 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
24160 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
24170 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
24180 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
24190 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
241a0 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
241b0 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
241c0 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
241d0 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
241e0 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
241f0 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
24200 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
24210 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
24220 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
24230 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
24240 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75  r..*/..PRIVATE u
24250 6e 73 69 67 6e 65 64 20 73 74 72 68 61 73 68 28  nsigned strhash(
24260 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b  const char *x).{
24270 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 20 3d 20  .  unsigned h = 
24280 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 20 29  0;.  while( *x )
24290 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b   h = h*13 + *(x+
242a0 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a  +);.  return h;.
242b0 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65  }../* Works like
242c0 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66   strdup, sort of
242d0 2e 20 20 53 61 76 65 20 61 20 73 74 72 69 6e 67  .  Save a string
242e0 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d   in malloced mem
242f0 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70  ory, but.** keep
24300 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61   strings in a ta
24310 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ble so that the 
24320 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e  same string is n
24330 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68  ot in more.** th
24340 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f  an one place..*/
24350 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
24360 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20  safe(const char 
24370 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *y).{.  const ch
24380 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63  ar *z;.  char *c
24390 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20  py;..  if( y==0 
243a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20  ) return 0;.  z 
243b0 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79  = Strsafe_find(y
243c0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26  );.  if( z==0 &&
243d0 20 28 63 70 79 3d 28 63 68 61 72 20 2a 29 6d 61   (cpy=(char *)ma
243e0 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
243f0 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a  n(y)+1 ))!=0 ){.
24400 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
24410 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d  (cpy,y);.    z =
24420 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73 61 66   cpy;.    Strsaf
24430 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d  e_insert(z);.  }
24440 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a  .  MemoryCheck(z
24450 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
24460 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
24470 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
24480 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
24490 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
244a0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
244b0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
244c0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31  ..*/.struct s_x1
244d0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244f0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
24500 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
24510 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
24520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
24530 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
24540 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
24550 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
24580 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
24590 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
245a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
245b0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
245c0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
245d0 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x1node *tbl;  
245e0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
245f0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
24600 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68  uct s_x1node **h
24610 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
24620 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
24630 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
24640 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
24650 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
24660 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
24670 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
24680 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
24690 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
246a0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
246b0 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63  t s_x1node {.  c
246c0 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 3b  onst char *data;
246d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
246e0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
246f0 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x1node *next; 
24700 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
24710 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
24720 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
24730 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x1node **from; 
24740 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
24750 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a  k */.} x1node;..
24760 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
24770 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
24780 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
24790 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
247a0 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
247b0 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a  uct s_x1 *x1a;..
247c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
247d0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
247e0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73  ray */.void Strs
247f0 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  afe_init(void){.
24800 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75    if( x1a ) retu
24810 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72  rn;.  x1a = (str
24820 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63  uct s_x1*)malloc
24830 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
24840 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x1) );.  if( x
24850 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73  1a ){.    x1a->s
24860 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
24870 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x1a->count = 0;.
24880 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28      x1a->tbl = (
24890 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31  x1node*)calloc(1
248a0 30 32 34 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f  024, sizeof(x1no
248b0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
248c0 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
248d0 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x1a->tbl==0 ){. 
248e0 20 20 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a       free(x1a);.
248f0 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20        x1a = 0;. 
24900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24910 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61  int i;.      x1a
24920 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  ->ht = (x1node**
24930 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34  )&(x1a->tbl[1024
24940 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
24950 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20  0; i<1024; i++) 
24960 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x1a->ht[i] = 0;.
24970 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
24980 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
24990 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
249a0 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
249b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
249c0 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
249d0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
249e0 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
249f0 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65  n */.int Strsafe
24a00 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68  _insert(const ch
24a10 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31  ar *data).{.  x1
24a20 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69  node *np;.  unsi
24a30 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e  gned h;.  unsign
24a40 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31  ed ph;..  if( x1
24a50 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
24a60 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
24a70 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
24a80 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
24a90 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
24aa0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
24ab0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
24ac0 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29  p(np->data,data)
24ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
24ae0 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
24af0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
24b00 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
24b10 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
24b20 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
24b30 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
24b40 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
24b50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
24b60 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
24b70 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74    if( x1a->count
24b80 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x1a->size ){. 
24b90 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
24ba0 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
24bb0 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
24bc0 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20  int i,arrSize;. 
24bd0 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20 61     struct s_x1 a
24be0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
24bf0 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d  size = arrSize =
24c00 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x1a->size*2;.  
24c10 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
24c20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x1a->count;.    
24c30 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e  array.tbl = (x1n
24c40 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53  ode*)calloc(arrS
24c50 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f  ize, sizeof(x1no
24c60 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
24c70 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
24c80 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
24c90 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
24ca0 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
24cb0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
24cc0 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64  rray.ht = (x1nod
24cd0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
24ce0 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66  arrSize]);.    f
24cf0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
24d00 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
24d10 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
24d20 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75  (i=0; i<x1a->cou
24d30 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
24d40 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x1node *oldnp, *
24d50 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
24d60 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b  np = &(x1a->tbl[
24d70 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
24d80 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  trhash(oldnp->da
24d90 74 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ta) & (arrSize-1
24da0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
24db0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
24dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
24dd0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
24de0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
24df0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
24e00 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
24e10 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
24e20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
24e30 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
24e40 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
24e50 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
24e60 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
24e70 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
24e80 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31     }.    free(x1
24e90 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31  a->tbl);.    *x1
24ea0 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
24eb0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
24ec0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
24ed0 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
24ee0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31  -1);.  np = &(x1
24ef0 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e  a->tbl[x1a->coun
24f00 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
24f10 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
24f20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61  x1a->ht[h] ) x1a
24f30 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
24f40 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
24f50 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68  p->next = x1a->h
24f60 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b  t[h];.  x1a->ht[
24f70 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
24f80 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b  rom = &(x1a->ht[
24f90 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
24fa0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
24fb0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
24fc0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
24fd0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
24fe0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
24ff0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f   such key. */.co
25000 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
25010 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61  e_find(const cha
25020 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69  r *key).{.  unsi
25030 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65  gned h;.  x1node
25040 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61   *np;..  if( x1a
25050 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
25060 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
25070 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  y) & (x1a->size-
25080 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
25090 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
250a0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
250b0 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65  rcmp(np->data,ke
250c0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
250d0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
250e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
250f0 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
25100 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
25110 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25120 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e  (terminal or non
25130 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c  terminal) symbol
25140 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20   "x"..** Create 
25150 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20  a new symbol if 
25160 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
25170 74 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62  t time "x" has b
25180 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72  een seen..*/.str
25190 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
251a0 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61  ol_new(const cha
251b0 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74  r *x).{.  struct
251c0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
251d0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
251e0 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30  (x);.  if( sp==0
251f0 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74   ){.    sp = (st
25200 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61  ruct symbol *)ca
25210 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
25220 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
25230 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
25240 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
25250 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
25260 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
25270 49 53 55 50 50 45 52 28 2a 78 29 20 3f 20 54 45  ISUPPER(*x) ? TE
25280 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
25290 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
252a0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
252b0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
252c0 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
252d0 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
252e0 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
252f0 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
25300 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  sp->lambda = LEM
25310 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70  ON_FALSE;.    sp
25320 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
25330 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69  ;.    sp->destLi
25340 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70  neno = 0;.    sp
25350 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a  ->datatype = 0;.
25360 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d      sp->useCnt =
25370 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69   0;.    Symbol_i
25380 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d  nsert(sp,sp->nam
25390 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73  e);.  }.  sp->us
253a0 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  eCnt++;.  return
253b0 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61   sp;.}../* Compa
253c0 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66  re two symbols f
253d0 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
253e0 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  ses.  Return neg
253f0 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20  ative,.** zero, 
25400 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 61  or positive if a
25410 20 69 73 20 6c 65 73 73 20 74 68 65 6e 2c 20 65   is less then, e
25420 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
25430 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a  ter.** than b..*
25440 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61  *.** Symbols tha
25450 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70 70  t begin with upp
25460 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 20  er case letters 
25470 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f  (terminals or to
25480 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f  kens).** must so
25490 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c  rt before symbol
254a0 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
254b0 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74  h lower case let
254c0 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72  ters.** (non-ter
254d0 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55  minals).  And MU
254e0 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62  LTITERMINAL symb
254f0 6f 6c 73 20 28 63 72 65 61 74 65 64 20 75 73 69  ols (created usi
25500 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e  ng the.** %token
25510 5f 63 6c 61 73 73 20 64 69 72 65 63 74 69 76 65  _class directive
25520 29 20 6d 75 73 74 20 73 6f 72 74 20 61 74 20 74  ) must sort at t
25530 68 65 20 76 65 72 79 20 65 6e 64 2e 20 4f 74 68  he very end. Oth
25540 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c  er than.** that,
25550 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
25560 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a  not matter..**.*
25570 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65 72 69  * We find experi
25580 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65  mentally that le
25590 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  aving the symbol
255a0 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69  s in their origi
255b0 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68  nal.** order (th
255c0 65 20 6f 72 64 65 72 20 74 68 65 79 20 61 70 70  e order they app
255d0 65 61 72 65 64 20 69 6e 20 74 68 65 20 67 72 61  eared in the gra
255e0 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65 73  mmar file) gives
255f0 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74   the.** smallest
25600 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 69   parser tables i
25610 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74  n SQLite..*/.int
25620 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73   Symbolcmpp(cons
25630 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73  t void *_a, cons
25640 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20  t void *_b).{.  
25650 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
25660 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74  bol *a = *(const
25670 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
25680 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73  *) _a;.  const s
25690 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20  truct symbol *b 
256a0 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
256b0 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a   symbol **) _b;.
256c0 20 20 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79    int i1 = a->ty
256d0 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
256e0 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b  L ? 3 : a->name[
256f0 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a  0]>'Z' ? 2 : 1;.
25700 20 20 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79    int i2 = b->ty
25710 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
25720 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b  L ? 3 : b->name[
25730 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a  0]>'Z' ? 2 : 1;.
25740 20 20 72 65 74 75 72 6e 20 69 31 3d 3d 69 32 20    return i1==i2 
25750 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  ? a->index - b->
25760 69 6e 64 65 78 20 3a 20 69 31 20 2d 20 69 32 3b  index : i1 - i2;
25770 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
25780 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
25790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
257a0 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
257b0 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
257c0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
257d0 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  2"..*/.struct s_
257e0 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x2 {.  int size;
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25800 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
25810 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
25820 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25840 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
25850 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
25860 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
25890 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
258a0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
258b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
258c0 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
258d0 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
258e0 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x2node *tbl;
258f0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
25900 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
25910 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
25920 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
25930 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
25940 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
25950 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
25960 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
25970 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
25980 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
25990 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
259a0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
259b0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
259c0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20  uct s_x2node {. 
259d0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
259e0 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65  data;     /* The
259f0 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74   data */.  const
25a00 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20   char *key;     
25a10 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
25a20 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
25a30 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
25a40 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
25a50 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
25a60 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
25a70 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
25a80 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
25a90 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
25aa0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
25ab0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
25ac0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
25ad0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
25ae0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
25af0 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
25b00 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
25b10 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
25b20 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
25b30 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  it(void){.  if( 
25b40 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x2a ) return;.  
25b50 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x2a = (struct s_
25b60 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x2*)malloc( size
25b70 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20  of(struct s_x2) 
25b80 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a  );.  if( x2a ){.
25b90 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20      x2a->size = 
25ba0 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f  128;.    x2a->co
25bb0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61  unt = 0;.    x2a
25bc0 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  ->tbl = (x2node*
25bd0 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a  )calloc(128, siz
25be0 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
25bf0 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a  zeof(x2node*));.
25c00 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
25c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
25c20 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
25c30 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
25c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
25c50 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
25c60 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
25c70 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
25c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
25c90 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
25ca0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
25cb0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
25cc0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
25cd0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
25ce0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
25cf0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
25d00 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
25d10 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
25d20 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
25d30 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
25d40 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
25d50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65  , const char *ke
25d60 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  y).{.  x2node *n
25d70 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
25d80 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
25d90 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
25da0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
25db0 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
25dc0 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
25dd0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
25de0 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
25df0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
25e00 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
25e10 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
25e20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
25e30 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
25e40 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
25e50 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
25e60 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
25e70 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
25e80 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
25e90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
25ea0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
25eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
25ec0 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
25ed0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
25ee0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
25ef0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
25f00 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53  /.    int i,arrS
25f10 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
25f20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x2 array;.    
25f30 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72  array.size = arr
25f40 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65  Size = x2a->size
25f50 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
25f60 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  unt = x2a->count
25f70 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
25f80 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x2node*)callo
25f90 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
25fa0 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
25fb0 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x2node*));.  
25fc0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
25fd0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
25fe0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
25ff0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
26000 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
26010 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
26020 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b  y.tbl[arrSize]);
26030 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26040 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72  arrSize; i++) ar
26050 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
26060 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32     for(i=0; i<x2
26070 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
26080 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c        x2node *ol
26090 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
260a0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61     oldnp = &(x2a
260b0 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
260c0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
260d0 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53  np->key) & (arrS
260e0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
260f0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
26100 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
26110 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
26120 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
26130 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
26140 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
26150 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
26160 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
26170 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65  >key = oldnp->ke
26180 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  y;.      newnp->
26190 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
261a0 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
261b0 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
261c0 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
261d0 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
261e0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
261f0 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x2a->tbl);.   
26200 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x2a = array;. 
26210 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
26220 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
26230 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
26240 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
26250 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e  &(x2a->tbl[x2a->
26260 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
26270 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70  >key = key;.  np
26280 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
26290 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20   if( x2a->ht[h] 
262a0 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x2a->ht[h]->fr
262b0 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
262c0 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
262d0 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61  2a->ht[h];.  x2a
262e0 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
262f0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61  np->from = &(x2a
26300 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
26310 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
26320 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
26330 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
26340 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
26350 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
26360 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
26370 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
26380 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f   *Symbol_find(co
26390 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b  nst char *key).{
263a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
263b0 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x2node *np;..  
263c0 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
263d0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
263e0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32 61  hash(key) & (x2a
263f0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
26400 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
26410 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
26420 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
26430 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
26440 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
26450 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
26460 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
26470 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
26480 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61  turn the n-th da
26490 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ta.  Return NULL
264a0 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20   if n is out of 
264b0 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74  range. */.struct
264c0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
264d0 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73  Nth(int n).{.  s
264e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
264f0 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26  ta;.  if( x2a &&
26500 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e   n>0 && n<=x2a->
26510 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74  count ){.    dat
26520 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31  a = x2a->tbl[n-1
26530 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  ].data;.  }else{
26540 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20  .    data = 0;. 
26550 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61   }.  return data
26560 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
26570 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
26580 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  rray */.int Symb
26590 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72  ol_count().{.  r
265a0 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d  eturn x2a ? x2a-
265b0 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f  >count : 0;.}../
265c0 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
265d0 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
265e0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
265f0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
26600 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
26610 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
26620 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
26630 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
26640 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
26650 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
26660 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
26670 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
26680 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
26690 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
266a0 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72  rray;.  int i,ar
266b0 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61  rSize;.  if( x2a
266c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
266d0 20 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d    arrSize = x2a-
266e0 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
266f0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
26700 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69   **)calloc(arrSi
26710 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ze, sizeof(struc
26720 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20  t symbol *));.  
26730 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20  if( array ){.   
26740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
26750 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
26760 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d  i] = x2a->tbl[i]
26770 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
26780 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
26790 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e   Compare two con
267a0 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69  figurations */.i
267b0 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e  nt Configcmp(con
267c0 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73  st char *_a,cons
267d0 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20  t char *_b).{.  
267e0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e  const struct con
267f0 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74  fig *a = (struct
26800 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20   config *) _a;. 
26810 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
26820 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63  nfig *b = (struc
26830 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a  t config *) _b;.
26840 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61    int x;.  x = a
26850 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
26860 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66  >rp->index;.  if
26870 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e  ( x==0 ) x = a->
26880 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
26890 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20  return x;.}../* 
268a0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
268b0 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  es */.PRIVATE in
268c0 74 20 73 74 61 74 65 63 6d 70 28 73 74 72 75 63  t statecmp(struc
268d0 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72  t config *a, str
268e0 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b  uct config *b).{
268f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72  .  int rc;.  for
26900 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20  (rc=0; rc==0 && 
26910 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70  a && b;  a=a->bp
26920 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20  , b=b->bp){.    
26930 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  rc = a->rp->inde
26940 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78  x - b->rp->index
26950 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  ;.    if( rc==0 
26960 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20  ) rc = a->dot - 
26970 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66  b->dot;.  }.  if
26980 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
26990 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20  f( a ) rc = 1;. 
269a0 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20     if( b ) rc = 
269b0 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
269c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20   rc;.}../* Hash 
269d0 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41  a state */.PRIVA
269e0 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74  TE unsigned stat
269f0 65 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e  ehash(struct con
26a00 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69  fig *a).{.  unsi
26a10 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c  gned h=0;.  whil
26a20 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20  e( a ){.    h = 
26a30 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
26a40 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
26a50 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b  ;.    a = a->bp;
26a60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b  .  }.  return h;
26a70 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
26a80 61 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  a new state stru
26a90 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20  cture */.struct 
26aa0 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
26ab0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
26ac0 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20  ate *newstate;. 
26ad0 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74 72   newstate = (str
26ae0 75 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c  uct state *)call
26af0 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
26b00 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20  uct state) );.  
26b10 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73  MemoryCheck(news
26b20 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tate);.  return 
26b30 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20  newstate;.}../* 
26b40 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
26b50 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
26b60 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
26b70 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
26b80 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
26b90 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
26ba0 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20  struct s_x3 {.  
26bb0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
26bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
26bd0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
26be0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
26c10 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
26c20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
26c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c50 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
26c60 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
26c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26c80 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
26c90 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
26ca0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
26cb0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
26cc0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
26cd0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
26ce0 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x3node **ht;  /
26cf0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
26d00 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
26d10 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
26d20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
26d30 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
26d40 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
26d50 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
26d60 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
26d70 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79  type "x3"..*/.ty
26d80 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
26d90 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  3node {.  struct
26da0 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20   state *data;   
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26dc0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
26dd0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
26de0 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
26df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
26e00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
26e10 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  3node *next;   /
26e20 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
26e30 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
26e40 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
26e50 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
26e60 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
26e70 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x3node;../* 
26e80 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
26e90 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
26ea0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
26eb0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26ec0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
26ed0 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20   s_x3 *x3a;../* 
26ee0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
26ef0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
26f00 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69   */.void State_i
26f10 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  nit(void){.  if(
26f20 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x3a ) return;. 
26f30 20 78 33 61 20 3d 20 28 73 74 72 75 63 74 20 73   x3a = (struct s
26f40 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x3*)malloc( siz
26f50 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33 29  eof(struct s_x3)
26f60 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b   );.  if( x3a ){
26f70 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d  .    x3a->size =
26f80 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63   128;.    x3a->c
26f90 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33  ount = 0;.    x3
26fa0 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  a->tbl = (x3node
26fb0 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69  *)calloc(128, si
26fc0 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
26fd0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b  izeof(x3node*));
26fe0 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
26ff0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
27000 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
27010 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
27020 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
27030 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
27040 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
27050 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
27060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
27070 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
27080 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
27090 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
270a0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
270b0 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
270c0 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
270d0 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
270e0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
270f0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
27100 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
27110 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72  State_insert(str
27120 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c  uct state *data,
27130 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
27140 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20  key).{.  x3node 
27150 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
27160 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
27170 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
27180 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
27190 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
271a0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
271b0 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
271c0 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
271d0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
271e0 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
271f0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
27200 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
27210 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
27220 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
27230 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
27240 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
27250 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
27260 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
27270 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
27280 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
27290 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
272a0 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33  ( x3a->count>=x3
272b0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
272c0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
272d0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
272e0 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
272f0 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73  i,arrSize;.    s
27300 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79  truct s_x3 array
27310 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
27320 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61   = arrSize = x3a
27330 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
27340 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d  ray.count = x3a-
27350 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
27360 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  y.tbl = (x3node*
27370 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
27380 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20   sizeof(x3node) 
27390 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
273a0 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
273b0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
273c0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
273d0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
273e0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
273f0 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
27400 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53  &(array.tbl[arrS
27410 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
27420 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
27430 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
27440 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
27450 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x3a->count; 
27460 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f  i++){.      x3no
27470 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
27480 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
27490 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x3a->tbl[i]);
274a0 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65  .      h = state
274b0 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29  hash(oldnp->key)
274c0 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a   & (arrSize-1);.
274d0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
274e0 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
274f0 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
27500 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
27510 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
27520 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
27530 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
27540 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
27550 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f    newnp->key = o
27560 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20  ldnp->key;.     
27570 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
27580 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
27590 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
275a0 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
275b0 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
275c0 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
275d0 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74  .    free(x3a->t
275e0 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20  bl);.    *x3a = 
275f0 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
27600 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
27610 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
27620 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
27630 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74  .  np = &(x3a->t
27640 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x3a->count++]
27650 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b  );.  np->key = k
27660 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ey;.  np->data =
27670 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61   data;.  if( x3a
27680 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68  ->ht[h] ) x3a->h
27690 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
276a0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
276b0 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68  next = x3a->ht[h
276c0 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20  ];.  x3a->ht[h] 
276d0 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
276e0 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29   = &(x3a->ht[h])
276f0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
27700 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
27710 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
27720 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
27730 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
27740 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
27750 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
27760 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
27770 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ind(struct confi
27780 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69  g *key).{.  unsi
27790 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65  gned h;.  x3node
277a0 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61   *np;..  if( x3a
277b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
277c0 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
277d0 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a  key) & (x3a->siz
277e0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
277f0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
27800 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
27810 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
27820 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
27830 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
27840 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
27850 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
27860 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
27870 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
27880 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
27890 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
278a0 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
278b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
278c0 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
278d0 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
278e0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
278f0 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
27900 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
27910 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
27920 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  **State_arrayof(
27930 76 6f 69 64 29 0a 7b 0a 20 20 73 74 72 75 63 74  void).{.  struct
27940 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a   state **array;.
27950 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
27960 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
27970 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72 72 53  return 0;.  arrS
27980 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  ize = x3a->count
27990 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
279a0 75 63 74 20 73 74 61 74 65 20 2a 2a 29 63 61 6c  uct state **)cal
279b0 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
279c0 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65  eof(struct state
279d0 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61   *));.  if( arra
279e0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
279f0 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b  ; i<arrSize; i++
27a00 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61  ) array[i] = x3a
27a10 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
27a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
27a30 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  y;.}../* Hash a 
27a40 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
27a50 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65  .PRIVATE unsigne
27a60 64 20 63 6f 6e 66 69 67 68 61 73 68 28 73 74 72  d confighash(str
27a70 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b  uct config *a).{
27a80 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b  .  unsigned h=0;
27a90 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61  .  h = h*571 + a
27aa0 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
27ab0 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   a->dot;.  retur
27ac0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n h;.}../* There
27ad0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
27ae0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
27af0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
27b00 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
27b10 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
27b20 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x4"..*/.struc
27b30 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73  t s_x4 {.  int s
27b40 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
27b50 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
27b60 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
27b70 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
27ba0 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
27bb0 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
27be0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
27bf0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
27c00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27c10 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
27c20 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
27c30 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
27c40 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
27c50 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
27c60 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
27c70 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
27c80 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
27c90 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
27ca0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
27cb0 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
27cc0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
27cd0 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
27ce0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
27cf0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
27d00 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x4"..*/.typedef
27d10 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
27d20 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
27d30 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ig *data;       
27d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27d50 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
27d60 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78  ct s_x4node *nex
27d70 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
27d80 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
27d90 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
27da0 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x4node **fro
27db0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
27dc0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65  link */.} x4node
27dd0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
27de0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
27df0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
27e00 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
27e10 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
27e20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61  struct s_x4 *x4a
27e30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
27e40 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
27e50 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43   array */.void C
27e60 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
27e70 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 34 61  void){.  if( x4a
27e80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61   ) return;.  x4a
27e90 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a   = (struct s_x4*
27ea0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
27eb0 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a  struct s_x4) );.
27ec0 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20    if( x4a ){.   
27ed0 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b   x4a->size = 64;
27ee0 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  .    x4a->count 
27ef0 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62  = 0;.    x4a->tb
27f00 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c  l = (x4node*)cal
27f10 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f 66 28 78  loc(64, sizeof(x
27f20 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
27f30 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x4node*));.    i
27f40 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x4a->tbl==0 )
27f50 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 34 61  {.      free(x4a
27f60 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30  );.      x4a = 0
27f70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27f80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
27f90 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64  x4a->ht = (x4nod
27fa0 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36  e**)&(x4a->tbl[6
27fb0 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
27fc0 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78  =0; i<64; i++) x
27fd0 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  4a->ht[i] = 0;. 
27fe0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
27ff0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
28000 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
28010 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
28020 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
28030 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
28040 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
28050 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
28060 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61   */.int Configta
28070 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ble_insert(struc
28080 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a  t config *data).
28090 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x4node *np;.
280a0 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
280b0 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
280c0 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
280d0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f  urn 0;.  ph = co
280e0 6e 66 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a  nfighash(data);.
280f0 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d    h = ph & (x4a-
28100 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
28110 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
28120 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
28130 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63  if( Configcmp((c
28140 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d  onst char *) np-
28150 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61  >data,(const cha
28160 72 20 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b  r *) data)==0 ){
28170 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
28180 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
28190 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
281a0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
281b0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
281c0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
281d0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
281e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
281f0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
28200 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
28210 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d  x4a->count>=x4a-
28220 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
28230 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
28240 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
28250 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
28260 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72  arrSize;.    str
28270 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a  uct s_x4 array;.
28280 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
28290 20 61 72 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e   arrSize = x4a->
282a0 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
282b0 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63  y.count = x4a->c
282c0 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
282d0 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63  tbl = (x4node*)c
282e0 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
282f0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
28300 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
28310 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
28320 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
28330 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
28340 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
28350 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
28360 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28  t = (x4node**)&(
28370 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a  array.tbl[arrSiz
28380 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
28390 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b  ; i<arrSize; i++
283a0 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
283b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
283c0 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x4a->count; i+
283d0 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65  +){.      x4node
283e0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
283f0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
28400 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x4a->tbl[i]);. 
28410 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68       h = configh
28420 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29  ash(oldnp->data)
28430 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a   & (arrSize-1);.
28440 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
28450 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
28460 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
28470 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
28480 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
28490 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
284a0 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
284b0 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
284c0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
284d0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
284e0 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
284f0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
28500 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
28510 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
28520 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e  }.    free(x4a->
28530 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d  tbl);.    *x4a =
28540 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
28550 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
28560 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
28570 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
28580 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e  ;.  np = &(x4a->
28590 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x4a->count++
285a0 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
285b0 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61   data;.  if( x4a
285c0 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68  ->ht[h] ) x4a->h
285d0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
285e0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
285f0 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68  next = x4a->ht[h
28600 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20  ];.  x4a->ht[h] 
28610 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
28620 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29   = &(x4a->ht[h])
28630 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
28640 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
28650 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
28660 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
28670 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
28680 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
28690 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
286a0 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
286b0 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63  table_find(struc
286c0 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b  t config *key).{
286d0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f  .  int h;.  x4no
286e0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
286f0 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
28700 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61  ;.  h = configha
28710 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e  sh(key) & (x4a->
28720 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
28730 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
28740 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
28750 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f  f( Configcmp((co
28760 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e  nst char *) np->
28770 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72  data,(const char
28780 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72   *) key)==0 ) br
28790 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
287a0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
287b0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
287c0 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
287d0 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
287e0 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50  om the table.  P
287f0 61 73 73 20 65 61 63 68 20 64 61 74 61 20 74 6f  ass each data to
28800 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66   the function "f
28810 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65  ".** as it is re
28820 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79  moved.  ("f" may
28830 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69   be null to avoi
28840 64 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f  d this step.) */
28850 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
28860 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28  e_clear(int(*f)(
28870 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
28880 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
28890 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61  f( x4a==0 || x4a
288a0 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74  ->count==0 ) ret
288b0 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66  urn;.  if( f ) f
288c0 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
288d0 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28  ount; i++) (*f)(
288e0 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x4a->tbl[i].data
288f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
28900 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20  x4a->size; i++) 
28910 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
28920 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
28930 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.