/ Hex Artifact Content
Login

Artifact 799e73e19a33b8dd7767a7fa34618ed2a9c2397d:


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 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  ();.void FindFir
1330: 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  stSets();.void F
1340: 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69  indStates();.voi
1350: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76  d FindLinks();.v
1360: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
1370: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41  ts();.void FindA
1380: 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a  ctions();../****
1390: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
13a0: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
13b0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ****/.void Confi
13e0: 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29  glist_init(void)
13f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1400: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
1410: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
1420: 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  nt);.struct conf
1430: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
1440: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
1450: 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  ule *, int);.voi
1460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
1470: 73 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  sure(struct lemo
1480: 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  n *);.void Confi
1490: 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29  glist_sort(void)
14a0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
14b0: 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64  t_sortbasis(void
14c0: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
14d0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
14e0: 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  urn(void);.struc
14f0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
1500: 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29  list_basis(void)
1510: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1520: 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e  t_eat(struct con
1530: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
1540: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f  figlist_reset(vo
1550: 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  id);../*********
1560: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1570: 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  error.h" *******
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  /.void ErrorMsg(
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
15c0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  t,const char *, 
15d0: 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46  ...);../****** F
15e0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
15f0: 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.h" ********
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1620: 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f  **/.enum option_
1630: 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d  type { OPT_FLAG=
1640: 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50  1,  OPT_INT,  OP
1650: 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c  T_DBL,  OPT_STR,
1660: 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46  .         OPT_FF
1670: 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f  LAG, OPT_FINT, O
1680: 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54  PT_FDBL, OPT_FST
1690: 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74  R};.struct s_opt
16a0: 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70  ions {.  enum op
16b0: 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a  tion_type type;.
16c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61    const char *la
16d0: 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67  bel;.  char *arg
16e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16f0: 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20  message;.};.int 
1700: 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a     OptInit(char*
1710: 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  *,struct s_optio
1720: 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20  ns*,FILE*);.int 
1730: 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64     OptNArgs(void
1740: 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67  );.char  *OptArg
1750: 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70  (int);.void   Op
1760: 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tErr(int);.void 
1770: 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29    OptPrint(void)
1780: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ;../******** Fro
1790: 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
17a0: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
17b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17d0: 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
17e0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a  t lemon *lemp);.
17f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ./********* From
1800: 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
1810: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
1840: 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
1850: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
1860: 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63   Plink_add(struc
1870: 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75  t plink **, stru
1880: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
1890: 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
18a0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73  ruct plink **, s
18b0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a  truct plink *);.
18c0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
18d0: 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
18e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
18f0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72  From the file "r
1900: 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  eport.h" *******
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1930: 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
1940: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1950: 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
1960: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1970: 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1980: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
1990: 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70  , int);.void Rep
19a0: 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74  ortHeader(struct
19b0: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
19c0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73  CompressTables(s
19d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
19e0: 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
19f0: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1a00: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
1a10: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1a20: 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.h" **********
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1a50: 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e  void  SetSize(in
1a60: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t);             
1a70: 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c  /* All sets will
1a80: 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f   be of size N */
1a90: 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f  .char *SetNew(vo
1aa0: 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
1ab0: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20     /* A new set 
1ac0: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e  for element 0..N
1ad0: 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65   */.void  SetFre
1ae0: 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20  e(char*);       
1af0: 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
1b00: 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74  ate a set */.int
1b10: 20 53 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e   SetAdd(char*,in
1b20: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  t);            /
1b30: 2a 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f  * Add element to
1b40: 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65   a set */.int Se
1b50: 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68  tUnion(char *,ch
1b60: 61 72 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c  ar *);    /* A <
1b70: 2d 20 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c  - A U B, thru el
1b80: 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69  ement N */.#defi
1b90: 6e 65 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20  ne SetFind(X,Y) 
1ba0: 28 58 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20  (X[Y])       /* 
1bb0: 54 72 75 65 20 69 66 20 59 20 69 73 20 69 6e 20  True if Y is in 
1bc0: 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  set X */../*****
1bd0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1be0: 69 6c 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a  ile "struct.h" *
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c10: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ****/./*.** Prin
1c20: 63 69 70 61 6c 20 64 61 74 61 20 73 74 72 75 63  cipal data struc
1c30: 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tures for the LE
1c40: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1c50: 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  ator..*/..typede
1c60: 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41  f enum {LEMON_FA
1c70: 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55  LSE=0, LEMON_TRU
1c80: 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20  E} Boolean;../* 
1c90: 53 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61  Symbols (termina
1ca0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
1cb0: 61 6c 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d  als) of the gram
1cc0: 6d 61 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  mar are stored.*
1cd0: 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
1ce0: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62  ng: */.enum symb
1cf0: 6f 6c 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d  ol_type {.  TERM
1d00: 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49  INAL,.  NONTERMI
1d10: 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d  NAL,.  MULTITERM
1d20: 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61  INAL.};.enum e_a
1d30: 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c  ssoc {.    LEFT,
1d40: 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20  .    RIGHT,.    
1d50: 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b  NONE,.    UNK.};
1d60: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b  .struct symbol {
1d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1d80: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame;        /* N
1d90: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f  ame of the symbo
1da0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78  l */.  int index
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
1dd0: 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  for this symbol 
1de0: 2a 2f 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c  */.  enum symbol
1df0: 5f 74 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a  _type type;   /*
1e00: 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c   Symbols are all
1e10: 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c   either TERMINAL
1e20: 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74  S or NTs */.  st
1e30: 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b  ruct rule *rule;
1e40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
1e50: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f   list of rules o
1e60: 66 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54  f this (if an NT
1e70: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  ) */.  struct sy
1e80: 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
1e90: 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  /* fallback toke
1ea0: 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 74  n in case this t
1eb0: 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72  oken doesn't par
1ec0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  se */.  int prec
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69   /* Precedence i
1ef0: 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74  f defined (-1 ot
1f00: 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e  herwise) */.  en
1f10: 75 6d 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63  um e_assoc assoc
1f20: 3b 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69  ;      /* Associ
1f30: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1f40: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1f60: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1f70: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1f80: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1f90: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1fa0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc0: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1fd0: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1fe0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1ff0: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
2000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2010: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
2020: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
2030: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
2040: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
2050: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
2060: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
2090: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
20a0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
20b0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
20c0: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
20d0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
20e0: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
20f0: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
2100: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
2110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2120: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
2130: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
2140: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
2170: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
2180: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
2190: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
21a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
21b0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
21c0: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
21d0: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
2200: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
2210: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
2220: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
2250: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
2260: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
2270: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
2280: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
2290: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
22a0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
22b0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
22c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
22e0: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
22f0: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
2300: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2310: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
2320: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
2330: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
2340: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
2350: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
2360: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
2370: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
2380: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
2390: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
23a0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
23b0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
23c0: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
23d0: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
23e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
23f0: 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20 41 6c 69  alias;    /* Ali
2400: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
2410: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
2420: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2440: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
2450: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
2460: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
2470: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
2480: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
2490: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
24a0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
24b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
24c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
24d0: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
24e0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
24f0: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
2500: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
2510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 72 68   const char **rh
2520: 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20 41 6e 20  salias;   /* An 
2530: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
2540: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
2550: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
2560: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
2570: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2580: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
2590: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
25a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
25b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
25c0: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
25d0: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
25e0: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72  reduced */.  str
25f0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63  uct symbol *prec
2600: 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65  sym;  /* Precede
2610: 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  nce symbol for t
2620: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  his rule */.  in
2630: 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20  t index;        
2640: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
2650: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
2660: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f  is rule */.  Boo
2670: 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b 20  lean canReduce; 
2680: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2690: 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65 76   this rule is ev
26a0: 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  er reduced */.  
26b0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
26c0: 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74  tlhs;    /* Next
26d0: 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20 73   rule with the s
26e0: 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72  ame LHS */.  str
26f0: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20  uct rule *next; 
2700: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75        /* Next ru
2710: 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  le in the global
2720: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   list */.};../* 
2730: 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
2740: 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  is a production 
2750: 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61 6d  rule of the gram
2760: 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69 74  mar together wit
2770: 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74  h.** a mark (dot
2780: 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75  ) showing how mu
2790: 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65 20  ch of that rule 
27a0: 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73 73  has been process
27b0: 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f  ed so far..** Co
27c0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c 73  nfigurations als
27d0: 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c  o contain a foll
27e0: 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73 20  ow-set which is 
27f0: 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69 6e  a list of termin
2800: 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68  al.** symbols wh
2810: 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ich are allowed 
2820: 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  to immediately f
2830: 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f 66  ollow the end of
2840: 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76   the rule..** Ev
2850: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
2860: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  n is recorded as
2870: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2880: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
2890: 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73  /.enum cfgstatus
28a0: 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45 2c 0a 20   {.  COMPLETE,. 
28b0: 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d 3b 0a 73   INCOMPLETE.};.s
28c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20  truct config {. 
28d0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
28e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
28f0: 20 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68   rule upon which
2900: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
2910: 6f 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a 20  on is based */. 
2920: 20 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20   int dot;       
2930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2940: 20 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a   parse point */.
2950: 20 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20 20    char *fws;    
2960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2970: 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68 69  llow-set for thi
2980: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
2990: 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
29a0: 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20   plink *fplp;   
29b0: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74     /* Follow-set
29c0: 20 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67 61   forward propaga
29d0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20  tion links */.  
29e0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70  struct plink *bp
29f0: 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c  lp;      /* Foll
2a00: 6f 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64 73  ow-set backwards
2a10: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
2a20: 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ks */.  struct s
2a30: 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 20  tate *stp;      
2a40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2a50: 74 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74 61  tate which conta
2a60: 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e  ins this */.  en
2a70: 75 6d 20 63 66 67 73 74 61 74 75 73 20 73 74 61  um cfgstatus sta
2a80: 74 75 73 3b 20 20 20 2f 2a 20 75 73 65 64 20 64  tus;   /* used d
2a90: 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73 65 74 20  uring followset 
2aa0: 61 6e 64 20 73 68 69 66 74 20 63 6f 6d 70 75 74  and shift comput
2ab0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ations */.  stru
2ac0: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74 3b  ct config *next;
2ad0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 6e       /* Next con
2ae0: 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68  figuration in th
2af0: 65 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  e state */.  str
2b00: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
2b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
2b20: 74 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  t basis configur
2b30: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 65 6e 75  ation */.};..enu
2b40: 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 53  m e_action {.  S
2b50: 48 49 46 54 2c 0a 20 20 41 43 43 45 50 54 2c 0a  HIFT,.  ACCEPT,.
2b60: 20 20 52 45 44 55 43 45 2c 0a 20 20 45 52 52 4f    REDUCE,.  ERRO
2b70: 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49 43 54 2c  R,.  SSCONFLICT,
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b90: 20 41 20 73 68 69 66 74 2f 73 68 69 66 74 20 63   A shift/shift c
2ba0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 52 43  onflict */.  SRC
2bb0: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
2bc0: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72        /* Was a r
2bd0: 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20  educe, but part 
2be0: 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  of a conflict */
2bf0: 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54 2c 20 20  .  RRCONFLICT,  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2c10: 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74  as a reduce, but
2c20: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c   part of a confl
2c30: 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52 45 53 4f  ict */.  SH_RESO
2c40: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
2c50: 20 20 2f 2a 20 57 61 73 20 61 20 73 68 69 66 74    /* Was a shift
2c60: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2c70: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2c80: 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c 56 45 44  */.  RD_RESOLVED
2c90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ca0: 20 57 61 73 20 72 65 64 75 63 65 2e 20 20 50 72   Was reduce.  Pr
2cb0: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
2cc0: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
2cd0: 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20 20 20 20  NOT_USED,       
2ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
2cf0: 74 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69  ted by compressi
2d00: 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54 52 45 44  on */.  SHIFTRED
2d10: 55 43 45 20 20 20 20 20 20 20 20 20 20 20 20 20  UCE             
2d20: 20 2f 2a 20 53 68 69 66 74 20 66 69 72 73 74 2c   /* Shift first,
2d30: 20 74 68 65 6e 20 72 65 64 75 63 65 20 2a 2f 0a   then reduce */.
2d40: 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69  };../* Every shi
2d50: 66 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65  ft or reduce ope
2d60: 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  ration is stored
2d70: 20 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   as one of the f
2d80: 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75  ollowing */.stru
2d90: 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74  ct action {.  st
2da0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
2db0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
2dc0: 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ok-ahead symbol 
2dd0: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69  */.  enum e_acti
2de0: 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e  on type;.  union
2df0: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
2e00: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
2e10: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
2e20: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
2e30: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
2e40: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2e50: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
2e60: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
2e70: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
2e80: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
2e90: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
2ea0: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2eb0: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
2ec0: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
2ed0: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
2ee0: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
2ef0: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
2f00: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2f10: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
2f20: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
2f30: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
2f40: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2f50: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2f60: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
2f70: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
2f80: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
2f90: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
2fa0: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
2fb0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
2fc0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
2fd0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2fe0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2ff0: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
3000: 6e 74 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  nt statenum;    
3010: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
3020: 6e 74 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ntial number for
3030: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
3040: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3050: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
3060: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
3070: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
3080: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
3090: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
30a0: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
30b0: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
30c0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
30d0: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
30e0: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
30f0: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
3100: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
3110: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
3120: 20 20 69 6e 74 20 69 44 66 6c 74 52 65 64 75 63    int iDfltReduc
3130: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  e;         /* De
3140: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 69 73 20  fault action is 
3150: 74 6f 20 52 45 44 55 43 45 20 62 79 20 74 68 69  to REDUCE by thi
3160: 73 20 72 75 6c 65 20 2a 2f 0a 20 20 73 74 72 75  s rule */.  stru
3170: 63 74 20 72 75 6c 65 20 2a 70 44 66 6c 74 52 65  ct rule *pDfltRe
3180: 64 75 63 65 3b 2f 2a 20 54 68 65 20 64 65 66 61  duce;/* The defa
3190: 75 6c 74 20 52 45 44 55 43 45 20 72 75 6c 65 2e  ult REDUCE rule.
31a0: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 52 65   */.  int autoRe
31b0: 64 75 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f  duce;          /
31c0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
31d0: 73 20 61 6e 20 61 75 74 6f 2d 72 65 64 75 63 65  s an auto-reduce
31e0: 20 73 74 61 74 65 20 2a 2f 0a 7d 3b 0a 23 64 65   state */.};.#de
31f0: 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28  fine NO_OFFSET (
3200: 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a  -2147483647)../*
3210: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f   A followset pro
3220: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e  pagation link in
3230: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
3240: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65   contents of one
3250: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
3260: 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75  n followset shou
3270: 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64  ld be propagated
3280: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e   to another when
3290: 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73  ever.** the firs
32a0: 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74  t changes. */.st
32b0: 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73  ruct plink {.  s
32c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
32d0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  p;      /* The c
32e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
32f0: 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a  which linked */.
3300: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
3310: 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68  next;      /* Th
3320: 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65  e next propagate
3330: 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   link */.};../* 
3340: 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72  The state vector
3350: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
3360: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
3370: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a   is recorded as.
3380: 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45  ** follows.  (LE
3390: 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62  MON uses no glob
33a0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  al variables and
33b0: 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73   makes little us
33c0: 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76  e of.** static v
33d0: 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64  ariables.  Field
33e0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
33f0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
3400: 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f   be thought.** o
3410: 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61  f as begin globa
3420: 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  l variables in t
3430: 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a  he program.) */.
3440: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20  struct lemon {. 
3450: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
3460: 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62  sorted;   /* Tab
3470: 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72  le of states sor
3480: 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d  ted by state num
3490: 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ber */.  struct 
34a0: 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20  rule *rule;     
34b0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
34c0: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
34d0: 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  nstate;         
34e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34f0: 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e  f states */.  in
3500: 74 20 6e 78 73 74 61 74 65 3b 20 20 20 20 20 20  t nxstate;      
3510: 20 20 20 20 20 20 20 2f 2a 20 6e 73 74 61 74 65         /* nstate
3520: 20 77 69 74 68 20 74 61 69 6c 20 64 65 67 65 6e   with tail degen
3530: 65 72 61 74 65 20 73 74 61 74 65 73 20 72 65 6d  erate states rem
3540: 6f 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  oved */.  int nr
3550: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
3560: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3570: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
3580: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
3590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35a0: 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
35b0: 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  nterminal symbol
35c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d  s */.  int nterm
35d0: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
35e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
35f0: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
3600: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3610: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
3620: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
3630: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
3640: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
3650: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
3660: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
3670: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
3680: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
3690: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
36a0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
36b0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
36c0: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
36d0: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
36e0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
36f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3700: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3710: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
3720: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
3730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3740: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
3750: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
3760: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
3770: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
3780: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
3790: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
37a0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
37b0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
37c0: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
37d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37e0: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
37f0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
3800: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
3810: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
3820: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3830: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
3840: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
3850: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
3860: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
3870: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
3880: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
3890: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
38a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
38b0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
38c0: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
38d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
38e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
38f0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3900: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
3910: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
3920: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
3930: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3940: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
3950: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
3960: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3980: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3990: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
39a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
39b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
39c0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
39d0: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
39e0: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
39f0: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
3a00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
3a10: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
3a20: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
3a30: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
3a40: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
3a50: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
3a60: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
3a70: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
3a80: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
3a90: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
3aa0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
3ab0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
3ac0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
3ad0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3ae0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3af0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
3b00: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
3b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3b20: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3b30: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
3b40: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
3b50: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
3b60: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
3b70: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
3b80: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
3b90: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3bb0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
3bc0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
3bd0: 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20 20 20  nactiontab;     
3be0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3bf0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
3c00: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
3c10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c  le */.  int tabl
3c20: 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  esize;          
3c30: 20 2f 2a 20 54 6f 74 61 6c 20 74 61 62 6c 65 20   /* Total table 
3c40: 73 69 7a 65 20 6f 66 20 61 6c 6c 20 74 61 62 6c  size of all tabl
3c50: 65 73 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  es in bytes */. 
3c60: 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20   int basisflag; 
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69            /* Pri
3c80: 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f  nt only basis co
3c90: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
3ca0: 20 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61    int has_fallba
3cb0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ck;        /* Tr
3cc0: 75 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62  ue if any %fallb
3cd0: 61 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74  ack is seen in t
3ce0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
3cf0: 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  int nolinenosfla
3d00: 67 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g;       /* True
3d10: 20 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65 6d   if #line statem
3d20: 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ents should not 
3d30: 62 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20  be printed */.  
3d40: 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20  char *argv0;    
3d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3d60: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
3d70: 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d  */.};..#define M
3d80: 65 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66  emoryCheck(X) if
3d90: 28 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78  ((X)==0){ \.  ex
3da0: 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79  tern void memory
3db0: 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65  _error(); \.  me
3dc0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a  mory_error(); \.
3dd0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
3de0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
3df0: 6c 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a  le "table.h" ***
3e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3e20: 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69  /*.** All code i
3e30: 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20  n this file has 
3e40: 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  been automatical
3e50: 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  ly generated.** 
3e60: 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61  from a specifica
3e70: 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  tion in the file
3e80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3e90: 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79   "table.q".** by
3ea0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65   the associative
3eb0: 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c   array code buil
3ec0: 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61  ding program "aa
3ed0: 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  gen"..** Do not 
3ee0: 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20  edit this file! 
3ef0: 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74   Instead, edit t
3f00: 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  he specification
3f10: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  .** file, then r
3f20: 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f  erun aagen..*/./
3f30: 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72  *.** Code for pr
3f40: 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20  ocessing tables 
3f50: 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
3f60: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
3f70: 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f  /./* Routines fo
3f80: 72 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72  r handling a str
3f90: 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63  ings */..const c
3fa0: 68 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e  har *Strsafe(con
3fb0: 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69  st char *);..voi
3fc0: 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76  d Strsafe_init(v
3fd0: 6f 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61 66  oid);.int Strsaf
3fe0: 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63  e_insert(const c
3ff0: 68 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68  har *);.const ch
4000: 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64  ar *Strsafe_find
4010: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
4020: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
4030: 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c   handling symbol
4040: 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  s of the grammar
4050: 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62   */..struct symb
4060: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63  ol *Symbol_new(c
4070: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e  onst char *);.in
4080: 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e  t Symbolcmpp(con
4090: 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74  st void *, const
40a0: 20 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53   void *);.void S
40b0: 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29  ymbol_init(void)
40c0: 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.int Symbol_ins
40d0: 65 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f  ert(struct symbo
40e0: 6c 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  l *, const char 
40f0: 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  *);.struct symbo
4100: 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63  l *Symbol_find(c
4110: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74  onst char *);.st
4120: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
4130: 62 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e  bol_Nth(int);.in
4140: 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76  t Symbol_count(v
4150: 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79 6d  oid);.struct sym
4160: 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72  bol **Symbol_arr
4170: 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20  ayof(void);../* 
4180: 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61  Routines to mana
4190: 67 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62  ge the state tab
41a0: 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69  le */..int Confi
41b0: 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20  gcmp(const char 
41c0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  *, const char *)
41d0: 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ;.struct state *
41e0: 53 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b  State_new(void);
41f0: 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74  .void State_init
4200: 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61 74  (void);.int Stat
4210: 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
4220: 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20  state *, struct 
4230: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
4240: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
4250: 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ind(struct confi
4260: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61  g *);.struct sta
4270: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
4280: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
4290: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
42a0: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
42b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
42c0: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
42d0: 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ble_init(void);.
42e0: 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  int Configtable_
42f0: 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f  insert(struct co
4300: 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20  nfig *);.struct 
4310: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
4320: 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ble_find(struct 
4330: 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20  config *);.void 
4340: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
4350: 72 28 69 6e 74 28 2a 29 28 73 74 72 75 63 74 20  r(int(*)(struct 
4360: 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a  config *));../**
4370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4380: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
4390: 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  action.c" ******
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
43c0: 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
43d0: 73 69 6e 67 20 70 61 72 73 65 72 20 61 63 74 69  sing parser acti
43e0: 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  ons in the LEMON
43f0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
4400: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  r..*/../* Alloca
4410: 74 65 20 61 20 6e 65 77 20 70 61 72 73 65 72 20  te a new parser 
4420: 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  action */.static
4430: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4440: 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29  Action_new(void)
4450: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
4460: 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69  t action *freeli
4470: 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
4480: 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69   action *newacti
4490: 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65 65 6c  on;..  if( freel
44a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
44b0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
44c0: 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65 65   = 100;.    free
44d0: 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 61  list = (struct a
44e0: 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61  ction *)calloc(a
44f0: 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  mt, sizeof(struc
4500: 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20  t action));.    
4510: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
4520: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4530: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
4540: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
4550: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61 72  ry for a new par
4560: 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20  ser action.");. 
4570: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
4580: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4590: 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66   i<amt-1; i++) f
45a0: 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
45b0: 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  = &freelist[i+1]
45c0: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61  ;.    freelist[a
45d0: 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
45e0: 20 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20    }.  newaction 
45f0: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
4600: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
4610: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
4620: 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a  n newaction;.}..
4630: 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61  /* Compare two a
4640: 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69  ctions for sorti
4650: 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65  ng purposes.  Re
4660: 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
4670: 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74  ero, or.** posit
4680: 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
4690: 20 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73 20   action is less 
46a0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
46b0: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  or greater than.
46c0: 2a 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a  ** the first.*/.
46d0: 73 74 61 74 69 63 20 69 6e 74 20 61 63 74 69 6f  static int actio
46e0: 6e 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20 61  ncmp(.  struct a
46f0: 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74  ction *ap1,.  st
4700: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32  ruct action *ap2
4710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
4720: 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e  rc = ap1->sp->in
4730: 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69  dex - ap2->sp->i
4740: 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ndex;.  if( rc==
4750: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69  0 ){.    rc = (i
4760: 6e 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20 28  nt)ap1->type - (
4770: 69 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20  int)ap2->type;. 
4780: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 26   }.  if( rc==0 &
4790: 26 20 28 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45  & (ap1->type==RE
47a0: 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70  DUCE || ap1->typ
47b0: 65 3d 3d 53 48 49 46 54 52 45 44 55 43 45 29 20  e==SHIFTREDUCE) 
47c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d  ){.    rc = ap1-
47d0: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61  >x.rp->index - a
47e0: 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b  p2->x.rp->index;
47f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
4800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e   ){.    rc = (in
4810: 74 29 20 28 61 70 32 20 2d 20 61 70 31 29 3b 0a  t) (ap2 - ap1);.
4820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4830: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73  .}../* Sort pars
4840: 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74  er actions */.st
4850: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
4860: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28  on *Action_sort(
4870: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
4880: 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28   *ap.){.  ap = (
4890: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29  struct action *)
48a0: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70  msort((char *)ap
48b0: 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e  ,(char **)&ap->n
48c0: 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74     (int(*)(const
48f0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
4900: 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a  r*))actioncmp);.
4910: 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a    return ap;.}..
4920: 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28  void Action_add(
4930: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
4940: 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65   **app,.  enum e
4950: 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20  _action type,.  
4960: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
4970: 70 2c 0a 20 20 63 68 61 72 20 2a 61 72 67 0a 29  p,.  char *arg.)
4980: 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  {.  struct actio
4990: 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20  n *newaction;.  
49a0: 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41 63 74 69  newaction = Acti
49b0: 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61  on_new();.  newa
49c0: 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61  ction->next = *a
49d0: 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77  pp;.  *app = new
49e0: 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74  action;.  newact
49f0: 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74 79 70 65  ion->type = type
4a00: 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73  ;.  newaction->s
4a10: 70 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79  p = sp;.  if( ty
4a20: 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20  pe==SHIFT ){.   
4a30: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74   newaction->x.st
4a40: 70 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  p = (struct stat
4a50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65  e *)arg;.  }else
4a60: 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d  {.    newaction-
4a70: 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74 20  >x.rp = (struct 
4a80: 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a  rule *)arg;.  }.
4a90: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
4aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f  ********* New co
4ab0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
4ac0: 74 68 65 20 22 61 63 74 74 61 62 22 20 6d 6f 64  the "acttab" mod
4ad0: 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ule ***********/
4ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75  ./*.** This modu
4af0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f  le implements ro
4b00: 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20 63 6f  utines use to co
4b10: 6e 73 74 72 75 63 74 20 74 68 65 20 79 79 5f 61  nstruct the yy_a
4b20: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a  ction[] table..*
4b30: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  /../*.** The sta
4b40: 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61 63 74  te of the yy_act
4b50: 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65 72 20  ion table under 
4b60: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20  construction is 
4b70: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a  an instance of.*
4b80: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
4b90: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
4ba0: 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   The yy_action t
4bb0: 61 62 6c 65 20 6d 61 70 73 20 74 68 65 20 70 61  able maps the pa
4bc0: 69 72 20 28 73 74 61 74 65 5f 6e 75 6d 62 65 72  ir (state_number
4bd0: 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74  , lookahead) int
4be0: 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e  o an.** action_n
4bf0: 75 6d 62 65 72 2e 20 20 54 68 65 20 74 61 62 6c  umber.  The tabl
4c00: 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  e is an array of
4c10: 20 69 6e 74 65 67 65 72 73 20 70 61 69 72 73 2e   integers pairs.
4c20: 20 20 54 68 65 20 73 74 61 74 65 5f 6e 75 6d 62    The state_numb
4c30: 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73  er.** determines
4c40: 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66 73   an initial offs
4c50: 65 74 20 69 6e 74 6f 20 74 68 65 20 79 79 5f 61  et into the yy_a
4c60: 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 20 54 68  ction array.  Th
4c70: 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76  e lookahead.** v
4c80: 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61 64 64  alue is then add
4c90: 65 64 20 74 6f 20 74 68 69 73 20 69 6e 69 74 69  ed to this initi
4ca0: 61 6c 20 6f 66 66 73 65 74 20 74 6f 20 67 65 74  al offset to get
4cb0: 20 61 6e 20 69 6e 64 65 78 20 58 20 69 6e 74 6f   an index X into
4cc0: 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f   the.** yy_actio
4cd0: 6e 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  n array. If the 
4ce0: 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61  aAction[X].looka
4cf0: 68 65 61 64 20 65 71 75 61 6c 73 20 74 68 65 20  head equals the 
4d00: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
4d10: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
4d20: 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 74 68 65   input, then the
4d30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 63   value of the ac
4d40: 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70  tion_number outp
4d50: 75 74 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e  ut is.** aAction
4d60: 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20  [X].action.  If 
4d70: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64  the lookaheads d
4d80: 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 6e  o not match then
4d90: 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20   the.** default 
4da0: 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73  action for the s
4db0: 74 61 74 65 5f 6e 75 6d 62 65 72 20 69 73 20 72  tate_number is r
4dc0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
4dd0: 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73 73 6f 63  ll actions assoc
4de0: 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69 6e  iated with a sin
4df0: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
4e00: 20 61 72 65 20 66 69 72 73 74 20 65 6e 74 65 72   are first enter
4e10: 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b  ed.** into aLook
4e20: 61 68 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75  ahead[] using mu
4e30: 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
4e40: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e  acttab_action().
4e50: 20 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61    Then the .** a
4e60: 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 61 74 20  ctions for that 
4e70: 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d  single state_num
4e80: 62 65 72 20 61 72 65 20 70 6c 61 63 65 64 20 69  ber are placed i
4e90: 6e 74 6f 20 74 68 65 20 61 41 63 74 69 6f 6e 5b  nto the aAction[
4ea0: 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77 69 74 68  ] .** array with
4eb0: 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74   a single call t
4ec0: 6f 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  o acttab_insert(
4ed0: 29 2e 20 20 54 68 65 20 61 63 74 74 61 62 5f 69  ).  The acttab_i
4ee0: 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20  nsert() call.** 
4ef0: 61 6c 73 6f 20 72 65 73 65 74 73 20 74 68 65 20  also resets the 
4f00: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72  aLookahead[] arr
4f10: 61 79 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ay in preparatio
4f20: 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a  n for the next.*
4f30: 2a 20 73 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a  * state number..
4f40: 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68  */.struct lookah
4f50: 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69  ead_action {.  i
4f60: 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20  nt lookahead;   
4f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
4f80: 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68  ue of the lookah
4f90: 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ead token */.  i
4fa0: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
4fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
4fc0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
4fd0: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
4fe0: 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  ad */.};.typedef
4ff0: 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 61   struct acttab a
5000: 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20 61 63  cttab;.struct ac
5010: 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63  ttab {.  int nAc
5020: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
5030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5040: 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20 69 6e  of used slots in
5050: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
5060: 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  int nActionAlloc
5070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5080: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
5090: 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f  for aAction[] */
50a0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68  .  struct lookah
50b0: 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ead_action.    *
50c0: 61 41 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  aAction,        
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
50e0: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
50f0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
5100: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c  ction */.    *aL
5110: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
5120: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
5130: 67 6c 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  gle new transact
5140: 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ion set */.  int
5150: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   mnLookahead;   
5160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
5170: 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  imum aLookahead[
5180: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  ].lookahead */. 
5190: 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20   int mnAction;  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 41 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74   Action associat
51c0: 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68  ed with mnLookah
51d0: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c  ead */.  int mxL
51e0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
51f0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
5200: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f   aLookahead[].lo
5210: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
5220: 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20   nLookahead;    
5230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
5240: 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b  d slots in aLook
5250: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
5260: 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63   nLookaheadAlloc
5270: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f  ;         /* Slo
5280: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  ts allocated in 
5290: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a  aLookahead[] */.
52a0: 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  };../* Return th
52b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
52c0: 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
52d0: 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64  tion table */.#d
52e0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 73 69 7a  efine acttab_siz
52f0: 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69  e(X) ((X)->nActi
5300: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5310: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5320: 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f  ntry in yy_actio
5330: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  n */.#define act
5340: 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e  tab_yyaction(X,N
5350: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5360: 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20  [N].action)../* 
5370: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
5380: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
5390: 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  yy_lookahead */.
53a0: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
53b0: 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20  ylookahead(X,N) 
53c0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
53d0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a  ].lookahead)../*
53e0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
53f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5400: 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74 61   the given actta
5410: 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  b */.void acttab
5420: 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70 29  _free(acttab *p)
5430: 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63  {.  free( p->aAc
5440: 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20  tion );.  free( 
5450: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b  p->aLookahead );
5460: 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a  .  free( p );.}.
5470: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
5480: 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63 74  ew acttab struct
5490: 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61  ure */.acttab *a
54a0: 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64  cttab_alloc(void
54b0: 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d  ){.  acttab *p =
54c0: 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c 6c   (acttab *) call
54d0: 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70  oc( 1, sizeof(*p
54e0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
54f0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
5500: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
5510: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
5520: 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61   for a new actta
5530: 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  b.");.    exit(1
5540: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
5550: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
5560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
5570: 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61  ../* Add a new a
5580: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72  ction to the cur
5590: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
55a0: 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68   set.  .**.** Th
55b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
55c0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
55d0: 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  ch lookahead for
55e0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a   a particular.**
55f0: 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20   state..*/.void 
5600: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 61 63  acttab_action(ac
5610: 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f  ttab *p, int loo
5620: 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63 74 69  kahead, int acti
5630: 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  on){.  if( p->nL
5640: 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f  ookahead>=p->nLo
5650: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a  okaheadAlloc ){.
5660: 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61      p->nLookahea
5670: 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20  dAlloc += 25;.  
5680: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20    p->aLookahead 
5690: 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68  = (struct lookah
56a0: 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65  ead_action *) re
56b0: 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61  alloc( p->aLooka
56c0: 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20  head,.          
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f     sizeof(p->aLo
56f0: 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e  okahead[0])*p->n
5700: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
5710: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f  ;.    if( p->aLo
5720: 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20  okahead==0 ){.  
5730: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
5740: 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
5750: 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  d\n");.      exi
5760: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
5770: 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    if( p->nLookah
5780: 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ead==0 ){.    p-
5790: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
57a0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
57b0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
57c0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
57d0: 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69  >mnAction = acti
57e0: 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  on;.  }else{.   
57f0: 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   if( p->mxLookah
5800: 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20  ead<lookahead ) 
5810: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
5820: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5830: 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  if( p->mnLookahe
5840: 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ad>lookahead ){.
5850: 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61        p->mnLooka
5860: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5870: 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ;.      p->mnAct
5880: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
5890: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f    }.  }.  p->aLo
58a0: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
58b0: 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ahead].lookahead
58c0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
58d0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d  p->aLookahead[p-
58e0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74  >nLookahead].act
58f0: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
5900: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b  p->nLookahead++;
5910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
5920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
5930: 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68 20  t built up with 
5940: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61  prior calls to a
5950: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a  cttab_action().*
5960: 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  * into the curre
5970: 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e  nt action table.
5980: 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68 65    Then reset the
5990: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
59a0: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65   back.** to an e
59b0: 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65 70  mpty set in prep
59c0: 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65  aration for a ne
59d0: 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61  w round of actta
59e0: 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73  b_action() calls
59f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5a00: 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  he offset into t
5a10: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
5a20: 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73  of the new trans
5a30: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61  action..*/.int a
5a40: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74  cttab_insert(act
5a50: 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  tab *p){.  int i
5a60: 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73  , j, k, n;.  ass
5a70: 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ert( p->nLookahe
5a80: 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ad>0 );..  /* Ma
5a90: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
5aa0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5ab0: 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65  hold the expande
5ac0: 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20  d action table. 
5ad0: 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74   ** in the worst
5ae0: 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73   case.  The wors
5af0: 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69 66  t case occurs if
5b00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5b10: 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62   set.  ** must b
5b20: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
5b30: 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e  e current action
5b40: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20   table.  */.  n 
5b50: 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  = p->mxLookahead
5b60: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   + 1;.  if( p->n
5b70: 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d  Action + n >= p-
5b80: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b  >nActionAlloc ){
5b90: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f  .    int oldAllo
5ba0: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  c = p->nActionAl
5bb0: 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74  loc;.    p->nAct
5bc0: 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ionAlloc = p->nA
5bd0: 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e  ction + n + p->n
5be0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30  ActionAlloc + 20
5bf0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
5c00: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
5c10: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
5c20: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69  ealloc( p->aActi
5c30: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
5c50: 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b  zeof(p->aAction[
5c60: 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  0])*p->nActionAl
5c70: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
5c80: 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  >aAction==0 ){. 
5c90: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
5ca0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
5cb0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
5cc0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
5cd0: 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b   for(i=oldAlloc;
5ce0: 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   i<p->nActionAll
5cf0: 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  oc; i++){.      
5d00: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
5d10: 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20  okahead = -1;.  
5d20: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
5d30: 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20  ].action = -1;. 
5d40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
5d50: 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67  can the existing
5d60: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f   action table lo
5d70: 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66  oking for an off
5d80: 73 65 74 20 74 68 61 74 20 69 73 20 61 20 0a 20  set that is a . 
5d90: 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f 66   ** duplicate of
5da0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5db0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46  nsaction set.  F
5dc0: 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  all out of the l
5dd0: 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20  oop.  ** if and 
5de0: 77 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63 61  when the duplica
5df0: 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a  te is found..  *
5e00: 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20  *.  ** i is the 
5e10: 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74  index in p->aAct
5e20: 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d  ion[] where p->m
5e30: 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e  nLookahead is in
5e40: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  serted..  */.  f
5e50: 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d  or(i=p->nAction-
5e60: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5e70: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
5e80: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
5e90: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
5ea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c  {.      /* All l
5eb0: 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63  ookaheads and ac
5ec0: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f  tions in the aLo
5ed0: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
5ee0: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
5ef0: 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  ust match agains
5f00: 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  t the candidate 
5f10: 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79  aAction[i] entry
5f20: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
5f30: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74  ->aAction[i].act
5f40: 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e  ion!=p->mnAction
5f50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
5f70: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
5f80: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
5f90: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
5fa0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
5fb0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
5fc0: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
5fd0: 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e  || k>=p->nAction
5fe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5ff0: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
6000: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6010: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6020: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61  lookahead ) brea
6030: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
6040: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
6050: 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69  action!=p->aActi
6060: 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62  on[k].action ) b
6070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6080: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
6090: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
60a0: 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  ue;..      /* No
60b0: 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68   possible lookah
60c0: 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20 69  ead value that i
60d0: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f  s not in the aLo
60e0: 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20  okahead[].      
60f0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
6100: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  s allowed to mat
6110: 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f  ch aAction[i] */
6120: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
6130: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6140: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
6150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
6160: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
6170: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
6180: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
6190: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
61a0: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
61b0: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
61c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61d0: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
61e0: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
61f0: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78  break;  /* An ex
6200: 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75  act match is fou
6210: 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a  nd at offset i *
6220: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
6230: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
6240: 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73  existing offsets
6250: 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
6260: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
6270: 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a  action, find an.
6280: 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66    ** an empty of
6290: 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63 74  fset in the aAct
62a0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77  ion[] table in w
62b0: 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64 20  hich we can add 
62c0: 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68  the.  ** aLookah
62d0: 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f  ead[] transactio
62e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c  n..  */.  if( i<
62f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b  0 ){.    /* Look
6300: 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74 68   for holes in th
6310: 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  e aAction[] tabl
6320: 65 20 74 68 61 74 20 66 69 74 20 74 68 65 20 63  e that fit the c
6330: 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c  urrent.    ** aL
6340: 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73  ookahead[] trans
6350: 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69  action.  Leave i
6360: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
6370: 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a  et of the hole..
6380: 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c      ** If no hol
6390: 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 69 20  es are found, i 
63a0: 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41  is left at p->nA
63b0: 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61  ction, which mea
63c0: 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  ns the.    ** tr
63d0: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
63e0: 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20  e appended. */. 
63f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6400: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20  >nActionAlloc - 
6410: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20  p->mxLookahead; 
6420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6430: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
6440: 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20  okahead<0 ){.   
6450: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6460: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
6470: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  ++){.          k
6480: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
6490: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
64a0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
64b0: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   i;.          if
64c0: 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  ( k<0 ) break;. 
64d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
64e0: 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61  aAction[k].looka
64f0: 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b  head>=0 ) break;
6500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6510: 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f     if( j<p->nLoo
6520: 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75  kahead ) continu
6530: 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e;.        for(j
6540: 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; j<p->nAction
6550: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
6560: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
6570: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a  [j].lookahead==j
6580: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d  +p->mnLookahead-
6590: 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
65a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
65b0: 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   j==p->nAction )
65c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
65d0: 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65  k;  /* Fits in e
65e0: 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  mpty slots */.  
65f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6600: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49      }.  }.  /* I
6610: 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f  nsert transactio
6620: 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20 69  n set at index i
6630: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  . */.  for(j=0; 
6640: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
6650: 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70   j++){.    k = p
6660: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
6670: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
6680: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
6690: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b      p->aAction[k
66a0: 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ] = p->aLookahea
66b0: 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e  d[j];.    if( k>
66c0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d  =p->nAction ) p-
66d0: 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a  >nAction = k+1;.
66e0: 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    }.  p->nLookah
66f0: 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52  ead = 0;..  /* R
6700: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
6710: 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20 74   that is added t
6720: 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  o the lookahead 
6730: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
6740: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
6750: 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66  nto yy_action of
6760: 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20   the action */. 
6770: 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d   return i - p->m
6780: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f  nLookahead;.}../
6790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67a0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
67b0: 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a  file "build.c" *
67c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
67e0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
67f0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65  construction the
6800: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
6810: 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45  chine for the LE
6820: 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65  MON.** parser ge
6830: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
6840: 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63  Find a precedenc
6850: 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72  e symbol of ever
6860: 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  y rule in the gr
6870: 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ammar..** .** Th
6880: 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68 20  ose rules which 
6890: 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e 63  have a precedenc
68a0: 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69  e symbol coded i
68b0: 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67  n the input.** g
68c0: 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65  rammar using the
68d0: 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73   "[symbol]" cons
68e0: 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61  truct will alrea
68f0: 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72  dy have the.** r
6900: 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64  p->precsym field
6910: 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20   filled.  Other 
6920: 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68  rules take as th
6930: 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a  eir precedence.*
6940: 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72  * symbol the fir
6950: 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69  st RHS symbol wi
6960: 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65  th a defined pre
6970: 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65  cedence.  If the
6980: 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48  re.** are not RH
6990: 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61  S symbols with a
69a0: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
69b0: 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64 65  nce, the precede
69c0: 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69  nce.** symbol fi
69d0: 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e  eld is left blan
69e0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52  k..*/.void FindR
69f0: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 73  ulePrecedences(s
6a00: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29  truct lemon *xp)
6a10: 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
6a20: 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78   *rp;.  for(rp=x
6a30: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
6a40: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
6a50: 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  f( rp->precsym==
6a60: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
6a70: 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , j;.      for(i
6a80: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26  =0; i<rp->nrhs &
6a90: 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30  & rp->precsym==0
6aa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6ab0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
6ac0: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
6ad0: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
6ae0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
6af0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
6b00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e   for(j=0; j<sp->
6b10: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
6b20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6b30: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72  p->subsym[j]->pr
6b40: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
6b50: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
6b60: 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b  ym = sp->subsym[
6b70: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j];.            
6b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6ba0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
6bb0: 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70   ){.          rp
6bd0: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e  ->precsym = rp->
6be0: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
6bf0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6c00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
6c10: 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e  ./* Find all non
6c20: 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20  terminals which 
6c30: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68  will generate th
6c40: 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  e empty string..
6c50: 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20  ** Then go back 
6c60: 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20  and compute the 
6c70: 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76  first sets of ev
6c80: 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  ery nonterminal.
6c90: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65  .** The first se
6ca0: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
6cb0: 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d  all terminal sym
6cc0: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62  bols which can b
6cd0: 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67  egin.** a string
6ce0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
6cf0: 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  at nonterminal..
6d00: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  */.void FindFirs
6d10: 74 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d  tSets(struct lem
6d20: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
6d30: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
6d40: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
6d50: 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f   progress;..  fo
6d60: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
6d70: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
6d80: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
6d90: 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  i]->lambda = LEM
6da0: 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20  ON_FALSE;.  }.  
6db0: 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72  for(i=lemp->nter
6dc0: 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  minal; i<lemp->n
6dd0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
6de0: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
6df0: 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53  i]->firstset = S
6e00: 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20  etNew();.  }..  
6e10: 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65  /* First compute
6e20: 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a   all lambdas */.
6e30: 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65    do{.    progre
6e40: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
6e50: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
6e60: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
6e70: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
6e80: 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e  hs->lambda ) con
6e90: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
6ea0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
6eb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6ec0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
6ed0: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
6ee0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6ef0: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
6f00: 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61 6d  MINAL || sp->lam
6f10: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
6f20: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
6f30: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
6f40: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
6f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f60: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
6f70: 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  {.        rp->lh
6f80: 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  s->lambda = LEMO
6f90: 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20  N_TRUE;.        
6fa0: 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
6fb0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
6fc0: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
6fd0: 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70  ;..  /* Now comp
6fe0: 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65  ute all first se
6ff0: 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ts */.  do{.    
7000: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
7010: 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67  1, *s2;.    prog
7020: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
7030: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
7040: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
7050: 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70  ){.      s1 = rp
7060: 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72  ->lhs;.      for
7070: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
7080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7090: 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  s2 = rp->rhs[i];
70a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d  .        if( s2-
70b0: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
70c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  ){.          pro
70d0: 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28  gress += SetAdd(
70e0: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
70f0: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
7100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7110: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 32 2d 3e    }else if( s2->
7120: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
7130: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
7140: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e   for(j=0; j<s2->
7150: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
7160: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72             progr
7170: 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31  ess += SetAdd(s1
7180: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 73  ->firstset,s2->s
7190: 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29  ubsym[j]->index)
71a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
71b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
71c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
71d0: 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20   s1==s2 ){.     
71e0: 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d       if( s1->lam
71f0: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7200: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7220: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
7230: 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73  etUnion(s1->firs
7240: 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65  tset,s2->firstse
7250: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
7260: 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s2->lambda==LE
7270: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
7280: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
72a0: 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b  ile( progress );
72b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
72c0: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28   Compute all LR(
72d0: 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74 68  0) states for th
72e0: 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b  e grammar.  Link
72f0: 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74  s.** are added t
7300: 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73  o between some s
7310: 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74 68  tates so that th
7320: 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73  e LR(1) follow s
7330: 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f  ets.** can be co
7340: 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f  mputed later..*/
7350: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
7360: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
7370: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
7380: 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66    /* forward ref
7390: 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46  erence */.void F
73a0: 69 6e 64 53 74 61 74 65 73 28 73 74 72 75 63 74  indStates(struct
73b0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
73c0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
73d0: 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *sp;.  struct ru
73e0: 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69  le *rp;..  Confi
73f0: 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20  glist_init();.. 
7400: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61   /* Find the sta
7410: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
7420: 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29  f( lemp->start )
7430: 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f  {.    sp = Symbo
7440: 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61  l_find(lemp->sta
7450: 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  rt);.    if( sp=
7460: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  =0 ){.      Erro
7470: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
7480: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63  ame,0,."The spec
7490: 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d 62  ified start symb
74a0: 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  ol \"%s\" is not
74b0: 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69   \.in a nontermi
74c0: 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  nal of the gramm
74d0: 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c  ar.  \"%s\" will
74e0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
74f0: 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69  start \.symbol i
7500: 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73  nstead.",lemp->s
7510: 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d  tart,lemp->rule-
7520: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
7530: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
7540: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20  t++;.      sp = 
7550: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
7560: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7570: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
7580: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20  ule->lhs;.  }.. 
7590: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
75a0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64  e start symbol d
75b0: 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20  oesn't occur on 
75c0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
75d0: 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20  ide of.  ** any 
75e0: 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  rule.  Report an
75f0: 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65   error if it doe
7600: 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20  s.  (YACC would 
7610: 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20  generate a new. 
7620: 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c   ** start symbol
7630: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20   in this case.) 
7640: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
7650: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
7660: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e  p->next){.    in
7670: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
7680: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
7690: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  +){.      if( rp
76a0: 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20  ->rhs[i]==sp ){ 
76b0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65    /* FIX ME:  De
76c0: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72  al with multiter
76d0: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  minals */.      
76e0: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
76f0: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
7700: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c  e start symbol \
7710: 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20  "%s\" occurs on 
7720: 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64  the \.right-hand
7730: 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e   side of a rule.
7740: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c   This will resul
7750: 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68  t in a parser wh
7760: 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77  ich \.does not w
7770: 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73  ork properly.",s
7780: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
7790: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
77a0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
77b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
77c0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
77d0: 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20  ion set for the 
77e0: 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a  first state.  **
77f0: 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68   is all rules wh
7800: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61  ich have the sta
7810: 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65  rt symbol as the
7820: 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e  ir.  ** left-han
7830: 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28  d side */.  for(
7840: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=sp->rule; rp;
7850: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29   rp=rp->nextlhs)
7860: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  {.    struct con
7870: 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20  fig *newcfp;.   
7880: 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20   rp->lhsStart = 
7890: 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20  1;.    newcfp = 
78a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
78b0: 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53  sis(rp,0);.    S
78c0: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
78d0: 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  s,0);.  }..  /* 
78e0: 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  Compute the firs
78f0: 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74  t state.  All ot
7900: 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20  her states will 
7910: 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  be.  ** computed
7920: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
7930: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74  uring the comput
7940: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
7950: 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65  st one..  ** The
7960: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
7970: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
7980: 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64  tate is not used
7990: 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
79a0: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72  state(lemp);.  r
79b0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
79c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
79d0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69   a state which i
79e0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  s described by t
79f0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7a00: 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68  .** list which h
7a10: 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72  as been built fr
7a20: 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66  om calls to Conf
7a30: 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50  iglist_add..*/.P
7a40: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
7a50: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
7a60: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
7a70: 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77  tate *); /* Forw
7a80: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
7a90: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
7aa0: 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c  etstate(struct l
7ab0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7ac0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7ad0: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
7ae0: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
7af0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
7b00: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
7b10: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
7b20: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
7b30: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
7b40: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
7b50: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
7b60: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
7b70: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
7b80: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
7b90: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
7ba0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
7bb0: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
7bc0: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
7bd0: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
7be0: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
7bf0: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
7c00: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
7c10: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
7c20: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
7c30: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
7c40: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
7c50: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
7c60: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
7c70: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
7c80: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
7c90: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
7ca0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7cb0: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
7cc0: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
7cd0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
7ce0: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
7cf0: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
7d00: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
7d10: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
7d20: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
7d30: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
7d40: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
7d50: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
7d60: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
7d70: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
7d80: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
7d90: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
7da0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
7db0: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
7dc0: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
7dd0: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
7de0: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
7df0: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
7e00: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
7e10: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
7e20: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
7e30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
7e40: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
7e50: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
7e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
7e70: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
7e80: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
7e90: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
7ea0: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
7eb0: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
7ec0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
7ed0: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
7ee0: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
7ef0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
7f00: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
7f10: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
7f20: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
7f30: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
7f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7f50: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
7f60: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
7f70: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
7f80: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
7f90: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
7fa0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7fb0: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
7fc0: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
7fd0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
7fe0: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
7ff0: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
8000: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
8010: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
8020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
8030: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
8040: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
8050: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
8060: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
8070: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
8080: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
8090: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
80a0: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
80b0: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
80c0: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
80d0: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
80e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
80f0: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
8100: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
8110: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
8120: 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  l(struct symbol 
8130: 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f  *a, struct symbo
8140: 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  l *b).{.  int i;
8150: 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65  .  if( a==b ) re
8160: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d  turn 1;.  if( a-
8170: 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
8180: 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b  INAL ) return 0;
8190: 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d  .  if( b->type!=
81a0: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20  MULTITERMINAL ) 
81b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
81c0: 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e  a->nsubsym!=b->n
81d0: 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20  subsym ) return 
81e0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
81f0: 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29  a->nsubsym; i++)
8200: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62  {.    if( a->sub
8210: 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79  sym[i]!=b->subsy
8220: 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  m[i] ) return 0;
8230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
8240: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  .}../* Construct
8250: 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73   all successor s
8260: 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76  tates to the giv
8270: 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75  en state.  A "su
8280: 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74  ccessor".** stat
8290: 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77  e is any state w
82a0: 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63  hich can be reac
82b0: 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61  hed by a shift a
82c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
82d0: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
82e0: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
82f0: 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74  *lemp, struct st
8300: 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74  ate *stp).{.  st
8310: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
8320: 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
8330: 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69  g thru the confi
8340: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
8350: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
8360: 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20  onfig *bcfp; /* 
8370: 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  For the inner lo
8380: 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f  op on config clo
8390: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
83a0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
83b0: 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f   *newcfg;  /* */
83c0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
83d0: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
83e0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
83f0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
8400: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
8410: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
8420: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
8430: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
8440: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
8450: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
8460: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
8470: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
8480: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
8490: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
84a0: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
84b0: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
84c0: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
84d0: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
84e0: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
84f0: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
8500: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
8510: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
8520: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
8530: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8540: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
8550: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
8560: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
8570: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
8580: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
8590: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
85a0: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
85b0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
85c0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
85d0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
85e0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
85f0: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
8600: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
8610: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
8620: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
8630: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
8640: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
8650: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
8660: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
8670: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
86a0: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
86b0: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
86c0: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
86e0: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
86f0: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
8700: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
8710: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
8720: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
8730: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
8740: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
8750: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
8760: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
8770: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
8780: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
8790: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
87a0: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
87b0: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
87c0: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
87d0: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
87e0: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
87f0: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
8800: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
8810: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
8820: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
8830: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
8840: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
8850: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
8860: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
8870: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
8880: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
8890: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
88a0: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
88b0: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
88c0: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
88d0: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
88e0: 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62    if( !same_symb
88f0: 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e  ol(bsp,sp) ) con
8900: 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d  tinue;      /* M
8910: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
8920: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
8930: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
8940: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
8950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8960: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
8970: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
8980: 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67   newcfg = Config
8990: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
89a0: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
89b0: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
89c0: 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70  _add(&newcfg->bp
89d0: 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a  lp,bcfp);.    }.
89e0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  .    /* Get a po
89f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 61  inter to the sta
8a00: 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  te described by 
8a10: 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  the basis config
8a20: 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20  uration set.    
8a30: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  ** constructed i
8a40: 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20  n the preceding 
8a50: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73  loop */.    news
8a60: 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65  tp = getstate(le
8a70: 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  mp);..    /* The
8a80: 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22 20   state "newstp" 
8a90: 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20  is reached from 
8aa0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8ab0: 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f  by a shift actio
8ac0: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  n.    ** on the 
8ad0: 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20  symbol "sp" */. 
8ae0: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
8af0: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
8b00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8b10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8b20: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  sp->nsubsym; i++
8b30: 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f  ){.        Actio
8b40: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53  n_add(&stp->ap,S
8b50: 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  HIFT,sp->subsym[
8b60: 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70  i],(char*)newstp
8b70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69  else{.      Acti
8b90: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
8ba0: 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a  SHIFT,sp,(char *
8bb0: 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a  )newstp);.    }.
8bc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
8bd0: 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61  struct the propa
8be0: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a  gation links.*/.
8bf0: 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73  void FindLinks(s
8c00: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
8c10: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
8c20: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
8c30: 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74  fp, *other;.  st
8c40: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
8c50: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
8c60: 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73  *plp;..  /* Hous
8c70: 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a  ekeeping detail:
8c80: 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65  .  ** Add to eve
8c90: 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  ry propagate lin
8ca0: 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b  k a pointer back
8cb0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f   to the state to
8cc0: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
8cd0: 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64  link is attached
8ce0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
8cf0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
8d00: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
8d10: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
8d20: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
8d30: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8d40: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8d50: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70    cfp->stp = stp
8d60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8d70: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61  * Convert all ba
8d80: 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72  cklinks into for
8d90: 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c  ward links.  Onl
8da0: 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20  y the forward.  
8db0: 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65  ** links are use
8dc0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  d in the follow-
8dd0: 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  set computation.
8de0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8df0: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8e00: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
8e10: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
8e20: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
8e30: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
8e40: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
8e50: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70   for(plp=cfp->bp
8e60: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
8e70: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
8e80: 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66   other = plp->cf
8e90: 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b  p;.        Plink
8ea0: 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c  _add(&other->fpl
8eb0: 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,cfp);.      }.
8ec0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
8ed0: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c  Compute all foll
8ee0: 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  owsets..**.** A 
8ef0: 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65  followset is the
8f00: 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62   set of all symb
8f10: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f  ols which can co
8f20: 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  me immediately.*
8f30: 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67  * after a config
8f40: 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  uration..*/.void
8f50: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
8f60: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8f70: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
8f80: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8f90: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  cfp;.  struct pl
8fa0: 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20  ink *plp;.  int 
8fb0: 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20  progress;.  int 
8fc0: 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69  change;..  for(i
8fd0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8fe0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  te; i++){.    fo
8ff0: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
9000: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
9010: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
9020: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74  .      cfp->stat
9030: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
9040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
9050: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
9060: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
9070: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9080: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
9090: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
90a0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
90b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
90c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
90d0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
90e0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
90f0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
9100: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
9110: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
9120: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
9130: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
9140: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
9150: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
9160: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
9170: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
9180: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
9190: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
91a0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
91b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
91c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
91d0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
91e0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  MPLETE;.      }.
91f0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9200: 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73  progress );.}..s
9210: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
9220: 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63  e_conflict(struc
9230: 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63  t action *,struc
9240: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
9250: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64   Compute the red
9260: 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64  uce actions, and
9270: 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   resolve conflic
9280: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  ts..*/.void Find
9290: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
92a0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
92b0: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
92c0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
92d0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
92e0: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
92f0: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
9300: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
9310: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
9320: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20   reduce actions 
9330: 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61  .  ** A reduce a
9340: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66  ction is added f
9350: 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  or each element 
9360: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74  of the followset
9370: 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69   of.  ** a confi
9380: 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68  guration which h
9390: 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68  as its dot at th
93a0: 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e  e extreme right.
93b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
93c0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
93d0: 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70   i++){   /* Loop
93e0: 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
93f0: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
9400: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
9410: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
9420: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
9430: 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f  p->next){  /* Lo
9440: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66  op over all conf
9450: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  igurations */.  
9460: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d      if( cfp->rp-
9470: 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20  >nrhs==cfp->dot 
9480: 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  ){        /* Is 
9490: 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72  dot at extreme r
94a0: 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20  ight? */.       
94b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
94c0: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
94d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
94e0: 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77   SetFind(cfp->fw
94f0: 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s,j) ){.        
9500: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64      /* Add a red
9510: 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68  uce action to th
9520: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
9530: 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ich will reduce 
9540: 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  by the.         
9550: 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d     ** rule "cfp-
9560: 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b  >rp" if the look
9570: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20  ahead symbol is 
9580: 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  "lemp->symbols[j
9590: 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ]" */.          
95a0: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
95b0: 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d  p->ap,REDUCE,lem
95c0: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63  p->symbols[j],(c
95d0: 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a  har *)cfp->rp);.
95e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
95f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9600: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
9610: 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67 20  d the accepting 
9620: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c  token */.  if( l
9630: 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20  emp->start ){.  
9640: 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
9650: 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b  nd(lemp->start);
9660: 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29  .    if( sp==0 )
9670: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65   sp = lemp->rule
9680: 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->lhs;.  }else{.
9690: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
96a0: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20  ule->lhs;.  }.  
96b0: 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66 69  /* Add to the fi
96c0: 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63 68  rst state (which
96d0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 73   is always the s
96e0: 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66  tarting state of
96f0: 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65   the.  ** finite
9700: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20   state machine) 
9710: 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43  an action to ACC
9720: 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61  EPT if the looka
9730: 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a  head is the.  **
9740: 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e   start nontermin
9750: 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e  al.  */.  Action
9760: 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74  _add(&lemp->sort
9770: 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54  ed[0]->ap,ACCEPT
9780: 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65  ,sp,0);..  /* Re
9790: 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20  solve conflicts 
97a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
97b0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
97c0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61  +){.    struct a
97d0: 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b  ction *ap, *nap;
97e0: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
97f0: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
9800: 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e  /* assert( stp->
9810: 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70  ap ); */.    stp
9820: 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f  ->ap = Action_so
9830: 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20  rt(stp->ap);.   
9840: 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
9850: 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b   ap && ap->next;
9860: 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
9870: 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d       for(nap=ap-
9880: 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61  >next; nap && na
9890: 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e  p->sp==ap->sp; n
98a0: 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20  ap=nap->next){. 
98b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
98c0: 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20  wo actions "ap" 
98d0: 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74  and "nap" have t
98e0: 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61  he same lookahea
98f0: 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46  d..         ** F
9900: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
9910: 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  one should be us
9920: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c  ed */.         l
9930: 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b  emp->nconflict +
9940: 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  = resolve_confli
9950: 63 74 28 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20  ct(ap,nap);.    
9960: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9970: 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   /* Report an er
9980: 72 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c  ror for each rul
9990: 65 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72  e that can never
99a0: 20 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a   be reduced. */.
99b0: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
99c0: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
99d0: 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64  next) rp->canRed
99e0: 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  uce = LEMON_FALS
99f0: 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  E;.  for(i=0; i<
9a00: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
9a10: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61  +){.    struct a
9a20: 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66  ction *ap;.    f
9a30: 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  or(ap=lemp->sort
9a40: 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61  ed[i]->ap; ap; a
9a50: 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
9a60: 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
9a70: 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e  =REDUCE ) ap->x.
9a80: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
9a90: 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20  LEMON_TRUE;.    
9aa0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  }.  }.  for(rp=l
9ab0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
9ac0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
9ad0: 20 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75   if( rp->canRedu
9ae0: 63 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ce ) continue;. 
9af0: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
9b00: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
9b10: 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75  uleline,"This ru
9b20: 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65  le can not be re
9b30: 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20  duced.\n");.    
9b40: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
9b50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f  ;.  }.}../* Reso
9b60: 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62  lve a conflict b
9b70: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67  etween the two g
9b80: 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49  iven actions.  I
9b90: 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63  f the.** conflic
9ba0: 74 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c  t can't be resol
9bb0: 76 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ved, return non-
9bc0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c  zero..**.** NO L
9bd0: 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20  ONGER TRUE:.**  
9be0: 20 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f   To resolve a co
9bf0: 6e 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f  nflict, first lo
9c00: 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74  ok to see if eit
9c10: 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  her action.**   
9c20: 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72  is on an error r
9c30: 75 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ule.  In that ca
9c40: 73 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74  se, take the act
9c50: 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69  ion which.**   i
9c60: 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64  s not associated
9c70: 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20   with the error 
9c80: 72 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65  rule.  If neithe
9c90: 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61  r or both.**   a
9ca0: 63 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63  ctions are assoc
9cb0: 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  iated with an er
9cc0: 72 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74  ror rule, then t
9cd0: 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70  ry to.**   use p
9ce0: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73  recedence to res
9cf0: 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63  olve the conflic
9d00: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  t..**.** If eith
9d10: 65 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53  er action is a S
9d20: 48 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  HIFT, then it mu
9d30: 73 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73  st be apx.  This
9d40: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e  .** function won
9d50: 27 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e  't work if apx->
9d60: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64  type==REDUCE and
9d70: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
9d80: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
9d90: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
9da0: 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  t(.  struct acti
9db0: 6f 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75 63  on *apx,.  struc
9dc0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b  t action *apy.){
9dd0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
9de0: 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69   *spx, *spy;.  i
9df0: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
9e00: 20 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70   assert( apx->sp
9e10: 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a  ==apy->sp );  /*
9e20: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65   Otherwise there
9e30: 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e   would be no con
9e40: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61  flict */.  if( a
9e50: 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  px->type==SHIFT 
9e60: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48  && apy->type==SH
9e70: 49 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e  IFT ){.    apy->
9e80: 74 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43  type = SSCONFLIC
9e90: 54 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  T;.    errcnt++;
9ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e  .  }.  if( apx->
9eb0: 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61  type==SHIFT && a
9ec0: 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  py->type==REDUCE
9ed0: 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70   ){.    spx = ap
9ee0: 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d  x->sp;.    spy =
9ef0: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
9f00: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79  sym;.    if( spy
9f10: 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  ==0 || spx->prec
9f20: 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c  <0 || spy->prec<
9f30: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  0 ){.      /* No
9f40: 74 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65  t enough precede
9f50: 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nce information.
9f60: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
9f70: 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54  ype = SRCONFLICT
9f80: 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b  ;.      errcnt++
9f90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9fa0: 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70  spx->prec>spy->p
9fb0: 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 68 69 67  rec ){    /* hig
9fc0: 68 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77  her precedence w
9fd0: 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  ins */.      apy
9fe0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
9ff0: 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LVED;.    }else 
a000: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70  if( spx->prec<sp
a010: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
a020: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f   apx->type = SH_
a030: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
a040: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
a050: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
a060: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48  spx->assoc==RIGH
a070: 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72  T ){ /* Use oper
a080: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70  ator */.      ap
a090: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
a0a0: 4f 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20  OLVED;          
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76     /* associativ
a0d0: 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ity */.    }else
a0e0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
a0f0: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
a100: 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b  ->assoc==LEFT ){
a110: 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69    /* to break ti
a120: 65 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e  e */.      apx->
a130: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
a140: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
a150: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78       assert( spx
a160: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
a170: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
a180: 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61  =NONE );.      a
a190: 70 78 2d 3e 74 79 70 65 20 3d 20 45 52 52 4f 52  px->type = ERROR
a1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
a1b0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52  if( apx->type==R
a1c0: 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79  EDUCE && apy->ty
a1d0: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
a1e0: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72    spx = apx->x.r
a1f0: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
a200: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
a210: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
a220: 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d  ( spx==0 || spy=
a230: 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c  =0 || spx->prec<
a240: 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72  0 ||.    spy->pr
a250: 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  ec<0 || spx->pre
a260: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  c==spy->prec ){.
a270: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
a280: 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  = RRCONFLICT;.  
a290: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
a2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
a2b0: 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20  >prec>spy->prec 
a2c0: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
a2d0: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
a2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a2f0: 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70  spx->prec<spy->p
a300: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78  rec ){.      apx
a310: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
a320: 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LVED;.    }.  }e
a330: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
a340: 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70   .      apx->typ
a350: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
a360: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
a370: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
a380: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
a390: 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==SSCONFLICT ||
a3a0: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
a3b0: 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SRCONFLICT ||.
a3c0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
a3d0: 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =RRCONFLICT ||. 
a3e0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
a3f0: 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  SH_RESOLVED ||. 
a400: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
a410: 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  RD_RESOLVED ||. 
a420: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
a430: 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SSCONFLICT ||.  
a440: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
a450: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
a460: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52     apy->type==RR
a470: 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a  CONFLICT.    );.
a480: 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43      /* The REDUC
a490: 45 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e  E/SHIFT case can
a4a0: 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75  not happen becau
a4b0: 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62  se SHIFTs come b
a4c0: 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44  efore.    ** RED
a4d0: 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  UCEs on the list
a4e0: 2e 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  .  If we reach t
a4f0: 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73  his point it mus
a500: 74 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20  t be because.   
a510: 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63   ** the parser c
a520: 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65  onflict had alre
a530: 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ady been resolve
a540: 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  d. */.  }.  retu
a550: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  rn errcnt;.}./**
a560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a570: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
a580: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22  e "configlist.c"
a590: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
a5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
a5b0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72  * Routines to pr
a5c0: 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69  ocessing a confi
a5d0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
a5e0: 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61  d building a sta
a5f0: 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  te.** in the LEM
a600: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
a610: 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
a620: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66  struct config *f
a630: 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  reelist = 0;    
a640: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
a650: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  e configurations
a660: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
a670: 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e  t config *curren
a680: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
a690: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63  Top of list of c
a6a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
a6b0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
a6c0: 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65  onfig **currente
a6d0: 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73  nd = 0;   /* Las
a6e0: 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e  t on list of con
a6f0: 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  figs */.static s
a700: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61  truct config *ba
a710: 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sis = 0;        
a720: 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20   /* Top of list 
a730: 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73  of basis configs
a740: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
a750: 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73  t config **basis
a760: 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  end = 0;     /* 
a770: 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  End of list of b
a780: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
a790: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
a7a0: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f  nter to a new co
a7b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
a7c0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f  RIVATE struct co
a7d0: 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28  nfig *newconfig(
a7e0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
a7f0: 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66  ig *newcfg;.  if
a800: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
a810: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a820: 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20  int amt = 3;.   
a830: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
a840: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c  uct config *)cal
a850: 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
a860: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20  (struct config) 
a870: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
a880: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
a890: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
a8a0: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
a8b0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
a8c0: 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  new configuratio
a8d0: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
a8e0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
a8f0: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
a900: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
a910: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
a920: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
a930: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
a940: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
a950: 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  cfg = freelist;.
a960: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
a970: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
a980: 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a  eturn newcfg;.}.
a990: 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72  ./* The configur
a9a0: 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e  ation "old" is n
a9b0: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f  o longer used */
a9c0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65  .PRIVATE void de
a9d0: 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63  leteconfig(struc
a9e0: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b  t config *old).{
a9f0: 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66  .  old->next = f
aa00: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
aa10: 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  ist = old;.}../*
aa20: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   Initialized the
aa30: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
aa40: 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76  ist builder */.v
aa50: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  oid Configlist_i
aa60: 6e 69 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  nit(){.  current
aa70: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
aa80: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
aa90: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
aaa0: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
aab0: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  .  Configtable_i
aac0: 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b  nit();.  return;
aad0: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
aae0: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
aaf0: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
ab00: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
ab10: 6c 69 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20  list_reset(){.  
ab20: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
ab30: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72  urrentend = &cur
ab40: 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20  rent;.  basis = 
ab50: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
ab60: 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67  &basis;.  Config
ab70: 74 61 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a  table_clear(0);.
ab80: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
ab90: 41 64 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66  Add another conf
aba0: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65  iguration to the
abb0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
abc0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
abd0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
abe0: 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 72  _add(.  struct r
abf0: 75 6c 65 20 2a 72 70 2c 20 20 20 20 2f 2a 20 54  ule *rp,    /* T
ac00: 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  he rule */.  int
ac10: 20 64 6f 74 20 20 20 20 20 20 20 20 20 20 20 20   dot            
ac20: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
ac30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75  he RHS of the ru
ac40: 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f 74  le where the dot
ac50: 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 74   goes */.){.  st
ac60: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
ac70: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
ac80: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
ac90: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
aca0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
acb0: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
acc0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
acd0: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
ace0: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
acf0: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
ad00: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
ad10: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
ad20: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
ad30: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
ad40: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
ad50: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
ad60: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
ad70: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
ad80: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
ad90: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
ada0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
adb0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
adc0: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f  fp->next;.    Co
add0: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
ade0: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
adf0: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41  urn cfp;.}../* A
ae00: 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69  dd a basis confi
ae10: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
ae20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
ae30: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
ae40: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
ae50: 61 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20  addbasis(struct 
ae60: 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20 64 6f  rule *rp, int do
ae70: 74 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  t).{.  struct co
ae80: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
ae90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73  ;..  assert( bas
aea0: 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73  isend!=0 );.  as
aeb0: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
aec0: 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72  !=0 );.  model.r
aed0: 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e  p = rp;.  model.
aee0: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70  dot = dot;.  cfp
aef0: 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66   = Configtable_f
af00: 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69  ind(&model);.  i
af10: 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20  f( cfp==0 ){.   
af20: 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67   cfp = newconfig
af30: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20  ();.    cfp->rp 
af40: 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64  = rp;.    cfp->d
af50: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66  ot = dot;.    cf
af60: 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28  p->fws = SetNew(
af70: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20  );.    cfp->stp 
af80: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70  = 0;.    cfp->fp
af90: 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d  lp = cfp->bplp =
afa0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78   0;.    cfp->nex
afb0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  t = 0;.    cfp->
afc0: 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72  bp = 0;.    *cur
afd0: 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20  rentend = cfp;. 
afe0: 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20     currentend = 
aff0: 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  &cfp->next;.    
b000: 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b  *basisend = cfp;
b010: 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20  .    basisend = 
b020: 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f  &cfp->bp;.    Co
b030: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
b040: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
b050: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43  urn cfp;.}../* C
b060: 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75  ompute the closu
b070: 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  re of the config
b080: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b090: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
b0a0: 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c  closure(struct l
b0b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
b0c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
b0d0: 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73  fp, *newcfp;.  s
b0e0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20  truct rule *rp, 
b0f0: 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74  *newrp;.  struct
b100: 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73   symbol *sp, *xs
b110: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b  p;.  int i, dot;
b120: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
b130: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66  entend!=0 );.  f
b140: 6f 72 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20  or(cfp=current; 
b150: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
b160: 78 74 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66  xt){.    rp = cf
b170: 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d  p->rp;.    dot =
b180: 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69   cfp->dot;.    i
b190: 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73  f( dot>=rp->nrhs
b1a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b1b0: 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f   sp = rp->rhs[do
b1c0: 74 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  t];.    if( sp->
b1d0: 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
b1e0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
b1f0: 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70  p->rule==0 && sp
b200: 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  !=lemp->errsym )
b210: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
b220: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
b230: 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74  e,rp->line,"Nont
b240: 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68  erminal \"%s\" h
b250: 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20  as no rules.",. 
b260: 20 20 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d           sp->nam
b270: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
b280: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
b290: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
b2a0: 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  newrp=sp->rule; 
b2b0: 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77  newrp; newrp=new
b2c0: 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20  rp->nextlhs){.  
b2d0: 20 20 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43        newcfp = C
b2e0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65  onfiglist_add(ne
b2f0: 77 72 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  wrp,0);.        
b300: 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72  for(i=dot+1; i<r
b310: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
b320: 20 20 20 20 20 20 20 20 20 78 73 70 20 3d 20 72           xsp = r
b330: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
b340: 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79       if( xsp->ty
b350: 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
b360: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 41              SetA
b370: 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78  dd(newcfp->fws,x
b380: 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  sp->index);.    
b390: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b3a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
b3b0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  f( xsp->type==MU
b3c0: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
b3d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
b3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
b3f0: 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73  r(k=0; k<xsp->ns
b400: 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ubsym; k++){.   
b410: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64             SetAd
b420: 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78  d(newcfp->fws, x
b430: 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69  sp->subsym[k]->i
b440: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
b450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b480: 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65       SetUnion(ne
b490: 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66  wcfp->fws,xsp->f
b4a0: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
b4b0: 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c        if( xsp->l
b4c0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
b4d0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
b4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b4f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
b500: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e  =rp->nrhs ) Plin
b510: 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70  k_add(&cfp->fplp
b520: 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20  ,newcfp);.      
b530: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
b540: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
b550: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
b560: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
b570: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
b580: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28  ){.  current = (
b590: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d  struct config*)m
b5a0: 73 6f 72 74 28 28 63 68 61 72 2a 29 63 75 72 72  sort((char*)curr
b5b0: 65 6e 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75  ent,(char**)&(cu
b5c0: 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 0a 20 20  rrent->next),.  
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75  Configcmp);.  cu
b600: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
b610: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
b620: 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  rt the basis con
b630: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b640: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b650: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a  st_sortbasis(){.
b660: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
b670: 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28  t config*)msort(
b680: 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28  (char*)current,(
b690: 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74  char**)&(current
b6a0: 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20 20 20  ->bp),.         
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d 70         Configcmp
b6d0: 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  );.  basisend = 
b6e0: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
b6f0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
b700: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
b710: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
b720: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
b730: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
b740: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
b750: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
b760: 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20  urn(){.  struct 
b770: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
b780: 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20  ld = current;.  
b790: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
b7a0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
b7b0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
b7c0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
b7d0: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
b7e0: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
b7f0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
b800: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
b810: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
b820: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73   *Configlist_bas
b830: 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  is(){.  struct c
b840: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c  onfig *old;.  ol
b850: 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73  d = basis;.  bas
b860: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
b870: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
b880: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65   old;.}../* Free
b890: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
b8a0: 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69   the given confi
b8b0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
b8c0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
b8d0: 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66  _eat(struct conf
b8e0: 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
b8f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
b900: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
b910: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
b920: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
b930: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
b940: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
b950: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b960: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
b970: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
b980: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
b990: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
b9a0: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
b9b0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
b9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b9d0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
b9e0: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
b9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
ba10: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
ba20: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
ba30: 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 45 72 72 6f  e..*/..void Erro
ba40: 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  rMsg(const char 
ba50: 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6c  *filename, int l
ba60: 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
ba70: 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b  r *format, ...){
ba80: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
ba90: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
baa0: 20 22 25 73 3a 25 64 3a 20 22 2c 20 66 69 6c 65   "%s:%d: ", file
bab0: 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  name, lineno);. 
bac0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 66 6f   va_start(ap, fo
bad0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
bae0: 66 28 73 74 64 65 72 72 2c 66 6f 72 6d 61 74 2c  f(stderr,format,
baf0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
bb00: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
bb10: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a  err, "\n");.}./*
bb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
bb30: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
bb40: 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ain.c" *********
bb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
bb70: 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20  ** Main program 
bb80: 66 69 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  file for the LEM
bb90: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
bba0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f  tor..*/../* Repo
bbb0: 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  rt an out-of-mem
bbc0: 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e  ory condition an
bbd0: 64 20 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66  d abort.  This f
bbe0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  unction.** is us
bbf0: 65 64 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65  ed mostly by the
bc00: 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d   "MemoryCheck" m
bc10: 61 63 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68  acro in struct.h
bc20: 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  .*/.void memory_
bc30: 65 72 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e  error(){.  fprin
bc40: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
bc50: 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74  f memory.  Abort
bc60: 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78  ing...\n");.  ex
bc70: 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  it(1);.}..static
bc80: 20 69 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30   int nDefine = 0
bc90: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
bca0: 20 6f 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f   of -D options o
bcb0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
bcc0: 6e 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ne */.static cha
bcd0: 72 20 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30  r **azDefine = 0
bce0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
bcf0: 65 20 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a  e -D macros */..
bd00: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
bd10: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  is called with t
bd20: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65  he argument to e
bd30: 61 63 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c  ach -D command-l
bd40: 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41  ine option..** A
bd50: 64 64 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66  dd the macro def
bd60: 69 6e 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65  ined to the azDe
bd70: 66 69 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  fine array..*/.s
bd80: 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c  tatic void handl
bd90: 65 5f 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20  e_D_option(char 
bda0: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61  *z){.  char **pa
bdb0: 7a 3b 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a  z;.  nDefine++;.
bdc0: 20 20 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68    azDefine = (ch
bdd0: 61 72 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61  ar **) realloc(a
bde0: 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28  zDefine, sizeof(
bdf0: 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65  azDefine[0])*nDe
be00: 66 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44  fine);.  if( azD
be10: 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  efine==0 ){.    
be20: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
be30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
be40: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
be50: 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44    }.  paz = &azD
be60: 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
be70: 3b 0a 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72  ;.  *paz = (char
be80: 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f   *) malloc( lemo
be90: 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a  nStrlen(z)+1 );.
bea0: 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b    if( *paz==0 ){
beb0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
bec0: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
bed0: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
bee0: 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e  (1);.  }.  lemon
bef0: 5f 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29  _strcpy(*paz, z)
bf00: 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20  ;.  for(z=*paz; 
bf10: 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a  *z && *z!='='; z
bf20: 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a  ++){}.  *z = 0;.
bf30: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
bf40: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
bf50: 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63  e = NULL;.static
bf60: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f   void handle_T_o
bf70: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
bf80: 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e    user_templaten
bf90: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  ame = (char *) m
bfa0: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
bfb0: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
bfc0: 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
bfd0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  me==0 ){.    mem
bfe0: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d  ory_error();.  }
bff0: 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
c000: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
c010: 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72  e, z);.}../* for
c020: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
c030: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
c040: 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a  har *minimum_siz
c050: 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20  e_type(int lwr, 
c060: 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e  int upr, int *pn
c070: 42 79 74 65 29 3b 0a 0a 2f 2a 20 50 72 69 6e 74  Byte);../* Print
c080: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
c090: 66 20 74 68 65 20 22 50 61 72 73 65 72 20 53 74  f the "Parser St
c0a0: 61 74 73 22 20 6f 75 74 70 75 74 0a 2a 2f 0a 73  ats" output.*/.s
c0b0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 73  tatic void stats
c0c0: 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61 72  _line(const char
c0d0: 20 2a 7a 4c 61 62 65 6c 2c 20 69 6e 74 20 69 56   *zLabel, int iV
c0e0: 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 61  alue){.  int nLa
c0f0: 62 65 6c 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  bel = lemonStrle
c100: 6e 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 70 72 69  n(zLabel);.  pri
c110: 6e 74 66 28 22 20 20 25 73 25 2e 2a 73 20 25 35  ntf("  %s%.*s %5
c120: 64 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 0a 20 20  d\n", zLabel,.  
c130: 20 20 20 20 20 20 20 33 35 2d 6e 4c 61 62 65 6c         35-nLabel
c140: 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  , ".............
c150: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c160: 2e 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 69  ...",.         i
c170: 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  Value);.}../* Th
c180: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  e main program. 
c190: 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61   Parse the comma
c1a0: 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69  nd line and do i
c1b0: 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e  t... */.int main
c1c0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
c1d0: 2a 2a 61 72 67 76 29 0a 7b 0a 20 20 73 74 61 74  **argv).{.  stat
c1e0: 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d  ic int version =
c1f0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
c200: 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73   rpflag = 0;.  s
c210: 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66  tatic int basisf
c220: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
c230: 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d  c int compress =
c240: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
c250: 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74   quiet = 0;.  st
c260: 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74  atic int statist
c270: 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ics = 0;.  stati
c280: 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30  c int mhflag = 0
c290: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.  static int n
c2a0: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 30  olinenosflag = 0
c2b0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.  static int n
c2c0: 6f 52 65 73 6f 72 74 20 3d 20 30 3b 0a 20 20 73  oResort = 0;.  s
c2d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
c2e0: 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d  ptions options[]
c2f0: 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c   = {.    {OPT_FL
c300: 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29  AG, "b", (char*)
c310: 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69  &basisflag, "Pri
c320: 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69  nt only the basi
c330: 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a  s in report."},.
c340: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
c350: 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70  c", (char*)&comp
c360: 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d  ress, "Don't com
c370: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
c380: 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b   table."},.    {
c390: 4f 50 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28  OPT_FSTR, "D", (
c3a0: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f  char*)handle_D_o
c3b0: 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61  ption, "Define a
c3c0: 6e 20 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22  n %ifdef macro."
c3d0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
c3e0: 2c 20 22 66 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "f", 0, "Ignor
c3f0: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
c400: 72 20 66 6f 72 20 2d 66 20 63 6f 6d 70 69 6c 65  r for -f compile
c410: 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20  r options.)"},. 
c420: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 67     {OPT_FLAG, "g
c430: 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66 6c 61  ", (char*)&rpfla
c440: 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d 6d 61  g, "Print gramma
c450: 72 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  r without action
c460: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
c470: 53 54 52 2c 20 22 49 22 2c 20 30 2c 20 22 49 67  STR, "I", 0, "Ig
c480: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
c490: 6c 64 65 72 20 66 6f 72 20 27 2d 49 27 20 63 6f  lder for '-I' co
c4a0: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
c4b0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
c4c0: 47 2c 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26  G, "m", (char*)&
c4d0: 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20  mhflag, "Output 
c4e0: 61 20 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f  a makeheaders co
c4f0: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 2e 22 7d  mpatible file."}
c500: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
c510: 20 22 6c 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f   "l", (char*)&no
c520: 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20 22 44 6f  linenosflag, "Do
c530: 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c 69 6e 65   not print #line
c540: 20 73 74 61 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a   statements."},.
c550: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
c560: 4f 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e  O", 0, "Ignored.
c570: 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66    (Placeholder f
c580: 6f 72 20 27 2d 4f 27 20 63 6f 6d 70 69 6c 65 72  or '-O' compiler
c590: 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20   options.)"},.  
c5a0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 70 22    {OPT_FLAG, "p"
c5b0: 2c 20 28 63 68 61 72 2a 29 26 73 68 6f 77 50 72  , (char*)&showPr
c5c0: 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
c5d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c5e0: 20 20 20 20 20 20 22 53 68 6f 77 20 63 6f 6e 66        "Show conf
c5f0: 6c 69 63 74 73 20 72 65 73 6f 6c 76 65 64 20 62  licts resolved b
c600: 79 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  y precedence rul
c610: 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  es"},.    {OPT_F
c620: 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a  LAG, "q", (char*
c630: 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65 74  )&quiet, "(Quiet
c640: 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68  ) Don't print th
c650: 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d  e report file."}
c660: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
c670: 20 22 72 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f   "r", (char*)&no
c680: 52 65 73 6f 72 74 2c 20 22 44 6f 20 6e 6f 74 20  Resort, "Do not 
c690: 73 6f 72 74 20 6f 72 20 72 65 6e 75 6d 62 65 72  sort or renumber
c6a0: 20 73 74 61 74 65 73 22 7d 2c 0a 20 20 20 20 7b   states"},.    {
c6b0: 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28  OPT_FLAG, "s", (
c6c0: 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63  char*)&statistic
c6d0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72        "Print par
c700: 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61  ser stats to sta
c710: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c  ndard output."},
c720: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
c730: 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72  "x", (char*)&ver
c740: 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65  sion, "Print the
c750: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e   version number.
c760: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
c770: 52 2c 20 22 54 22 2c 20 28 63 68 61 72 2a 29 68  R, "T", (char*)h
c780: 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20  andle_T_option, 
c790: 22 53 70 65 63 69 66 79 20 61 20 74 65 6d 70 6c  "Specify a templ
c7a0: 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20  ate file."},.   
c7b0: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 57 22 2c   {OPT_FSTR, "W",
c7c0: 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28   0, "Ignored.  (
c7d0: 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  Placeholder for 
c7e0: 27 2d 57 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70  '-W' compiler op
c7f0: 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b  tions.)"},.    {
c800: 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a  OPT_FLAG,0,0,0}.
c810: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
c820: 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a 20 20  int exitcode;.  
c830: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d  struct lemon lem
c840: 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67  ;..  OptInit(arg
c850: 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72  v,options,stderr
c860: 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e  );.  if( version
c870: 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28   ){.     printf(
c880: 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31  "Lemon version 1
c890: 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69  .0\n");.     exi
c8a0: 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28  t(0); .  }.  if(
c8b0: 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29   OptNArgs()!=1 )
c8c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
c8d0: 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e  derr,"Exactly on
c8e0: 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  e filename argum
c8f0: 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  ent is required.
c900: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
c910: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
c920: 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &lem, 0, sizeof(
c930: 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72  lem));.  lem.err
c940: 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  orcnt = 0;..  /*
c950: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c960: 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72  machine */.  Str
c970: 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53  safe_init();.  S
c980: 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20  ymbol_init();.  
c990: 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20  State_init();.  
c9a0: 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76  lem.argv0 = argv
c9b0: 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e  [0];.  lem.filen
c9c0: 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b  ame = OptArg(0);
c9d0: 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67  .  lem.basisflag
c9e0: 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20   = basisflag;.  
c9f0: 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  lem.nolinenosfla
ca00: 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  g = nolinenosfla
ca10: 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  g;.  Symbol_new(
ca20: 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73  "$");.  lem.errs
ca30: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
ca40: 22 65 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e  "error");.  lem.
ca50: 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d  errsym->useCnt =
ca60: 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20   0;..  /* Parse 
ca70: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
ca80: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
ca90: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
caa0: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
cab0: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
cac0: 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a  lem.nrule==0 ){.
cad0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
cae0: 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61  rr,"Empty gramma
caf0: 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  r.\n");.    exit
cb00: 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  (1);.  }..  /* C
cb10: 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74  ount and index t
cb20: 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  he symbols of th
cb30: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 53  e grammar */.  S
cb40: 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
cb50: 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 6e 73  ult}");.  lem.ns
cb60: 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63  ymbol = Symbol_c
cb70: 6f 75 6e 74 28 29 3b 0a 20 20 6c 65 6d 2e 73 79  ount();.  lem.sy
cb80: 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61  mbols = Symbol_a
cb90: 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28  rrayof();.  for(
cba0: 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73 79 6d 62  i=0; i<lem.nsymb
cbb0: 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d  ol; i++) lem.sym
cbc0: 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d  bols[i]->index =
cbd0: 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e   i;.  qsort(lem.
cbe0: 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d  symbols,lem.nsym
cbf0: 62 6f 6c 2c 73 69 7a 65 6f 66 28 73 74 72 75 63  bol,sizeof(struc
cc00: 74 20 73 79 6d 62 6f 6c 2a 29 2c 20 53 79 6d 62  t symbol*), Symb
cc10: 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69  olcmpp);.  for(i
cc20: 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73 79 6d 62 6f  =0; i<lem.nsymbo
cc30: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
cc40: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
cc50: 69 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d 2e  i;.  while( lem.
cc60: 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d 2d 3e 74 79  symbols[i-1]->ty
cc70: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
cc80: 4c 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 61 73  L ){ i--; }.  as
cc90: 73 65 72 74 28 20 73 74 72 63 6d 70 28 6c 65 6d  sert( strcmp(lem
cca0: 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d 2d 3e 6e  .symbols[i-1]->n
ccb0: 61 6d 65 2c 22 7b 64 65 66 61 75 6c 74 7d 22 29  ame,"{default}")
ccc0: 3d 3d 30 20 29 3b 0a 20 20 6c 65 6d 2e 6e 73 79  ==0 );.  lem.nsy
ccd0: 6d 62 6f 6c 20 3d 20 69 20 2d 20 31 3b 0a 20 20  mbol = i - 1;.  
cce0: 66 6f 72 28 69 3d 31 3b 20 49 53 55 50 50 45 52  for(i=1; ISUPPER
ccf0: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  (lem.symbols[i]-
cd00: 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b  >name[0]); i++);
cd10: 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c  .  lem.nterminal
cd20: 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65   = i;..  /* Gene
cd30: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
cd40: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
cd50: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
cd60: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
cd70: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
cd80: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
cd90: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
cda0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
cdb0: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
cdc0: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
cdd0: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
cde0: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
cdf0: 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  inal+1);..    /*
ce00: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
ce10: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
ce20: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
ce30: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
ce40: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
ce50: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
ce60: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
ce70: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
ce80: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
ce90: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
cea0: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
ceb0: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
cec0: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
ced0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
cee0: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
cef0: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
cf00: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
cf10: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
cf20: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
cf30: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
cf40: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
cf50: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
cf60: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
cf70: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
cf80: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
cf90: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
cfa0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
cfb0: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
cfc0: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
cfd0: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
cfe0: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
cff0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
d000: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
d010: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
d020: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
d030: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
d040: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
d050: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
d060: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
d070: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
d080: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
d090: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
d0a0: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
d0b0: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
d0c0: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
d0d0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
d0e0: 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e   Reorder and ren
d0f0: 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73  umber the states
d100: 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
d110: 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
d120: 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  es.    ** occur 
d130: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
d140: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
d150: 74 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73 20  tion that helps 
d160: 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  make the.    ** 
d170: 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72  generated parser
d180: 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e   tables smaller.
d190: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 52 65   */.    if( noRe
d1a0: 73 6f 72 74 3d 3d 30 20 29 20 52 65 73 6f 72 74  sort==0 ) Resort
d1b0: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  States(&lem);.. 
d1c0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
d1d0: 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70   report of the p
d1e0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e  arser generated.
d1f0: 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74    (the "y.output
d200: 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69  " file) */.    i
d210: 66 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f  f( !quiet ) Repo
d220: 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a  rtOutput(&lem);.
d230: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
d240: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
d250: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
d260: 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62  */.    ReportTab
d270: 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29  le(&lem, mhflag)
d280: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63  ;..    /* Produc
d290: 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
d2a0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73  for use by the s
d2b0: 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73  canner.  (This s
d2c0: 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d  tep is.    ** om
d2d0: 69 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d  itted if the "-m
d2e0: 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  " option is used
d2f0: 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61   because makehea
d300: 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ders will.    **
d310: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69   generate the fi
d320: 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20  le for us.) */. 
d330: 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29     if( !mhflag )
d340: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c   ReportHeader(&l
d350: 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  em);.  }.  if( s
d360: 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20  tatistics ){.   
d370: 20 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20   printf("Parser 
d380: 73 74 61 74 69 73 74 69 63 73 3a 5c 6e 22 29 3b  statistics:\n");
d390: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
d3a0: 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  "terminal symbol
d3b0: 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  s", lem.ntermina
d3c0: 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  l);.    stats_li
d3d0: 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ne("non-terminal
d3e0: 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e   symbols", lem.n
d3f0: 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65  symbol - lem.nte
d400: 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61  rminal);.    sta
d410: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 73  ts_line("total s
d420: 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79  ymbols", lem.nsy
d430: 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  mbol);.    stats
d440: 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22 2c 20 6c  _line("rules", l
d450: 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 73  em.nrule);.    s
d460: 74 61 74 73 5f 6c 69 6e 65 28 22 73 74 61 74 65  tats_line("state
d470: 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61 74 65 29  s", lem.nxstate)
d480: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
d490: 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c 20 6c 65  ("conflicts", le
d4a0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
d4b0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 61 63    stats_line("ac
d4c0: 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e 74 72 69  tion table entri
d4d0: 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74 69 6f 6e  es", lem.naction
d4e0: 74 61 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  tab);.    stats_
d4f0: 6c 69 6e 65 28 22 74 6f 74 61 6c 20 74 61 62 6c  line("total tabl
d500: 65 20 73 69 7a 65 20 28 62 79 74 65 73 29 22 2c  e size (bytes)",
d510: 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 29 3b   lem.tablesize);
d520: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
d530: 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a  conflict > 0 ){.
d540: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d550: 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63  rr,"%d parsing c
d560: 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d  onflicts.\n",lem
d570: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
d580: 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20  ..  /* return 0 
d590: 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e  on success, 1 on
d5a0: 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65   failure. */.  e
d5b0: 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e  xitcode = ((lem.
d5c0: 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c  errorcnt > 0) ||
d5d0: 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20   (lem.nconflict 
d5e0: 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20  > 0)) ? 1 : 0;. 
d5f0: 20 65 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b   exit(exitcode);
d600: 0a 20 20 72 65 74 75 72 6e 20 28 65 78 69 74 63  .  return (exitc
d610: 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ode);.}./*******
d620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
d630: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f  om the file "mso
d640: 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
d650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d660: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67  *****/./*.** A g
d670: 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72  eneric merge-sor
d680: 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  t program..**.**
d690: 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22   USAGE:.** Let "
d6a0: 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65  ptr" be a pointe
d6b0: 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74  r to some struct
d6c0: 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20  ure which is at 
d6d0: 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61  the head of.** a
d6e0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
d6f0: 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20   list.  Then to 
d700: 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61  sort the list ca
d710: 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74  ll:.**.**     pt
d720: 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28  r = msort(ptr,&(
d730: 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e  ptr->next),cmpfn
d740: 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  c);.**.** In the
d750: 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22   above, "cmpfnc"
d760: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
d770: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63   a function whic
d780: 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77  h compares.** tw
d790: 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  o instances of t
d7a0: 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  he structure and
d7b0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65   returns an inte
d7c0: 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74  ger, as in.** st
d7d0: 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e  rcmp.  The secon
d7e0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
d7f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
d800: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
d810: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
d820: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
d830: 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73  st.  This addres
d840: 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  s is used to com
d850: 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73  pute.** the offs
d860: 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22  et to the "next"
d870: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
d880: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
d890: 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74  e offset to.** t
d8a0: 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20  he "next" field 
d8b0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
d8c0: 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75   for all structu
d8d0: 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  res in the list.
d8e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  .**.** The funct
d8f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65  ion returns a ne
d900: 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  w pointer which 
d910: 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  is the head of t
d920: 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72  he list.** after
d930: 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   sorting..**.** 
d940: 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65  ALGORITHM:.** Me
d950: 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a  rge-sort..*/../*
d960: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
d970: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  nter to the next
d980: 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68   structure in th
d990: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  e linked list..*
d9a0: 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41  /.#define NEXT(A
d9b0: 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63  ) (*(char**)(((c
d9c0: 68 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29  har*)A)+offset))
d9d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
d9e0: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
d9f0: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
da00: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
da10: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
da20: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
da30: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
da40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
da50: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
da60: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
da70: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
da80: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
da90: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
daa0: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
dab0: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
dac0: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
dad0: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
dae0: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
daf0: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
db00: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
db10: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
db20: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
db30: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
db40: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
db50: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
db60: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
db70: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
db80: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
db90: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
dba0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
dbb0: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20  c char *merge(. 
dbc0: 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72   char *a,.  char
dbd0: 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70   *b,.  int (*cmp
dbe0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
dbf0: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e  nst char*),.  in
dc00: 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68  t offset.){.  ch
dc10: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
dc20: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
dc30: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
dc40: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
dc50: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
dc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
dc70: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29  (*cmp)(a,b)<=0 )
dc80: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b  {.      ptr = a;
dc90: 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28  .      a = NEXT(
dca0: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
dcb0: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
dcc0: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
dcd0: 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20  .    }.    head 
dce0: 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65  = ptr;.    while
dcf0: 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20  ( a && b ){.    
dd00: 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62    if( (*cmp)(a,b
dd10: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
dd20: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
dd30: 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a         ptr = a;.
dd40: 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54          a = NEXT
dd50: 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (a);.      }else
dd60: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
dd70: 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  tr) = b;.       
dd80: 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20   ptr = b;.      
dd90: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
dda0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ddb0: 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70 74   if( a ) NEXT(pt
ddc0: 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65  r) = a;.    else
ddd0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
dde0: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
ddf0: 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  head;.}../*.** I
de00: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74  nputs:.**   list
de10: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
de20: 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65  o a singly-linke
de30: 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74  d list of struct
de40: 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a  ures..**   next:
de50: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
de60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
de70: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
de80: 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20  f the list..**  
de90: 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f   cmp:       A co
dea0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
deb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
dec0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
ded0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
dee0: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
def0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
df00: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
df10: 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73  orginally in lis
df20: 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  t..**.** Side ef
df30: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
df40: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
df50: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
df60: 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65 64  list are changed
df70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53  ..*/.#define LIS
df80: 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20  TSIZE 30.static 
df90: 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63  char *msort(.  c
dfa0: 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61  har *list,.  cha
dfb0: 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20  r **next,.  int 
dfc0: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
dfd0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  r*,const char*).
dfe0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ){.  unsigned lo
dff0: 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61  ng offset;.  cha
e000: 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73  r *ep;.  char *s
e010: 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20  et[LISTSIZE];.  
e020: 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20  int i;.  offset 
e030: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
e040: 29 28 28 63 68 61 72 2a 29 6e 65 78 74 20 2d 20  )((char*)next - 
e050: 28 63 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20 20  (char*)list);.  
e060: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
e070: 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d  IZE; i++) set[i]
e080: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
e090: 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20  ist ){.    ep = 
e0a0: 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d  list;.    list =
e0b0: 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20   NEXT(list);.   
e0c0: 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20   NEXT(ep) = 0;. 
e0d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49     for(i=0; i<LI
e0e0: 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b  STSIZE-1 && set[
e0f0: 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i]!=0; i++){.   
e100: 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70     ep = merge(ep
e110: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
e120: 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69  et);.      set[i
e130: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
e140: 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20   set[i] = ep;.  
e150: 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f  }.  ep = 0;.  fo
e160: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
e170: 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b  E; i++) if( set[
e180: 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28  i] ) ep = merge(
e190: 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66  set[i],ep,cmp,of
e1a0: 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  fset);.  return 
e1b0: 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ep;.}./*********
e1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
e1d0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
e1e0: 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ption.c" *******
e1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e200: 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ***/.static char
e210: 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20   **argv;.static 
e220: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
e230: 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c   *op;.static FIL
e240: 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23  E *errstream;..#
e250: 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20  define ISOPT(X) 
e260: 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58  ((X)[0]=='-'||(X
e270: 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68  )[0]=='+'||strch
e280: 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a  r((X),'=')!=0)..
e290: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
e2a0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74  command line wit
e2b0: 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74  h a carrot point
e2c0: 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20  ing to the k-th 
e2d0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
e2e0: 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a  the n-th field..
e2f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
e300: 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e  rrline(int n, in
e310: 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t k, FILE *err).
e320: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
e330: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
e340: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
e350: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
e360: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
e370: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
e380: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
e390: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
e3a0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
e3b0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
e3c0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
e3d0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
e3e0: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
e3f0: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
e400: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
e410: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
e420: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
e430: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
e440: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
e450: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
e460: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
e470: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
e480: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
e490: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
e4a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
e4b0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
e4c0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
e4d0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
e4e0: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
e4f0: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
e500: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
e510: 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20  nt argindex(int 
e520: 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
e530: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
e540: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
e550: 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20  && *argv!=0 ){. 
e560: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
e570: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
e580: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
e590: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
e5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e5b0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  n==0 ) return i;
e5c0: 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
e5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e5e0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
e5f0: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
e600: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
e610: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
e620: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d  ..static char em
e630: 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20  sg[] = "Command 
e640: 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f  line syntax erro
e650: 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  r: ";../*.** Pro
e660: 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d  cess a flag comm
e670: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
e680: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e690: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74   handleflags(int
e6a0: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
e6b0: 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20  .  int v;.  int 
e6c0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  errcnt = 0;.  in
e6d0: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  t j;.  for(j=0; 
e6e0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
e6f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
e700: 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f  mp(&argv[i][1],o
e710: 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e  p[j].label,lemon
e720: 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62  Strlen(op[j].lab
e730: 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  el))==0 ) break;
e740: 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b  .  }.  v = argv[
e750: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a  i][0]=='-' ? 1 :
e760: 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e   0;.  if( op[j].
e770: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
e780: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e790: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
e7a0: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
e7b0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
e7c0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
e7d0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
e7e0: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20  rcnt++;.  }else 
e7f0: 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30  if( op[j].arg==0
e800: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72   ){.    /* Ignor
e810: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f  e this option */
e820: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
e830: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41  j].type==OPT_FLA
e840: 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a  G ){.    *((int*
e850: 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b  )op[j].arg) = v;
e860: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b  .  }else if( op[
e870: 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c  j].type==OPT_FFL
e880: 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69  AG ){.    (*(voi
e890: 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d  d(*)(int))(op[j]
e8a0: 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c  .arg))(v);.  }el
e8b0: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70  se if( op[j].typ
e8c0: 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20  e==OPT_FSTR ){. 
e8d0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68     (*(void(*)(ch
e8e0: 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  ar *))(op[j].arg
e8f0: 29 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b  ))(&argv[i][2]);
e900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
e910: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
e920: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69  printf(err,"%smi
e930: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
e940: 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73  n switch.\n",ems
e950: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
e960: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
e970: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
e980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
e990: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  cnt;.}../*.** Pr
e9a0: 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20  ocess a command 
e9b0: 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63  line switch whic
e9c0: 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  h has an argumen
e9d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e9e0: 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e   handleswitch(in
e9f0: 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t i, FILE *err).
ea00: 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a  {.  int lv = 0;.
ea10: 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e    double dv = 0.
ea20: 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20  0;.  char *sv = 
ea30: 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20  0, *end;.  char 
ea40: 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  *cp;.  int j;.  
ea50: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
ea60: 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72    cp = strchr(ar
ea70: 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73  gv[i],'=');.  as
ea80: 73 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20  sert( cp!=0 );. 
ea90: 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28   *cp = 0;.  for(
eaa0: 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  j=0; op[j].label
eab0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
eac0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f  strcmp(argv[i],o
ead0: 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29  p[j].label)==0 )
eae0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63   break;.  }.  *c
eaf0: 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f  p = '=';.  if( o
eb00: 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b  p[j].label==0 ){
eb10: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
eb20: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
eb30: 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f  r,"%sundefined o
eb40: 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ption.\n",emsg);
eb50: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
eb60: 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,0,err);.    }. 
eb70: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
eb80: 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a  else{.    cp++;.
eb90: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
eba0: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
ebb0: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
ebc0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
ebd0: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28  LAG:.        if(
ebe0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
ebf0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
ec00: 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  soption requires
ec10: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22   an argument.\n"
ec20: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
ec30: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
ec40: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
ec50: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
ec60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ec70: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
ec80: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
ec90: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
eca0: 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26  dv = strtod(cp,&
ecb0: 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  end);.        if
ecc0: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
ecd0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
ece0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
ecf0: 74 66 28 65 72 72 2c 0a 20 20 20 20 20 20 20 20  tf(err,.        
ed00: 20 20 20 20 20 20 20 22 25 73 69 6c 6c 65 67 61         "%sillega
ed10: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66  l character in f
ed20: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72  loating-point ar
ed30: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
ed40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ;.            er
ed50: 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63  rline(i,(int)((c
ed60: 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29  har*)end-(char*)
ed70: 61 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20  argv[i]),err);. 
ed80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ed90: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
eda0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
edb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
edc0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
edd0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
ede0: 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74  .        lv = st
edf0: 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b  rtol(cp,&end,0);
ee00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
ee10: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
ee20: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
ee30: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
ee40: 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61  r,"%sillegal cha
ee50: 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65  racter in intege
ee60: 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  r argument.\n",e
ee70: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
ee80: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
ee90: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
eea0: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
eeb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
eec0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
eed0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
eee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eef0: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
ef00: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
ef10: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
ef20: 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
ef30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
ef40: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
ef50: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
ef60: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
ef70: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
ef80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef90: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
efa0: 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
efb0: 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
efc0: 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
efd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
efe0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
eff0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f     (*(void(*)(do
f000: 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble))(op[j].arg
f010: 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20  ))(dv);.        
f020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f030: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
f040: 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d     *(int*)(op[j]
f050: 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20  .arg) = lv;.    
f060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f070: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
f080: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
f090: 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61  *)(int))(op[j].a
f0a0: 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20  rg))((int)lv);. 
f0b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f0c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
f0d0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  :.        *(char
f0e0: 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  **)(op[j].arg) =
f0f0: 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   sv;.        bre
f100: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
f110: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f120: 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72   (*(void(*)(char
f130: 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29   *))(op[j].arg))
f140: 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (sv);.        br
f150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
f160: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
f170: 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63  }..int OptInit(c
f180: 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20  har **a, struct 
f190: 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49  s_options *o, FI
f1a0: 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74  LE *err).{.  int
f1b0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
f1c0: 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20  rgv = a;.  op = 
f1d0: 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d  o;.  errstream =
f1e0: 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76   err;.  if( argv
f1f0: 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20   && *argv && op 
f200: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f210: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
f220: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
f230: 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d  if( argv[i][0]==
f240: 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30  '+' || argv[i][0
f250: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
f260: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
f270: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a  leflags(i,err);.
f280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f290: 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27  strchr(argv[i],'
f2a0: 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  =') ){.        e
f2b0: 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73  rrcnt += handles
f2c0: 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20  witch(i,err);.  
f2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f2e0: 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29    if( errcnt>0 )
f2f0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
f300: 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64  r,"Valid command
f310: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f   line options fo
f320: 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22  r \"%s\" are:\n"
f330: 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69  ,*a);.    OptPri
f340: 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31  nt();.    exit(1
f350: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f360: 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72  0;.}..int OptNAr
f370: 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  gs(){.  int cnt 
f380: 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64  = 0;.  int dashd
f390: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
f3a0: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
f3b0: 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b  && argv[0]!=0 ){
f3c0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
f3d0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
f3e0: 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20     if( dashdash 
f3f0: 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69  || !ISOPT(argv[i
f400: 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  ]) ) cnt++;.    
f410: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
f420: 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20  v[i],"--")==0 ) 
f430: 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20  dashdash = 1;.  
f440: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f450: 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f   cnt;.}..char *O
f460: 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20  ptArg(int n).{. 
f470: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
f480: 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74  gindex(n);.  ret
f490: 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b  urn i>=0 ? argv[
f4a0: 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20  i] : 0;.}..void 
f4b0: 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a  OptErr(int n).{.
f4c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
f4d0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66  rgindex(n);.  if
f4e0: 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65  ( i>=0 ) errline
f4f0: 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b  (i,0,errstream);
f500: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e  .}..void OptPrin
f510: 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t(){.  int i;.  
f520: 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20  int max, len;.  
f530: 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  max = 0;.  for(i
f540: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
f550: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
f560: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b   lemonStrlen(op[
f570: 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20  i].label) + 1;. 
f580: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
f590: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f5a0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f5b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f5c0: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
f5d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f5e0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
f5f0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
f600: 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20      len += 9;   
f610: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
f620: 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a   "<integer>" */.
f630: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f640: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
f650: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
f660: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
f670: 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20  len += 6;       
f680: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72  /* length of "<r
f690: 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  eal>" */.       
f6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f6b0: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
f6c0: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
f6d0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
f6e0: 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  8;       /* leng
f6f0: 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22  th of "<string>"
f700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
f710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f720: 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d   len>max ) max =
f730: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   len;.  }.  for(
f740: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
f750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
f760: 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
f770: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
f780: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
f790: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
f7a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f7b0: 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20  stream,"  -%-*s 
f7c0: 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d   %s\n",max,op[i]
f7d0: 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73  .label,op[i].mes
f7e0: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
f7f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f800: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
f810: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
f820: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
f830: 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c  rrstream,"  -%s<
f840: 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c  integer>%*s  %s\
f850: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
f860: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
f870: 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
f880: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c  op[i].label)-9),
f890: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
f8a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f8b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f8c0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
f8d0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
f8e0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
f8f0: 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72 65 61 6c  ream,"  -%s<real
f900: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
f910: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
f920: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
f930: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
f940: 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69  abel)-6),"",op[i
f950: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f970: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
f980: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
f990: 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  TR:.        fpri
f9a0: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
f9b0: 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25 2a 73 20   -%s<string>%*s 
f9c0: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
f9d0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  el,.          (i
f9e0: 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72  nt)(max-lemonStr
f9f0: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
fa00: 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -8),"",op[i].mes
fa10: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
fa20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
fa30: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
fa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
fa50: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
fa60: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
fa70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
fa80: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c  ./*.** Input fil
fa90: 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65  e parser for the
faa0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
fab0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
fac0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
fad0: 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d 20   parser */.enum 
fae0: 65 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e 49 54  e_state {.  INIT
faf0: 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49 4e  IALIZE,.  WAITIN
fb00: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
fb10: 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  LE,.  WAITING_FO
fb20: 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a  R_DECL_KEYWORD,.
fb30: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
fb40: 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54 49 4e  CL_ARG,.  WAITIN
fb50: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
fb60: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
fb70: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20  NG_FOR_ARROW,.  
fb80: 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41 4c  IN_RHS,.  LHS_AL
fb90: 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c 49  IAS_1,.  LHS_ALI
fba0: 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49 41  AS_2,.  LHS_ALIA
fbb0: 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53  S_3,.  RHS_ALIAS
fbc0: 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f  _1,.  RHS_ALIAS_
fbd0: 32 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f  2,.  PRECEDENCE_
fbe0: 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45 44  MARK_1,.  PRECED
fbf0: 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52  ENCE_MARK_2,.  R
fc00: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
fc10: 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e 43  _ERROR,.  RESYNC
fc20: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
fc30: 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  R,.  WAITING_FOR
fc40: 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
fc50: 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OL,.  WAITING_FO
fc60: 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
fc70: 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  L,.  WAITING_FOR
fc80: 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20  _FALLBACK_ID,.  
fc90: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
fca0: 43 41 52 44 5f 49 44 2c 0a 20 20 57 41 49 54 49  CARD_ID,.  WAITI
fcb0: 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 2c  NG_FOR_CLASS_ID,
fcc0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43  .  WAITING_FOR_C
fcd0: 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d 3b 0a 73 74  LASS_TOKEN.};.st
fce0: 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20  ruct pstate {.  
fcf0: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
fd00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
fd10: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
fd20: 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69  */.  int tokenli
fd30: 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69  neno;      /* Li
fd40: 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  nenumber at whic
fd50: 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20  h current token 
fd60: 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20  starts */.  int 
fd70: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
fd80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
fd90: 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a  rrors so far */.
fda0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61    char *tokensta
fdb0: 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  rt;     /* Text 
fdc0: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  of current token
fdd0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   */.  struct lem
fde0: 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47  on *gp;     /* G
fdf0: 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
fe00: 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73  or */.  enum e_s
fe10: 74 61 74 65 20 73 74 61 74 65 3b 20 20 20 20 20  tate state;     
fe20: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
fe30: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
fe40: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
fe50: 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a   *fallback;   /*
fe60: 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f   The fallback to
fe70: 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
fe80: 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b  symbol *tkclass;
fe90: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61      /* Token cla
fea0: 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73  ss symbol */.  s
feb0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
fec0: 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  s;        /* Lef
fed0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t-hand side of c
fee0: 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20  urrent rule */. 
fef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
ff00: 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41  alias;      /* A
ff10: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
ff20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69   /* Number of ri
ff50: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79  ght-hand side sy
ff60: 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20  mbols seen */.  
ff70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72  struct symbol *r
ff80: 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20  hs[MAXRHS];  /* 
ff90: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
ffa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69   const char *ali
ffb0: 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41  as[MAXRHS]; /* A
ffc0: 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20  liases for each 
ffd0: 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e  RHS symbol (or N
ffe0: 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74  ULL) */.  struct
fff0: 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b   rule *prevrule;
10000 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
10010 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a   rule parsed */.
10020 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
10030 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20  clkeyword;   /* 
10040 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63  Keyword of a dec
10050 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  laration */.  ch
10060 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74  ar **declargslot
10070 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
10080 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
10090 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  n argument shoul
100a0 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e  d be put */.  in
100b0 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  t insertLineMacr
100c0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  o;       /* Add 
100d0 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63  #line before dec
100e0 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20  laration insert 
100f0 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69  */.  int *declli
10100 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20  nenoslot;       
10110 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
10120 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
10130 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65  ne number */.  e
10140 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
10150 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
10160 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
10170 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
10180 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
10190 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
101a0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
101b0 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
101c0 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
101d0 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
101e0 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
101f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10200 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
10210 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
10220 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
10230 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
10240 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
10250 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
10260 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
10270 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
10280 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
10290 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
102a0 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65  en(struct pstate
102b0 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74   *psp).{.  const
102c0 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
102d0 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
102e0 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
102f0 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
10300 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
10310 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
10320 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
10330 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
10340 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10350 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10360 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
10370 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
10380 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
10390 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
103a0 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
103b0 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
103c0 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
103d0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
103e0 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
103f0 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
10400 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
10410 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
10420 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
10430 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
10440 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
10450 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
10460 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
10470 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
10480 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
10490 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
104a0 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
104b0 65 6c 73 65 20 69 66 28 20 49 53 4c 4f 57 45 52  else if( ISLOWER
104c0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
104d0 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
104e0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
104f0 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
10500 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10510 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
10520 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10530 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
10540 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
10550 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
10560 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10570 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
10580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10590 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
105a0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
105b0 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
105c0 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 75 70  no prior rule up
105d0 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
105e0 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
105f0 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
10600 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
10610 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
10620 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10630 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10640 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
10650 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
10660 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10670 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10680 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
10690 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
106a0 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
106b0 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
106c0 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
106d0 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
106e0 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
106f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10700 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
10710 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10720 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
10730 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
10740 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
10750 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
10760 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20 20 20 20  e = &x[1];.     
10770 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
10780 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29   if( x[0]=='[' )
10790 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
107a0 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
107b0 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20  E_MARK_1;.      
107c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
107d0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
107e0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
107f0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10800 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20    "Token \"%s\" 
10810 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72  should be either
10820 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e   \"%%\" or a non
10830 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c  terminal name.",
10840 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20  .          x);. 
10850 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10860 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
10870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10880 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
10890 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69  _MARK_1:.      i
108a0 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
108b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
108c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
108d0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
108e0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
108f0 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20  "The precedence 
10900 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61  symbol must be a
10910 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20   terminal.");.  
10920 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10930 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
10940 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
10950 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
10960 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10970 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10980 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10990 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20        "There is 
109a0 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f  no prior rule to
109b0 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e   assign preceden
109c0 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29  ce \"[%s]\".",x)
109d0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
109e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
109f0 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
10a00 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
10a10 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
10a20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10a30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10a40 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64  nlineno,."Preced
10a50 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69  ence mark on thi
10a60 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
10a70 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
10a80 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
10a90 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
10aa0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10ab0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
10ac0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
10ad0 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d  vrule->precsym =
10ae0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
10af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
10b00 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
10b10 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20  DENCE_MARK_2;.  
10b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10b30 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
10b40 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  ARK_2:.      if(
10b50 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20   x[0]!=']' ){.  
10b60 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10b70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10b80 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10b90 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
10ba0 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65  g \"]\" on prece
10bb0 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20  dence mark.");. 
10bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10bd0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
10be0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10bf0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10c00 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
10c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10c20 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41  se WAITING_FOR_A
10c30 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20  RROW:.      if( 
10c40 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
10c50 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
10c60 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
10c70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
10c80 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  HS;.      }else 
10c90 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b  if( x[0]=='(' ){
10ca0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10cb0 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
10cc0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
10cd0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10ce0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10cf0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10d00 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65  .          "Expe
10d10 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22  cted to see a \"
10d20 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  :\" following th
10d30 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25  e LHS symbol \"%
10d40 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
10d50 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29   psp->lhs->name)
10d60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10d70 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10d80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10d90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10da0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10db0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10dc0 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
10dd0 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 49 53  _1:.      if( IS
10de0 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20  ALPHA(x[0]) ){. 
10df0 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
10e00 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20  lias = x;.      
10e10 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
10e20 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
10e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e40 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10e50 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10e60 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10e70 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
10e80 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
10e90 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25   for the LHS \"%
10ea0 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
10eb0 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61    x,psp->lhs->na
10ec0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10ed0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10ee0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10ef0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10f00 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10f10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10f20 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
10f30 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
10f40 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
10f50 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10f60 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a   = LHS_ALIAS_3;.
10f70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10f80 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10f90 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10fa0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10fb0 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
10fc0 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
10fd0 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
10fe0 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
10ff0 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
11000 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11010 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11020 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11030 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
11040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11050 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
11060 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20  S_ALIAS_3:.     
11070 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
11080 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
11090 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
110a0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
110b0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
110c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
110d0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
110e0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
110f0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11100 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22   "Missing \"->\"
11110 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73   following: \"%s
11120 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20  (%s)\".",.      
11130 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
11140 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ame,psp->lhsalia
11150 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
11160 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11170 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11180 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
11190 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
111a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
111b0 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a      case IN_RHS:
111c0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
111d0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
111e0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
111f0 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73  .        rp = (s
11200 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61 6c  truct rule *)cal
11210 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
11220 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20  ct rule) + .    
11230 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11240 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
11250 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
11260 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
11270 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rhs, 1);.       
11280 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20   if( rp==0 ){.  
11290 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
112a0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
112b0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
112c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
112d0 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f  n't allocate eno
112e0 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ugh memory for t
112f0 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  his rule.");.   
11300 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11310 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11320 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
11330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
11340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
11350 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
11360 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
11370 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
11380 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
11390 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
113a0 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
113b0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
113c0 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ias = (const cha
113d0 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
113e0 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
113f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11400 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
11410 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
11420 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
11430 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
11440 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
11450 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
11460 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i];.          }.
11470 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
11480 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
11490 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
114a0 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
114b0 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
114c0 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
114d0 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
114e0 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
114f0 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
11500 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
11510 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
11520 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
11530 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
11540 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
11550 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
11560 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
11570 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
11580 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
11590 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
115a0 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
115b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
115c0 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
115d0 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
115e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
115f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
11600 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65  sp->lastrule->ne
11610 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  xt = rp;.       
11620 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
11630 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
11650 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
11660 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11670 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11680 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11690 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
116a0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c    }else if( ISAL
116b0 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
116c0 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
116d0 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
116e0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
116f0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11700 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11710 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
11720 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
11730 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65  n RHS of rule be
11740 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
11750 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
11760 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
11770 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11780 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11790 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
117a0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
117b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
117c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
117d0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
117e0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
117f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
11800 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
11810 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
11820 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20 20 20  ->nrhs++;.      
11830 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11840 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  if( (x[0]=='|' |
11850 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
11860 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
11870 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
11880 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
11890 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
118a0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
118b0 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
118c0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
118d0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
118e0 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70  ol *origsp = msp
118f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20  ;.          msp 
11900 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
11910 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a   *) calloc(1,siz
11920 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20  eof(*msp));.    
11930 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70        memset(msp
11940 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70  , 0, sizeof(*msp
11950 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
11960 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  p->type = MULTIT
11970 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
11980 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20     msp->nsubsym 
11990 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 1;.          m
119a0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
119b0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
119c0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
119d0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
119e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
119f0 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
11a00 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
11a10 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
11a20 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
11a30 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
11a40 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
11a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a60 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
11a70 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
11a80 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
11a90 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
11aa0 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
11ab0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11ac0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
11ad0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
11ae0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
11af0 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  sym[msp->nsubsym
11b00 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  -1] = Symbol_new
11b10 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (&x[1]);.       
11b20 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b 31   if( ISLOWER(x[1
11b30 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28 6d 73  ]) || ISLOWER(ms
11b40 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
11b50 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
11b60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11b70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11b80 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11b90 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
11ba0 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64   form a compound
11bb0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f   containing a no
11bc0 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20  n-terminal");.  
11bd0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11be0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11bf0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
11c00 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
11c10 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
11c20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11c30 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
11c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11c50 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11c60 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11c70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11c80 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
11c90 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
11ca0 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
11cb0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
11cc0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11cd0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11ce0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11cf0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
11d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11d10 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
11d20 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
11d30 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30   if( ISALPHA(x[0
11d40 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
11d50 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
11d60 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
11d70 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11d80 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
11d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11da0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11db0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11dc0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11dd0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
11de0 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
11df0 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
11e00 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
11e10 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
11e20 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
11e30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
11e40 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11e50 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11e60 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11e70 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11e90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
11ea0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
11eb0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
11ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11ed0 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
11ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11ef0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11f00 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11f10 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11f20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
11f30 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
11f40 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
11f50 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
11f60 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
11f70 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11f80 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11f90 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11fa0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
11fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11fc0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11fd0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
11fe0 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
11ff0 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20  ( ISALPHA(x[0]) 
12000 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12010 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
12020 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
12030 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
12040 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12050 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a  linenoslot = 0;.
12060 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
12070 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
12080 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12090 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
120a0 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
120b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
120c0 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a  x,"name")==0 ){.
120d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
120e0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
120f0 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20  sp->gp->name);. 
12100 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
12110 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
12120 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12130 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
12140 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
12150 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12160 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12170 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
12180 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12190 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
121a0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
121b0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
121c0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
121d0 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20  ->extracode);.  
121e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
121f0 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
12200 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
12210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12220 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12230 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
12240 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  est;.        }el
12250 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12260 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63  "default_destruc
12270 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
12280 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12290 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
122a0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20  p->vardest;.    
122b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
122c0 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
122d0 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
122e0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
122f0 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
12300 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
12310 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12320 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12340 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12350 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
12360 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12370 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12380 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
12390 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ror);.        }e
123a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
123b0 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29  ,"parse_accept")
123c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
123d0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
123e0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
123f0 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20 20  ccept);.        
12400 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12410 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72  (x,"parse_failur
12420 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
12430 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12440 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12450 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20  ->failure);.    
12460 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12470 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76  rcmp(x,"stack_ov
12480 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20  erflow")==0 ){. 
12490 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
124a0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
124b0 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  p->gp->overflow)
124c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
124d0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78  if( strcmp(x,"ex
124e0 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d  tra_argument")==
124f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12500 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12510 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67  = &(psp->gp->arg
12520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
12530 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12540 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12550 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12560 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d  x,"token_type")=
12570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12580 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12590 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f   = &(psp->gp->to
125a0 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20  kentype);.      
125b0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
125c0 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
125d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
125e0 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c  strcmp(x,"defaul
125f0 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  t_type")==0 ){. 
12600 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12610 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12620 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b  p->gp->vartype);
12630 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12640 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12650 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12660 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12670 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30  "stack_size")==0
12680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12690 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
126a0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63   &(psp->gp->stac
126b0 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  ksize);.        
126c0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
126d0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
126e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
126f0 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79  rcmp(x,"start_sy
12700 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mbol")==0 ){.   
12710 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12720 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12730 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  >gp->start);.   
12740 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
12750 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12770 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66  f( strcmp(x,"lef
12780 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12790 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
127a0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
127b0 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
127c0 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20   = LEFT;.       
127d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
127e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
127f0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
12800 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12810 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74   strcmp(x,"right
12820 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12830 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
12840 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
12850 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
12860 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20  = RIGHT;.       
12870 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12880 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
12890 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
128a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
128b0 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73   strcmp(x,"nonas
128c0 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  soc")==0 ){.    
128d0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
128e0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
128f0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
12900 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20  oc = NONE;.     
12910 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12920 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
12930 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
12940 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12950 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73  f( strcmp(x,"des
12960 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
12970 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12980 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12990 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
129a0 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
129b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
129c0 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"type")==0 ){. 
129d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
129e0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
129f0 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
12a00 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
12a10 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66   if( strcmp(x,"f
12a20 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a  allback")==0 ){.
12a30 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
12a40 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
12a50 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12a60 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12a70 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20  FALLBACK_ID;.   
12a80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12a90 74 72 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72  trcmp(x,"wildcar
12aa0 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
12ab0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12ac0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
12ad0 44 43 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20  DCARD_ID;.      
12ae0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12af0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73  mp(x,"token_clas
12b00 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
12b10 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12b20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
12b30 53 53 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  SS_ID;.        }
12b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12b50 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12b60 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12b70 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12b80 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65       "Unknown de
12b90 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
12ba0 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29  d: \"%%%s\".",x)
12bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12bc0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12bd0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12be0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12bf0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
12c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12c10 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12c20 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12c30 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12c40 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12c50 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74  Illegal declarat
12c60 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
12c70 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
12c80 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12c90 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
12ca0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12cb0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
12cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12cd0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
12ce0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
12cf0 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20  UCTOR_SYMBOL:.  
12d00 20 20 20 20 69 66 28 20 21 49 53 41 4c 50 48 41      if( !ISALPHA
12d10 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12d20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12d30 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12d40 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12d50 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
12d60 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
12d70 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  %%destructor key
12d80 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
12d90 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12da0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12db0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
12dc0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
12dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12de0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
12df0 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
12e00 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
12e10 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12e20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
12e30 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  r;.        psp->
12e40 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
12e50 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f   &sp->destLineno
12e60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
12e70 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12e80 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
12e90 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12ea0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
12eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
12ec0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
12ed0 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
12ee0 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
12ef0 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b 30  if( !ISALPHA(x[0
12f00 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
12f10 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
12f20 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
12f30 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12f40 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
12f50 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 74 79  ssing after %%ty
12f60 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  pe keyword");.  
12f70 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12f80 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12f90 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12fa0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
12fb0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
12fc0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
12fd0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
12fe0 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
12ff0 20 20 20 20 20 20 69 66 28 28 73 70 29 20 26 26        if((sp) &&
13000 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 29   (sp->datatype))
13010 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
13020 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13030 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
13040 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
13050 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70 65 20   "Symbol %%type 
13060 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 64  \"%s\" already d
13070 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20  efined", x);.   
13080 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
13090 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
130a0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
130b0 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
130c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
130d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
130e0 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20 20 20   if (!sp){.     
130f0 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
13100 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
13110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13120 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13130 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70  t = &sp->datatyp
13140 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e;.          psp
13150 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13160 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
13170 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13180 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
13190 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RG;.        }.  
131a0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
131b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
131c0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
131d0 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  CE_SYMBOL:.     
131e0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
131f0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
13200 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13210 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
13220 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13230 20 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29   ISUPPER(x[0]) )
13240 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
13250 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20   symbol *sp;.   
13260 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c       sp = Symbol
13270 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
13280 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
13290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
132a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
132b0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
132c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
132d0 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c     "Symbol \"%s\
132e0 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  " has already be
132f0 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65   given a precede
13300 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  nce.",x);.      
13310 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
13320 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
13330 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
13340 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72  ->prec = psp->pr
13350 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20  eccounter;.     
13360 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d       sp->assoc =
13370 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b   psp->declassoc;
13380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133a0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
133b0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
133c0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
133d0 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67 6e     "Can't assign
133e0 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f   a precedence to
133f0 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
13400 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13410 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
13420 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13430 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
13440 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20  _DECL_ARG:.     
13450 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c   if( x[0]=='{' |
13460 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20  | x[0]=='\"' || 
13470 49 53 41 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b  ISALNUM(x[0]) ){
13480 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13490 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
134a0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
134b0 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20  zBuf, *z;.      
134c0 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e    int nOld, n, n
134d0 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20  Line = 0, nNew, 
134e0 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69  nBack;.        i
134f0 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b  nt addLineMacro;
13500 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c  .        char zL
13510 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20  ine[50];.       
13520 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20   zNew = x;.     
13530 20 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d     if( zNew[0]==
13540 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d  '"' || zNew[0]==
13550 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20  '{' ) zNew++;.  
13560 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d        nNew = lem
13570 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a  onStrlen(zNew);.
13580 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70          if( *psp
13590 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b  ->declargslot ){
135a0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
135b0 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  = *psp->declargs
135c0 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  lot;.        }el
135d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
135e0 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  ld = "";.       
135f0 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20   }.        nOld 
13600 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f  = lemonStrlen(zO
13610 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  ld);.        n =
13620 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32   nOld + nNew + 2
13630 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69  0;.        addLi
13640 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e  neMacro = !psp->
13650 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  gp->nolinenosfla
13660 67 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74  g && psp->insert
13670 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20  LineMacro &&.   
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c       (psp->decll
136a0 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20  inenoslot==0 || 
136b0 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
136c0 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20  lot[0]!=0);.    
136d0 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d      if( addLineM
136e0 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  acro ){.        
136f0 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c    for(z=psp->fil
13700 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20  ename, nBack=0; 
13710 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20  *z; z++){.      
13720 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c        if( *z=='\
13730 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20  \' ) nBack++;.  
13740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13750 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
13760 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20  f(zLine, "#line 
13770 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  %d ", psp->token
13780 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20  lineno);.       
13790 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e     nLine = lemon
137a0 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  Strlen(zLine);. 
137b0 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c           n += nL
137c0 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  ine + lemonStrle
137d0 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  n(psp->filename)
137e0 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20   + nBack;.      
137f0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 73 70    }.        *psp
13800 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13810 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
13820 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  (*psp->declargsl
13830 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  ot, n);.        
13840 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63  zBuf = *psp->dec
13850 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b  largslot + nOld;
13860 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
13870 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
13880 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20         if( nOld 
13890 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e  && zBuf[-1]!='\n
138a0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
138b0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
138c0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
138d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
138e0 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69  zBuf, zLine, nLi
138f0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ne);.          z
13900 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20  Buf += nLine;.  
13910 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
13920 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
13930 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
13940 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  lename; *z; z++)
13950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
13960 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  ( *z=='\\' ){.  
13970 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
13980 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20  uf++) = '\\';.  
13990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
139a0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
139b0 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  ) = *z;.        
139c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
139d0 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
139e0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
139f0 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
13a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13a10 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
13a20 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63  slot && psp->dec
13a30 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d  llinenoslot[0]==
13a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13a50 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
13a60 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b  ot[0] = psp->tok
13a70 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
13a80 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
13a90 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e  py(zBuf, zNew, n
13aa0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  New);.        zB
13ab0 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  uf += nNew;.    
13ac0 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20      *zBuf = 0;. 
13ad0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13ae0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13af0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b10 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
13b20 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
13b30 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13b40 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
13b50 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
13b60 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
13b70 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
13b80 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13b90 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
13ba0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13bb0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
13bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13bd0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13be0 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
13bf0 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
13c00 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
13c10 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13c20 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13c30 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13c40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 49      }else if( !I
13c50 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SUPPER(x[0]) ){.
13c60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13c70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
13c80 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13c90 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
13ca0 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
13cb0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
13cc0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
13cd0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13ce0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
13cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
13d00 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
13d10 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
13d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
13d30 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
13d40 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13d50 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
13d60 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13d70 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
13d80 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
13d90 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13da0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
13db0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
13dc0 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
13dd0 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
13de0 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
13df0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13e00 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13e10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13e20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
13e30 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
13e40 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
13e50 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
13e60 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
13e70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
13e90 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
13ea0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
13eb0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
13ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
13ed0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13ee0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
13ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13f00 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
13f10 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13f20 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13f30 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
13f40 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13f50 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
13f60 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
13f70 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
13f80 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13f90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13fb0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
13fc0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
13fd0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
13fe0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
13ff0 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
14000 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
14010 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
14020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14030 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
14040 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
14050 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
14060 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
14070 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
14080 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
14090 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
140a0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
140b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
140c0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
140d0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
140e0 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
140f0 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
14100 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
14110 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14120 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14130 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
14140 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
14150 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
14160 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
14170 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14180 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14190 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
141a0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
141b0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
141c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
141d0 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
141e0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
141f0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
14200 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
14210 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
14220 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
14230 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
14240 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14250 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
14260 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
14270 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
14280 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
14290 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
142a0 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
142b0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
142c0 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
142d0 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
142e0 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
142f0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14300 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
14310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14320 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
14330 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
14340 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
14350 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
14360 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14370 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14380 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
143a0 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
143b0 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
143c0 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
143d0 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
143e0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
143f0 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
14400 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
14410 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
14420 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
14430 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
14440 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
14450 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
14460 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
14470 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
14480 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
14490 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
144a0 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
144b0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
144c0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
144d0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
144e0 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
144f0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
14500 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14510 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
14520 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
14530 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
14540 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
14550 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
14560 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
14570 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14580 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14590 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
145a0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
145b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
145c0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
145d0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
145e0 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
145f0 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
14600 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
14610 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
14620 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
14630 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
14640 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
14650 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
14660 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
14670 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14680 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14690 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
146a0 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
146b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
146c0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
146d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
146e0 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
146f0 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
14700 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
14710 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
14720 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
14730 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
14740 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
14750 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
14760 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
14770 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
14780 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
14790 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
147a0 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
147b0 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
147c0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
147d0 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
147e0 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
147f0 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
14800 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
14810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14820 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
14830 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
14840 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
14850 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
14860 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
14870 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
14880 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
14890 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
148a0 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
148b0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
148c0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
148d0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
148e0 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
148f0 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
14900 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14910 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
14920 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
14930 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
14940 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
14950 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
14960 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
14970 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
14980 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14990 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
149a0 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
149b0 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
149c0 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
149d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
149e0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
149f0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
14a00 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
14a10 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
14a20 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
14a30 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
14a40 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
14a50 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
14a60 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
14a70 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
14a80 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
14a90 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
14aa0 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
14ab0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
14ac0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
14ad0 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
14ae0 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
14af0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
14b00 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
14b10 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
14b20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
14b30 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
14b40 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
14b50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
14b60 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
14b70 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
14b80 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
14b90 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
14ba0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
14bb0 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
14bc0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14bf0 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
14c00 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
14c10 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
14c20 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
14c30 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
14c40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
14c50 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
14c60 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
14c70 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
14c80 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
14c90 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
14ca0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
14cb0 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
14cc0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
14cd0 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
14ce0 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
14cf0 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
14d00 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
14d10 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
14d20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
14d30 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
14d40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14d50 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
14d60 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
14d70 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
14d80 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
14d90 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
14da0 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
14db0 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
14dc0 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
14dd0 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
14de0 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
14df0 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
14e00 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
14e10 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
14e20 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
14e30 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
14e40 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
14e50 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
14e60 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
14e70 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
14e80 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
14e90 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
14ea0 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
14eb0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
14ec0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
14ed0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
14ee0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
14ef0 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
14f00 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
14f10 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
14f20 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
14f30 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
14f40 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
14f50 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
14f60 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
14f70 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
14f80 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
14f90 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
14fa0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
14fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
14fc0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
14fd0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
14fe0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
14ff0 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
15000 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15010 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
15020 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
15030 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
15040 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
15050 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
15060 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
15070 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
15080 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
15090 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
150a0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
150b0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
150c0 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
150d0 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
150e0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
150f0 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
15100 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15110 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
15120 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
15130 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
15140 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
15150 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
15160 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
15170 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
15180 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
15190 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
151a0 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
151b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
151c0 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
151d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
151e0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
151f0 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
15200 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
15210 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
15220 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
15230 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
15240 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
15250 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
15260 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
15270 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
15280 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
15290 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
152a0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
152b0 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
152c0 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
152d0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
152e0 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
152f0 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
15300 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
15310 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
15320 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20 63   ISSPACE(c) ){ c
15330 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
15340 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
15350 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
15360 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
15370 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
15380 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
15390 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
153a0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
153b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
153c0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
153d0 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
153e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
153f0 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
15400 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
15410 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
15420 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
15430 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
15440 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
15450 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
15460 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
15470 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
15480 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
15490 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
154a0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
154b0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
154c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
154d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
154e0 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
154f0 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
15500 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
15510 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
15520 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
15530 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
15540 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
15550 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
15560 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
15570 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
15580 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155a0 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
155b0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
155c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
155d0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
155e0 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
155f0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
15600 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
15610 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
15620 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
15630 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
15640 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
15650 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
15660 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
15670 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
15680 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
15690 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
156a0 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
156b0 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
156c0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
156d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
156e0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
156f0 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
15700 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
15710 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
15720 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
15730 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
15740 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
15750 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
15760 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
15770 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
15780 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
15790 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
157a0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
157b0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
157c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
157d0 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
157e0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
157f0 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
15800 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
15810 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
15820 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
15830 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
15840 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
15850 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
15860 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
15870 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
15880 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
15890 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
158a0 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
158b0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
158c0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
158d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
158e0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
158f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
15900 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
15910 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15920 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
15930 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
15940 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
15950 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
15960 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
15970 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
15980 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15990 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
159a0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
159b0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
159c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
159d0 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
159e0 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
159f0 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
15a00 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
15a10 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
15a20 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
15a30 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
15a40 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
15a50 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
15a60 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
15a70 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
15a80 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
15a90 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
15aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
15ab0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
15ac0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
15ad0 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
15ae0 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
15af0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
15b10 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
15b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15b40 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
15b50 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
15b60 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
15b70 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
15b80 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
15b90 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
15ba0 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
15bb0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
15bc0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
15bd0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15be0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
15bf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15c00 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
15c10 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
15c20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c 4e   }else if( ISALN
15c30 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  UM(c) ){        
15c40 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
15c50 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15c60 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15c70 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
15c80 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
15c90 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
15ca0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15cb0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
15cc0 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
15cd0 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
15ce0 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
15cf0 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
15d00 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
15d10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
15d20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
15d30 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70 5b  ) && ISALPHA(cp[
15d40 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
15d50 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
15d60 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
15d70 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
15d80 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
15d90 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
15da0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
15dd0 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
15de0 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
15df0 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
15e00 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
15e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
15e20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
15e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
15e50 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
15e60 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
15e70 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
15e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15e90 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
15ea0 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
15eb0 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
15ec0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
15ed0 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
15ee0 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
15ef0 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
15f00 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
15f10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
15f20 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
15f30 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
15f40 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
15f50 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
15f60 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
15f70 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
15f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f90 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
15fa0 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
15fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15fc0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
15fd0 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
15fe0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
15ff0 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
16000 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
16010 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
16020 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
16030 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
16040 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
16050 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
16060 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
16070 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
16080 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a  k *Plink_new(){.
16090 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
160a0 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20  newlink;..  if( 
160b0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
160c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
160d0 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
160e0 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
160f0 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
16100 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20  plink *)calloc( 
16110 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
16120 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20  ct plink) );.   
16130 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
16140 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
16150 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
16160 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
16170 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
16180 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
16190 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
161a0 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
161b0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
161c0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
161d0 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
161e0 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
161f0 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
16200 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
16210 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
16220 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
16230 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20    }.  newlink = 
16240 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a  plink_freelist;.
16250 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
16260 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
16270 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
16280 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a  n newlink;.}../*
16290 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20   Add a plink to 
162a0 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a  a plink list */.
162b0 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
162c0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c  truct plink **pl
162d0 70 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  pp, struct confi
162e0 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75  g *cfp).{.  stru
162f0 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e  ct plink *newlin
16300 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50  k;.  newlink = P
16310 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65  link_new();.  ne
16320 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70  wlink->next = *p
16330 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e  lpp;.  *plpp = n
16340 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
16350 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  k->cfp = cfp;.}.
16360 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
16370 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
16380 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
16390 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
163a0 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
163b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74  struct plink **t
163c0 6f 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  o, struct plink 
163d0 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63  *from).{.  struc
163e0 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b  t plink *nextpl;
163f0 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29  .  while( from )
16400 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66  {.    nextpl = f
16410 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66  rom->next;.    f
16420 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b  rom->next = *to;
16430 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b  .    *to = from;
16440 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74  .    from = next
16450 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  pl;.  }.}../* De
16460 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b  lete every plink
16470 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   on the list */.
16480 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
16490 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
164a0 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  plp).{.  struct 
164b0 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a  plink *nextpl;..
164c0 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a    while( plp ){.
164d0 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70      nextpl = plp
164e0 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d  ->next;.    plp-
164f0 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  >next = plink_fr
16500 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e  eelist;.    plin
16510 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70  k_freelist = plp
16520 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74  ;.    plp = next
16530 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a  pl;.  }.}./*****
16540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16550 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
16560 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a   "report.c" ****
16570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16580 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72  ******/./*.** Pr
16590 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e  ocedures for gen
165a0 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20  erating reports 
165b0 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68  and tables in th
165c0 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
165d0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
165e0 20 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65   Generate a file
165f0 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69  name with the gi
16600 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61  ven suffix.  Spa
16610 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
16620 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f  * name comes fro
16630 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  m malloc() and m
16640 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
16650 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
16660 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56  unction..*/.PRIV
16670 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d  ATE char *file_m
16680 61 6b 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c  akename(struct l
16690 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73  emon *lemp, cons
166a0 74 20 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a  t char *suffix).
166b0 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  {.  char *name;.
166c0 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e    char *cp;..  n
166d0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  ame = (char*)mal
166e0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
166f0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  (lemp->filename)
16700 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73   + lemonStrlen(s
16710 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20  uffix) + 5 );.  
16720 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
16730 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16740 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
16750 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
16760 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
16770 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
16780 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6e 61 6d  lemon_strcpy(nam
16790 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
167a0 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  );.  cp = strrch
167b0 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  r(name,'.');.  i
167c0 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b  f( cp ) *cp = 0;
167d0 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  .  lemon_strcat(
167e0 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20  name,suffix);.  
167f0 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a  return name;.}..
16800 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77  /* Open a file w
16810 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64  ith a name based
16820 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   on the name of 
16830 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a  the input file,.
16840 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64 69  ** but with a di
16850 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66 69  fferent (specifi
16860 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ed) suffix, and 
16870 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
16880 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61  .** to the strea
16890 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  m */.PRIVATE FIL
168a0 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20  E *file_open(.  
168b0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
168c0 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp,.  const char
168d0 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73   *suffix,.  cons
168e0 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a  t char *mode.){.
168f0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
16900 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
16910 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
16920 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
16930 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
16940 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
16950 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
16960 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
16970 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
16980 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
16990 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
169a0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
169b0 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
169c0 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
169d0 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
169e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
169f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
16a00 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
16a10 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e  Duplicate the in
16a20 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74  put file without
16a30 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69   comments and wi
16a40 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a  thout actions .*
16a50 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f  * on rules */.vo
16a60 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
16a70 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
16a80 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
16a90 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
16aa0 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
16ab0 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
16ac0 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
16ad0 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
16ae0 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
16af0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
16b00 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
16b10 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
16b20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
16b30 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
16b40 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
16b50 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
16b60 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
16b70 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
16b80 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
16b90 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
16ba0 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
16bb0 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37  }.  ncolumns = 7
16bc0 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20  6/(maxlen+5);.  
16bd0 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29  if( ncolumns<1 )
16be0 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20   ncolumns = 1;. 
16bf0 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e   skip = (lemp->n
16c00 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e  symbol + ncolumn
16c10 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b  s - 1)/ncolumns;
16c20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b  .  for(i=0; i<sk
16c30 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  ip; i++){.    pr
16c40 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20  intf("//");.    
16c50 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d  for(j=i; j<lemp-
16c60 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69  >nsymbol; j+=ski
16c70 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  p){.      sp = l
16c80 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
16c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16ca0 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20  p->index==j );. 
16cb0 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 33       printf(" %3
16cc0 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c  d %-*.*s",j,maxl
16cd0 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61  en,maxlen,sp->na
16ce0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
16cf0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
16d00 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
16d10 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
16d20 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e  >next){.    prin
16d30 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d  tf("%s",rp->lhs-
16d40 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20  >name);.    /*  
16d50 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
16d60 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
16d70 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
16d80 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
16d90 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
16da0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
16db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
16dc0 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
16dd0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
16de0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
16df0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
16e00 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 73 75  tf(" %s", sp->su
16e10 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[0]->name);.
16e20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b          for(j=1;
16e30 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
16e40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
16e50 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73 70  printf("|%s", sp
16e60 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
16e70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e90 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
16ea0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
16eb0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 28    }.      /* if(
16ec0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
16ed0 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
16ee0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
16ef0 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ); */.    }.    
16f00 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20  printf(".");.   
16f10 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d   if( rp->precsym
16f20 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d   ) printf(" [%s]
16f30 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e  ",rp->precsym->n
16f40 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28  ame);.    /* if(
16f50 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e   rp->code ) prin
16f60 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70  tf("\n    %s",rp
16f70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20  ->code); */.    
16f80 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
16f90 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  }.}../* Print a 
16fa0 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a  single rule..*/.
16fb0 76 6f 69 64 20 52 75 6c 65 50 72 69 6e 74 28 46  void RulePrint(F
16fc0 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20  ILE *fp, struct 
16fd0 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20 69 43  rule *rp, int iC
16fe0 75 72 73 6f 72 29 7b 0a 20 20 73 74 72 75 63 74  ursor){.  struct
16ff0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69   symbol *sp;.  i
17000 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e  nt i, j;.  fprin
17010 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72  tf(fp,"%s ::=",r
17020 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
17030 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d   for(i=0; i<=rp-
17040 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
17050 20 69 66 28 20 69 3d 3d 69 43 75 72 73 6f 72 20   if( i==iCursor 
17060 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a  ) fprintf(fp," *
17070 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72  ");.    if( i==r
17080 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b  p->nrhs ) break;
17090 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
170a0 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
170b0 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
170c0 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66  MINAL ){.      f
170d0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
170e0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
170f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  name);.      for
17100 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
17110 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
17120 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c     fprintf(fp,"|
17130 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a  %s",sp->subsym[j
17140 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
17150 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
17160 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
17170 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
17180 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
17190 50 72 69 6e 74 20 74 68 65 20 72 75 6c 65 20 66  Print the rule f
171a0 6f 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  or a configurati
171b0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  on..*/.void Conf
171c0 69 67 50 72 69 6e 74 28 46 49 4c 45 20 2a 66 70  igPrint(FILE *fp
171d0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
171e0 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65 50 72 69  *cfp){.  RulePri
171f0 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72 70 2c 20  nt(fp, cfp->rp, 
17200 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a  cfp->dot);.}../*
17210 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f   #define TEST */
17220 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20  .#if 0./* Print 
17230 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45  a set */.PRIVATE
17240 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f   void SetPrint(o
17250 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c  ut,set,lemp).FIL
17260 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65  E *out;.char *se
17270 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  t;.struct lemon 
17280 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69  *lemp;.{.  int i
17290 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65 72  ;.  char *spacer
172a0 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b  ;.  spacer = "";
172b0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
172c0 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f  %12s[","");.  fo
172d0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
172e0 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
172f0 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64 28      if( SetFind(
17300 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20  set,i) ){.      
17310 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25  fprintf(out,"%s%
17320 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e  s",spacer,lemp->
17330 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
17340 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72 20  );.      spacer 
17350 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d  = " ";.    }.  }
17360 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17370 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69  ]\n");.}../* Pri
17380 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e  nt a plink chain
17390 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
173a0 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c   PlinkPrint(out,
173b0 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f  plp,tag).FILE *o
173c0 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b  ut;.struct plink
173d0 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67   *plp;.char *tag
173e0 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  ;.{.  while( plp
173f0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
17400 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73 74 61  out,"%12s%s (sta
17410 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67  te %2d) ","",tag
17420 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e  ,plp->cfp->stp->
17430 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43  statenum);.    C
17440 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70  onfigPrint(out,p
17450 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70  lp->cfp);.    fp
17460 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
17470 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e  .    plp = plp->
17480 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  next;.  }.}.#end
17490 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20  if../* Print an 
174a0 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69  action to the gi
174b0 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
174c0 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  tor.  Return FAL
174d0 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67  SE if.** nothing
174e0 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72   was actually pr
174f0 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72  inted..*/.int Pr
17500 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20 73 74 72  intAction(.  str
17510 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
17520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17530 61 63 74 69 6f 6e 20 74 6f 20 70 72 69 6e 74 20  action to print 
17540 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70 2c 20 20  */.  FILE *fp,  
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 61 63   /* Print the ac
17570 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tion here */.  i
17580 6e 74 20 69 6e 64 65 6e 74 20 20 20 20 20 20 20  nt indent       
17590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
175a0 64 65 6e 74 20 62 79 20 74 68 69 73 20 61 6d 6f  dent by this amo
175b0 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  unt */.){.  int 
175c0 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77  result = 1;.  sw
175d0 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
175e0 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
175f0 3a 20 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  : {.      struct
17600 20 73 74 61 74 65 20 2a 73 74 70 20 3d 20 61 70   state *stp = ap
17610 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 66  ->x.stp;.      f
17620 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
17630 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64  hift        %-7d
17640 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
17650 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74 61 74 65  >name,stp->state
17660 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
17670 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17680 65 20 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20  e REDUCE: {.    
17690 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
176a0 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20  p = ap->x.rp;.  
176b0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
176c0 25 2a 73 20 72 65 64 75 63 65 20 20 20 20 20 20  %*s reduce      
176d0 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70   %-7d",indent,ap
176e0 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69  ->sp->name,rp->i
176f0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 52 75 6c  ndex);.      Rul
17700 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d  ePrint(fp, rp, -
17710 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
17720 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17730 53 48 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20  SHIFTREDUCE: {. 
17740 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
17750 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b   *rp = ap->x.rp;
17760 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17770 70 2c 22 25 2a 73 20 73 68 69 66 74 2d 72 65 64  p,"%*s shift-red
17780 75 63 65 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74  uce %-7d",indent
17790 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70  ,ap->sp->name,rp
177a0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
177b0 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70  RulePrint(fp, rp
177c0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
177d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
177e0 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20  se ACCEPT:.     
177f0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17800 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c   accept",indent,
17810 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
17820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17830 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20  case ERROR:.    
17840 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
17850 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c  s error",indent,
17860 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
17870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17880 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a  case SRCONFLICT:
17890 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46  .    case RRCONF
178a0 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
178b0 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
178c0 63 65 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a  ce       %-7d **
178d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   Parsing conflic
178e0 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69  t **",.        i
178f0 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
17900 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
17910 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
17920 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e  ;.    case SSCON
17930 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72  FLICT:.      fpr
17940 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
17950 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2a  ft        %-7d *
17960 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
17970 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20  ct **", .       
17980 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
17990 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
179a0 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
179b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
179c0 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   SH_RESOLVED:.  
179d0 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65 63      if( showPrec
179e0 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29  edenceConflict )
179f0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
17a00 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
17a10 20 20 20 20 20 20 20 25 2d 37 64 20 2d 2d 20 64         %-7d -- d
17a20 72 6f 70 70 65 64 20 62 79 20 70 72 65 63 65 64  ropped by preced
17a30 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20  ence",.         
17a40 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70         indent,ap
17a50 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
17a60 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  .stp->statenum);
17a70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17a80 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
17a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17aa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
17ab0 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20  RD_RESOLVED:.   
17ac0 20 20 20 69 66 28 20 73 68 6f 77 50 72 65 63 65     if( showPrece
17ad0 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b  denceConflict ){
17ae0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
17af0 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
17b00 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65 64 20  %-7d -- dropped 
17b10 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c 0a  by precedence",.
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
17b40 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
17b50 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dex);.      }els
17b60 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  e{.        resul
17b70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
17b80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17b90 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20  case NOT_USED:. 
17ba0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
17bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17bc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
17bd0 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  t;.}../* Generat
17be0 65 20 74 68 65 20 22 2a 2e 6f 75 74 22 20 6c 6f  e the "*.out" lo
17bf0 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52  g file */.void R
17c00 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74 72 75  eportOutput(stru
17c10 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
17c20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
17c30 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
17c40 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
17c50 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *cfp;.  struct a
17c60 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c  ction *ap;.  FIL
17c70 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66  E *fp;..  fp = f
17c80 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
17c90 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20 20 69 66  out","wb");.  if
17ca0 28 20 66 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( fp==0 ) return
17cb0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
17cc0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b  emp->nxstate; i+
17cd0 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
17ce0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
17cf0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53     fprintf(fp,"S
17d00 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d  tate %d:\n",stp-
17d10 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
17d20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
17d30 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62  lag ) cfp=stp->b
17d40 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  p;.    else     
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
17d60 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77  =stp->cfp;.    w
17d70 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20  hile( cfp ){.   
17d80 20 20 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b     char buf[20];
17d90 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
17da0 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot==cfp->rp->nr
17db0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  hs ){.        le
17dc0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
17dd0 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e  "(%d)",cfp->rp->
17de0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
17df0 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20  fprintf(fp,"    
17e00 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20  %5s ",buf);.    
17e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20   fprintf(fp,"   
17e30 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20         ");.     
17e40 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50   }.      ConfigP
17e50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20  rint(fp,cfp);.  
17e60 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17e70 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  \n");.#if 0.    
17e80 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66    SetPrint(fp,cf
17e90 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20  p->fws,lemp);.  
17ea0 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66      PlinkPrint(f
17eb0 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20  p,cfp->fplp,"To 
17ec0 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b   ");.      Plink
17ed0 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70  Print(fp,cfp->bp
17ee0 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64  lp,"From");.#end
17ef0 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d  if.      if( lem
17f00 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
17f10 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=cfp->bp;.    
17f20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
17f30 20 20 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d          cfp=cfp-
17f40 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  >next;.    }.   
17f50 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
17f60 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
17f70 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
17f80 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
17f90 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61  f( PrintAction(a
17fa0 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e  p,fp,30) ) fprin
17fb0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
17fc0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
17fd0 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  p,"\n");.  }.  f
17fe0 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d  printf(fp, "----
17ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18020 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
18030 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22  fp, "Symbols:\n"
18040 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18050 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
18060 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
18070 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
18080 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d  l *sp;..    sp =
18090 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
180a0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
180b0 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20  p, "  %3d: %s", 
180c0 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  i, sp->name);.  
180d0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
180e0 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
180f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18100 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ":");.      if(
18110 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20   sp->lambda ){. 
18120 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
18130 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b  p, " <lambda>");
18140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18150 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
18160 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
18170 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
18180 3e 66 69 72 73 74 73 65 74 20 26 26 20 53 65 74  >firstset && Set
18190 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65  Find(sp->firstse
181a0 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  t, j) ){.       
181b0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
181c0 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62   %s", lemp->symb
181d0 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[j]->name);. 
181e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
181f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
18200 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20  tf(fp, "\n");.  
18210 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
18220 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
18230 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 66  Search for the f
18240 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68  ile "name" which
18250 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
18260 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
18270 74 68 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a  the exacutable *
18280 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a  /.PRIVATE char *
18290 70 61 74 68 73 65 61 72 63 68 28 63 68 61 72 20  pathsearch(char 
182a0 2a 61 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61  *argv0, char *na
182b0 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b  me, int modemask
182c0 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
182d0 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68   *pathlist;.  ch
182e0 61 72 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a  ar *pathbufptr;.
182f0 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b    char *pathbuf;
18300 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
18310 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69  p;.  char c;..#i
18320 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20  fdef __WIN32__. 
18330 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
18340 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65  gv0,'\\');.#else
18350 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
18360 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64  argv0,'/');.#end
18370 69 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  if.  if( cp ){. 
18380 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
18390 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74  *cp = 0;.    pat
183a0 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
183b0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
183c0 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74  argv0) + lemonSt
183d0 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29  rlen(name) + 2 )
183e0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29  ;.    if( path )
183f0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
18400 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76  ath,"%s/%s",argv
18410 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70  0,name);.    *cp
18420 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = c;.  }else{. 
18430 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
18440 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
18450 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
18460 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
18470 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
18480 3b 0a 20 20 20 20 70 61 74 68 62 75 66 20 3d 20  ;.    pathbuf = 
18490 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
184a0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
184b0 68 6c 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20  hlist) + 1 );.  
184c0 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
184d0 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
184e0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c  rlen(pathlist)+l
184f0 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
18500 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  +2 );.    if( (p
18510 61 74 68 62 75 66 20 21 3d 20 30 29 20 26 26 20  athbuf != 0) && 
18520 28 70 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20  (path!=0) ){.   
18530 20 20 20 70 61 74 68 62 75 66 70 74 72 20 3d 20     pathbufptr = 
18540 70 61 74 68 62 75 66 3b 0a 20 20 20 20 20 20 6c  pathbuf;.      l
18550 65 6d 6f 6e 5f 73 74 72 63 70 79 28 70 61 74 68  emon_strcpy(path
18560 62 75 66 2c 20 70 61 74 68 6c 69 73 74 29 3b 0a  buf, pathlist);.
18570 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 61        while( *pa
18580 74 68 62 75 66 20 29 7b 0a 20 20 20 20 20 20 20  thbuf ){.       
18590 20 63 70 20 3d 20 73 74 72 63 68 72 28 70 61 74   cp = strchr(pat
185a0 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20 20 20 20  hbuf,':');.     
185b0 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63     if( cp==0 ) c
185c0 70 20 3d 20 26 70 61 74 68 62 75 66 5b 6c 65 6d  p = &pathbuf[lem
185d0 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 62 75 66  onStrlen(pathbuf
185e0 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20  )];.        c = 
185f0 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a 63 70  *cp;.        *cp
18600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6c 65   = 0;.        le
18610 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68  mon_sprintf(path
18620 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 62 75 66  ,"%s/%s",pathbuf
18630 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
18640 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
18650 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
18660 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  buf[0] = 0;.    
18670 20 20 20 20 65 6c 73 65 20 70 61 74 68 62 75 66      else pathbuf
18680 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
18690 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
186a0 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
186b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
186c0 0a 20 20 20 20 20 20 66 72 65 65 28 70 61 74 68  .      free(path
186d0 62 75 66 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20  bufptr);.    }. 
186e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68   }.  return path
186f0 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e  ;.}../* Given an
18700 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65   action, compute
18710 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
18720 75 65 20 66 6f 72 20 74 68 61 74 20 61 63 74 69  ue for that acti
18730 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74  on.** which is t
18740 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68 65 20  o be put in the 
18750 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
18760 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61  the generated ma
18770 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  chine..** Return
18780 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20   negative if no 
18790 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
187a0 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50   generated..*/.P
187b0 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75  RIVATE int compu
187c0 74 65 5f 61 63 74 69 6f 6e 28 73 74 72 75 63 74  te_action(struct
187d0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
187e0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 29  ruct action *ap)
187f0 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
18800 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
18810 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
18820 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
18830 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20  .stp->statenum; 
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18860 20 20 63 61 73 65 20 53 48 49 46 54 52 45 44 55    case SHIFTREDU
18870 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  CE: act = ap->x.
18880 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70  rp->index + lemp
18890 2d 3e 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  ->nstate;       
188a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
188b0 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61   REDUCE: act = a
188c0 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b  p->x.rp->index +
188d0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65   lemp->nstate+le
188e0 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62 72 65 61 6b  mp->nrule; break
188f0 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52  ;.    case ERROR
18900 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  :  act = lemp->n
18910 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
18920 75 6c 65 2a 32 3b 20 20 20 20 20 20 20 20 20 20  ule*2;          
18930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18940 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74  case ACCEPT: act
18950 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
18960 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 20  + lemp->nrule*2 
18970 2b 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 62  + 1;           b
18980 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
18990 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b  t:     act = -1;
189a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
189b0 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65  turn act;.}..#de
189c0 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30  fine LINESIZE 10
189d0 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63  00./* The next c
189e0 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e  luster of routin
189f0 65 73 20 61 72 65 20 66 6f 72 20 72 65 61 64 69  es are for readi
18a00 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
18a10 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  file.** and writ
18a20 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
18a30 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  to the generated
18a40 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68   parser */./* Th
18a50 65 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e  e first function
18a60 20 74 72 61 6e 73 66 65 72 73 20 64 61 74 61 20   transfers data 
18a70 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75  from "in" to "ou
18a80 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69  t" until.** a li
18a90 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69 63 68  ne is seen which
18aa0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 25 25   begins with "%%
18ab0 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d  ".  The line num
18ac0 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65  ber is.** tracke
18ad0 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65  d..**.** if name
18ae0 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f  !=0, then any wo
18af0 72 64 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rd that begin wi
18b00 74 68 20 22 50 61 72 73 65 22 20 69 73 20 63 68  th "Parse" is ch
18b10 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69  anged to.** begi
18b20 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73  n with *name ins
18b30 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tead..*/.PRIVATE
18b40 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28   void tplt_xfer(
18b50 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45  char *name, FILE
18b60 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c   *in, FILE *out,
18b70 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
18b80 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b    int i, iStart;
18b90 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
18ba0 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28  ESIZE];.  while(
18bb0 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
18bc0 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e  SIZE,in) && (lin
18bd0 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e  e[0]!='%' || lin
18be0 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20  e[1]!='%') ){.  
18bf0 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
18c00 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20     iStart = 0;. 
18c10 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20     if( name ){. 
18c20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69       for(i=0; li
18c30 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne[i]; i++){.   
18c40 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d       if( line[i]
18c50 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d 70  =='P' && strncmp
18c60 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65  (&line[i],"Parse
18c70 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ",5)==0.        
18c80 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21 49    && (i==0 || !I
18c90 53 41 4c 50 48 41 28 6c 69 6e 65 5b 69 2d 31 5d  SALPHA(line[i-1]
18ca0 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
18cb0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69 53          if( i>iS
18cc0 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28 6f  tart ) fprintf(o
18cd0 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61  ut,"%.*s",i-iSta
18ce0 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d  rt,&line[iStart]
18cf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  );.          fpr
18d00 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61  intf(out,"%s",na
18d10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
18d20 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
18d30 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20   iStart = i+1;. 
18d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18d50 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
18d60 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e  tf(out,"%s",&lin
18d70 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a  e[iStart]);.  }.
18d80 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 66  }../* The next f
18d90 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
18da0 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  e template file 
18db0 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72 65  and opens it, re
18dc0 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69  turning.** a poi
18dd0 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65 6e  nter to the open
18de0 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56  ed file. */.PRIV
18df0 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f  ATE FILE *tplt_o
18e00 70 65 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  pen(struct lemon
18e10 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74   *lemp).{.  stat
18e20 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65  ic char template
18e30 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72  name[] = "lempar
18e40 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  .c";.  char buf[
18e50 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69  1000];.  FILE *i
18e60 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e  n;.  char *tpltn
18e70 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
18e80 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65  ..  /* first, se
18e90 65 20 69 66 20 75 73 65 72 20 73 70 65 63 69 66  e if user specif
18ea0 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65 20 66  ied a template f
18eb0 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63  ilename on the c
18ec0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a  ommand line. */.
18ed0 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d 70 6c    if (user_templ
18ee0 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a  atename != 0) {.
18ef0 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 75      if( access(u
18f00 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
18f10 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  ,004)==-1 ){.   
18f20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
18f30 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68  r,"Can't find th
18f40 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20  e parser driver 
18f50 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
18f60 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  %s\".\n",.      
18f70 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e    user_templaten
18f80 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ame);.      lemp
18f90 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
18fa0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18fb0 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
18fc0 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  en(user_template
18fd0 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20 20  name,"rb");.    
18fe0 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
18ff0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
19000 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  r,"Can't open th
19010 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  e template file 
19020 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
19030 20 20 20 20 20 20 20 20 20 20 75 73 65 72 5f 74            user_t
19040 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
19050 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
19060 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  nt++;.      retu
19070 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19080 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a  return in;.  }..
19090 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c    cp = strrchr(l
190a0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e  emp->filename,'.
190b0 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a  ');.  if( cp ){.
190c0 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
190d0 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c  f(buf,"%.*s.lt",
190e0 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66  (int)(cp-lemp->f
190f0 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66  ilename),lemp->f
19100 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
19110 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  e{.    lemon_spr
19120 69 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22  intf(buf,"%s.lt"
19130 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
19140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65  ;.  }.  if( acce
19150 73 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29  ss(buf,004)==0 )
19160 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
19170 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66   buf;.  }else if
19180 28 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74  ( access(templat
19190 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b  ename,004)==0 ){
191a0 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
191b0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20  templatename;.  
191c0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e  }else{.    tpltn
191d0 61 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68  ame = pathsearch
191e0 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d  (lemp->argv0,tem
191f0 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20  platename,0);.  
19200 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65  }.  if( tpltname
19210 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
19220 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
19230 20 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72   find the parser
19240 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65   driver template
19250 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
19260 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61  ,.    templatena
19270 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
19280 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
19290 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
192a0 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61  n = fopen(tpltna
192b0 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
192c0 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  in==0 ){.    fpr
192d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
192e0 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
192f0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
19300 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d  .\n",templatenam
19310 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
19320 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
19330 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
19340 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50  turn in;.}../* P
19350 72 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72  rint a #line dir
19360 65 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74  ective line to t
19370 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  he output file. 
19380 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
19390 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c  tplt_linedir(FIL
193a0 45 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65  E *out, int line
193b0 6e 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  no, char *filena
193c0 6d 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28  me).{.  fprintf(
193d0 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
193e0 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69  ",lineno);.  whi
193f0 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b  le( *filename ){
19400 0a 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61  .    if( *filena
19410 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74  me == '\\' ) put
19420 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20  c('\\',out);.   
19430 20 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c   putc(*filename,
19440 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61  out);.    filena
19450 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  me++;.  }.  fpri
19460 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b  ntf(out,"\"\n");
19470 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  .}../* Print a s
19480 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c  tring to the fil
19490 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c  e and keep the l
194a0 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20  inenumber up to 
194b0 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  date */.PRIVATE 
194c0 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28  void tplt_print(
194d0 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63  FILE *out, struc
194e0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63  t lemon *lemp, c
194f0 68 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c  har *str, int *l
19500 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73  ineno).{.  if( s
19510 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  tr==0 ) return;.
19520 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b    while( *str ){
19530 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f  .    putc(*str,o
19540 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74  ut);.    if( *st
19550 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  r=='\n' ) (*line
19560 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b  no)++;.    str++
19570 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b  ;.  }.  if( str[
19580 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]!='\n' ){.   
19590 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b   putc('\n',out);
195a0 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
195b0 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d  ;.  }.  if (!lem
195c0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
195d0 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f  ) {.    (*lineno
195e0 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
195f0 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
19600 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20  mp->outname); . 
19610 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
19620 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
19630 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74  ing routine emit
19640 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64  s code for the d
19650 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
19660 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a  e.** symbol sp.*
19670 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74  /.void emit_dest
19680 72 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46  ructor_code(.  F
19690 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75  ILE *out,.  stru
196a0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20  ct symbol *sp,. 
196b0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
196c0 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65  emp,.  int *line
196d0 6e 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20  no.){. char *cp 
196e0 3d 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74  = 0;.. if( sp->t
196f0 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
19700 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74  .   cp = lemp->t
19710 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28  okendest;.   if(
19720 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   cp==0 ) return;
19730 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
19740 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
19750 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20  )++;. }else if( 
19760 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29  sp->destructor )
19770 7b 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65  {.   cp = sp->de
19780 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72  structor;.   fpr
19790 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
197a0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
197b0 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if( !lemp->noli
197c0 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20  nenosflag ){.   
197d0 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
197e0 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72      tplt_linedir
197f0 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e  (out,sp->destLin
19800 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  eno,lemp->filena
19810 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 65 6c 73 65  me);.   }. }else
19820 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
19830 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  st ){.   cp = le
19840 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  mp->vardest;.   
19850 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
19860 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
19870 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
19880 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a  eno)++;. }else{.
19890 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
198a0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
198b0 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  n */. }. for(; *
198c0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
198d0 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
198e0 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
198f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
19900 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
19910 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
19920 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
19930 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
19940 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
19950 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70  lineno)++;.   fp
19960 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d  utc(*cp,out);. }
19970 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  . fprintf(out,"\
19980 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
19990 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f  ;. if (!lemp->no
199a0 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a  linenosflag) { .
199b0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20     (*lineno)++; 
199c0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
199d0 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
199e0 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70  utname); . }. fp
199f0 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
19a00 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
19a10 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
19a20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
19a30 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67  n-zero) if the g
19a40 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20  iven symbol has 
19a50 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f  a destructor..*/
19a60 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63  .int has_destruc
19a70 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d 62 6f  tor(struct symbo
19a80 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20 6c 65  l *sp, struct le
19a90 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
19aa0 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70  nt ret;.  if( sp
19ab0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
19ac0 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65   ){.    ret = le
19ad0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30  mp->tokendest!=0
19ae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19af0 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65  et = lemp->varde
19b00 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  st!=0 || sp->des
19b10 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a  tructor!=0;.  }.
19b20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
19b30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
19b40 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  xt to a dynamica
19b50 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74  lly allocated st
19b60 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20  ring.  If zText 
19b70 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73  is 0 then.** res
19b80 65 74 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  et the string to
19b90 20 62 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e   be empty again.
19ba0 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
19bb0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
19bc0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69  t.** of the stri
19bd0 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f 76 65  ng (which is ove
19be0 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 65 61  rwritten with ea
19bf0 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20  ch call)..**.** 
19c00 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74  n bytes of zText
19c10 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66   are stored.  If
19c20 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f   n==0 then all o
19c30 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68  f zText up to th
19c40 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20  e first.** \000 
19c50 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74  terminator is st
19c60 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e  ored.  zText can
19c70 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74   contain up to t
19c80 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a  wo instances of.
19c90 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75  ** %d.  The valu
19ca0 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20  es of p1 and p2 
19cb0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
19cc0 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 73   the first and s
19cd0 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a  econd.** %d..**.
19ce0 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65  ** If n==-1, the
19cf0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
19d00 68 61 72 61 63 74 65 72 20 69 73 20 6f 76 65 72  haracter is over
19d10 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56  written..*/.PRIV
19d20 41 54 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64  ATE char *append
19d30 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20  _str(const char 
19d40 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69  *zText, int n, i
19d50 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
19d60 20 20 73 74 61 74 69 63 20 63 68 61 72 20 65 6d    static char em
19d70 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a  pty[1] = { 0 };.
19d80 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a    static char *z
19d90 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
19da0 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a  nt alloced = 0;.
19db0 20 20 73 74 61 74 69 63 20 69 6e 74 20 75 73 65    static int use
19dc0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a  d = 0;.  int c;.
19dd0 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b    char zInt[40];
19de0 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
19df0 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  ){.    used = 0;
19e00 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
19e10 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
19e20 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
19e30 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
19e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
19e50 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
19e60 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
19e70 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
19e80 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
19e90 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
19ea0 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
19eb0 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
19ec0 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
19ed0 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
19ee0 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
19ef0 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
19f00 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
19f10 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
19f20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
19f30 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
19f40 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
19f50 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
19f60 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
19f70 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c  =='d' ){.      l
19f80 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e  emon_sprintf(zIn
19f90 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
19fa0 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
19fb0 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
19fc0 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
19fd0 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
19fe0 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
19ff0 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
1a000 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
1a010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a020 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68   z[used++] = (ch
1a030 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ar)c;.    }.  }.
1a040 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
1a050 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1a060 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
1a070 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
1a080 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
1a090 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
1a0a0 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
1a0b0 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
1a0c0 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
1a0d0 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
1a0e0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
1a0f0 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
1a100 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
1a110 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
1a120 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
1a130 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
1a140 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
1a150 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
1a160 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
1a170 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1a180 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
1a190 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
1a1a0 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
1a1b0 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
1a1c0 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
1a1d0 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
1a1e0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
1a1f0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1a200 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
1a210 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
1a220 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1a230 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
1a240 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
1a250 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
1a260 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
1a270 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
1a280 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
1a290 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
1a2a0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1a2b0 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
1a2c0 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
1a2d0 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
1a2e0 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
1a2f0 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
1a300 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
1a310 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
1a320 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28      if( ISALPHA(
1a330 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
1a340 3e 63 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c 4e  >code || (!ISALN
1a350 55 4d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  UM(cp[-1]) && cp
1a360 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
1a370 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
1a380 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
1a390 63 70 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a  cp[1]; ISALNUM(*
1a3a0 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
1a3b0 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
1a3c0 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
1a3d0 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
1a3e0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
1a3f0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
1a400 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
1a410 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
1a420 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
1a430 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
1a440 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
1a450 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
1a460 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
1a470 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1a480 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1a490 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
1a4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1a4b0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
1a4c0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
1a4d0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
1a4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a4f0 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
1a500 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
1a510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a520 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
1a530 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
1a540 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
1a550 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
1a560 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
1a570 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
1a580 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
1a590 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
1a5a0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1a5b0 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
1a5c0 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
1a5d0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
1a5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a5f0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
1a600 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
1a610 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
1a620 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1a640 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
1a650 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1a660 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1a670 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
1a680 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
1a690 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a6b0 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
1a6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a6d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1a6e0 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
1a6f0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
1a700 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
1a710 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
1a720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a730 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
1a740 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
1a750 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1a760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
1a790 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
1a7a0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
1a7b0 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
1a7c0 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
1a7d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
1a7e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
1a7f0 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
1a800 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
1a810 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
1a820 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
1a830 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1a840 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1a850 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
1a860 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
1a870 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
1a880 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
1a890 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
1a8a0 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
1a8b0 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
1a8c0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
1a8d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
1a8e0 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
1a8f0 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
1a900 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
1a910 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
1a920 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
1a930 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
1a940 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1a950 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
1a960 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
1a970 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1a980 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1a990 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1a9a0 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
1a9b0 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
1a9c0 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
1a9d0 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
1a9e0 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
1a9f0 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
1aa00 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
1aa10 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1aa20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
1aa30 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
1aa40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
1aa50 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
1aa60 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
1aa70 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
1aa80 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
1aa90 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
1aaa0 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
1aab0 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
1aac0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
1aad0 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
1aae0 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
1aaf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ab00 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
1ab10 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
1ab20 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
1ab30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1ab40 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
1ab50 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
1ab60 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
1ab70 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
1ab80 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
1ab90 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
1aba0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1abb0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
1abc0 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
1abd0 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
1abe0 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
1abf0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
1ac00 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
1ac10 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
1ac20 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
1ac30 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
1ac40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1ac50 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
1ac60 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
1ac70 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
1ac80 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
1ac90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
1aca0 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
1acb0 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
1acc0 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 28 20 21  code ){.   if( !
1acd0 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
1ace0 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69  lag ){.     (*li
1acf0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70  neno)++;.     tp
1ad00 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72  lt_linedir(out,r
1ad10 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69  p->line,lemp->fi
1ad20 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20  lename);.   }.  
1ad30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25   fprintf(out,"{%
1ad40 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20  s",rp->code);.  
1ad50 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1ad60 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
1ad70 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
1ad80 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a   ) (*lineno)++;.
1ad90 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
1ada0 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66 28 6f   */.   fprintf(o
1adb0 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"}\n"); (*lin
1adc0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21  eno)++;.   if( !
1add0 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
1ade0 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69  lag ){.     (*li
1adf0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70  neno)++;.     tp
1ae00 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
1ae10 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74  lineno,lemp->out
1ae20 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 20 2f  name);.   }. } /
1ae30 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f  * End if( rp->co
1ae40 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e  de ) */.. return
1ae50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1ae60 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
1ae70 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65  of the union use
1ae80 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
1ae90 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a  's data stack..*
1aea0 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e  * This union con
1aeb0 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72  tains fields for
1aec0 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
1aed0 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f  data type for to
1aee0 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74  kens.** and nont
1aef0 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68  erminals.  In th
1af00 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d  e process of com
1af10 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74  puting and print
1af20 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f  ing this.** unio
1af30 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  n, also set the 
1af40 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f  ".dtnum" field o
1af50 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c  f every terminal
1af60 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1af70 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76  .** symbol..*/.v
1af80 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  oid print_stack_
1af90 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f  union(.  FILE *o
1afa0 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
1afb0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
1afc0 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73  ut stream */.  s
1afd0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1afe0 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
1aff0 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75  e main info stru
1b000 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 70  cture for this p
1b010 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  arser */.  int *
1b020 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20  plineno,        
1b030 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1b040 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75  r to the line nu
1b050 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68  mber */.  int mh
1b060 66 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  flag            
1b070 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b080 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65   generating make
1b090 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a  headers output *
1b0a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  /.){.  int linen
1b0b0 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
1b0c0 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
1b0d0 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
1b0e0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
1b0f0 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
1b100 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
1b110 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
1b120 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
1b130 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b140 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
1b150 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
1b160 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
1b170 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1b180 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
1b190 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
1b1a0 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
1b1b0 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
1b1c0 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
1b1d0 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
1b1e0 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
1b1f0 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
1b200 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1b210 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73  ounters */.  uns
1b220 69 67 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20  igned hash;     
1b230 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
1b240 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
1b250 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f  f a type */.  co
1b260 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  nst char *name; 
1b270 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b280 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
1b290 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1b2a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
1b2b0 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
1b2c0 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
1b2d0 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
1b2e0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
1b2f0 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
1b300 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)calloc( arrays
1b310 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  ize, sizeof(char
1b320 2a 29 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65  *) );.  if( type
1b330 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  s==0 ){.    fpri
1b340 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
1b350 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
1b360 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1b370 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1b380 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79  raysize; i++) ty
1b390 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61  pes[i] = 0;.  ma
1b3a0 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20  xdtlength = 0;. 
1b3b0 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79   if( lemp->varty
1b3c0 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c  pe ){.    maxdtl
1b3d0 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72  ength = lemonStr
1b3e0 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70  len(lemp->vartyp
1b3f0 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
1b400 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1b410 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
1b420 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63  t len;.    struc
1b430 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1b440 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1b450 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74  .    if( sp->dat
1b460 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  atype==0 ) conti
1b470 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c  nue;.    len = l
1b480 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64  emonStrlen(sp->d
1b490 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
1b4a0 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
1b4b0 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
1b4c0 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
1b4d0 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
1b4e0 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
1b4f0 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73  2 + 1 );.  if( s
1b500 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  tddt==0 ){.    f
1b510 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1b520 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1b530 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1b540 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
1b550 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20  a hash table of 
1b560 64 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22  datatypes. The "
1b570 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
1b580 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a   each symbol.  *
1b590 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  * is filled in w
1b5a0 69 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64  ith the hash ind
1b5b0 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e  ex plus 1.  A ".
1b5c0 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20  dtnum" value of 
1b5d0 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66  0 is.  ** used f
1b5e0 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  or terminal symb
1b5f0 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ols.  If there i
1b600 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79  s no %default_ty
1b610 70 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a  pe defined then.
1b620 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75    ** 0 is also u
1b630 73 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75  sed as the .dtnu
1b640 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74  m value for nont
1b650 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64  erminals which d
1b660 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20  o not specify.  
1b670 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73  ** a datatype us
1b680 69 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69  ing the %type di
1b690 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  rective..  */.  
1b6a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1b6b0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1b6c0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1b6d0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
1b6e0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68  mbols[i];.    ch
1b6f0 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20  ar *cp;.    if( 
1b700 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp==lemp->errsym
1b710 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1b720 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b  num = arraysize+
1b730 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
1b740 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1b750 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45   sp->type!=NONTE
1b760 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64  RMINAL || (sp->d
1b770 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65  atatype==0 && le
1b780 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20  mp->vartype==0) 
1b790 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1b7a0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
1b7b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1b7c0 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74    cp = sp->datat
1b7d0 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d  ype;.    if( cp=
1b7e0 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) cp = lemp->
1b7f0 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d  vartype;.    j =
1b800 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   0;.    while( I
1b810 53 53 50 41 43 45 28 2a 63 70 29 20 29 20 63 70  SSPACE(*cp) ) cp
1b820 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ++;.    while( *
1b830 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20  cp ) stddt[j++] 
1b840 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69  = *cp++;.    whi
1b850 6c 65 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41  le( j>0 && ISSPA
1b860 43 45 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29  CE(stddt[j-1]) )
1b870 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b   j--;.    stddt[
1b880 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  j] = 0;.    if( 
1b890 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20  lemp->tokentype 
1b8a0 26 26 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c  && strcmp(stddt,
1b8b0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65   lemp->tokentype
1b8c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  )==0 ){.      sp
1b8d0 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1b8e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b8f0 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b   }.    hash = 0;
1b900 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
1b910 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
1b920 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
1b930 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
1b940 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
1b950 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66  (hash & 0x7fffff
1b960 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ff)%arraysize;. 
1b970 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
1b980 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
1b990 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
1b9a0 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
1b9b0 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
1b9c0 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
1b9d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
1b9f0 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
1ba00 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29  hash>=(unsigned)
1ba10 61 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68  arraysize ) hash
1ba20 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1ba30 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
1ba40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1ba50 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
1ba60 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61  ;.      types[ha
1ba70 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  sh] = (char*)mal
1ba80 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
1ba90 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20  (stddt)+1 );.   
1baa0 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
1bab0 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  h]==0 ){.       
1bac0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bad0 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1bae0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  n");.        exi
1baf0 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
1bb00 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
1bb10 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
1bb20 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dt);.    }.  }..
1bb30 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74    /* Print out t
1bb40 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1bb50 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64   YYTOKENTYPE and
1bb60 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a   YYMINORTYPE */.
1bb70 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
1bb80 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
1bb90 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69   : "Parse";.  li
1bba0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
1bbb0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1bbc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1bbd0 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1bbe0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
1bbf0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1bc00 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ine %sTOKENTYPE 
1bc10 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20  %s\n",name,.    
1bc20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f  lemp->tokentype?
1bc30 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a  lemp->tokentype:
1bc40 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e  "void*");  linen
1bc50 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1bc60 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
1bc70 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1bc80 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
1bc90 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66  ntf(out,"typedef
1bca0 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69   union {\n"); li
1bcb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1bcc0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69  f(out,"  int yyi
1bcd0 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  nit;\n"); lineno
1bce0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1bcf0 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
1bd00 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
1bd10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
1bd20 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
1bd30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1bd40 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
1bd50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1bd60 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
1bd70 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
1bd80 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
1bd90 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
1bda0 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ]);.  }.  if( le
1bdb0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1bdc0 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1bdd0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
1bde0 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
1bdf0 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
1be00 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65  no++;.  }.  free
1be10 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
1be20 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
1be30 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
1be40 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
1be50 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
1be60 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  = lineno;.}../*.
1be70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
1be80 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79  me of a C dataty
1be90 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65  pe able to repre
1bea0 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77  sent values betw
1beb0 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75  een.** lwr and u
1bec0 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  pr, inclusive.  
1bed0 49 66 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20  If pnByte!=NULL 
1bee0 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20  then also write 
1bef0 74 68 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f  the sizeof.** fo
1bf00 72 20 74 68 61 74 20 74 79 70 65 20 28 31 2c 20  r that type (1, 
1bf10 32 2c 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70  2, or 4) into *p
1bf20 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nByte..*/.static
1bf30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
1bf40 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
1bf50 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c  nt lwr, int upr,
1bf60 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1bf70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1bf80 70 65 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e  pe = "int";.  in
1bf90 74 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69  t nByte = 4;.  i
1bfa0 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20  f( lwr>=0 ){.   
1bfb0 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b   if( upr<=255 ){
1bfc0 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1bfd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a  unsigned char";.
1bfe0 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b        nByte = 1;
1bff0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75  .    }else if( u
1c000 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20  pr<65535 ){.    
1c010 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67    zType = "unsig
1c020 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
1c030 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b        nByte = 2;
1c040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c050 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67    zType = "unsig
1c060 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20  ned int";.      
1c070 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d  nByte = 4;.    }
1c080 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
1c090 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
1c0a0 32 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  27 ){.    zType 
1c0b0 3d 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b  = "signed char";
1c0c0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a  .    nByte = 1;.
1c0d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1c0e0 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
1c0f0 32 37 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70  2767 ){.    zTyp
1c100 65 20 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20  e = "short";.   
1c110 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a   nByte = 2;.  }.
1c120 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1c130 70 6e 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a  pnByte = nByte;.
1c140 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
1c150 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74  }../*.** Each st
1c160 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ate contains a s
1c170 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e  et of token tran
1c180 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65  saction and a se
1c190 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69  t of.** nontermi
1c1a0 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nal transactions
1c1b0 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65  .  Each of these
1c1c0 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69   sets makes an i
1c1d0 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
1c1e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1c1f0 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79  cture.  An array
1c200 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
1c210 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  ures is used.** 
1c220 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65  to order the cre
1c230 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73  ation of entries
1c240 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
1c250 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  n[] table..*/.st
1c260 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73  ruct axset {.  s
1c270 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1c280 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  ;   /* A pointer
1c290 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20   to a state */. 
1c2a0 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20   int isTkn;     
1c2b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1c2c0 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61   use tokens.  Fa
1c2d0 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d  lse for non-term
1c2e0 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  inals */.  int n
1c2f0 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
1c300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
1c310 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ions */.  int iO
1c320 72 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  rder;          /
1c330 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72  * Original order
1c340 20 6f 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20   of action sets 
1c350 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1c360 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
1c370 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
1c380 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
1c390 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
1c3a0 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
1c3b0 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
1c3c0 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
1c3d0 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
1c3e0 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
1c3f0 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1c400 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
1c410 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a  et*)b;.  int c;.
1c420 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f    c = p2->nActio
1c430 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b  n - p1->nAction;
1c440 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
1c450 20 20 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65     c = p1->iOrde
1c460 72 20 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a  r - p2->iOrder;.
1c470 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21    }.  assert( c!
1c480 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a  =0 || p1==p2 );.
1c490 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
1c4a0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20  *.** Write text 
1c4b0 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65  on "out" that de
1c4c0 73 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65  scribes the rule
1c4d0 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "rp"..*/.static
1c4e0 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54   void writeRuleT
1c4f0 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  ext(FILE *out, s
1c500 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
1c510 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69  .  int j;.  fpri
1c520 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22  ntf(out,"%s ::="
1c530 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  , rp->lhs->name)
1c540 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72  ;.  for(j=0; j<r
1c550 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20  p->nrhs; j++){. 
1c560 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1c570 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a   *sp = rp->rhs[j
1c580 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  ];.    if( sp->t
1c590 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
1c5a0 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  AL ){.      fpri
1c5b0 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73  ntf(out," %s", s
1c5c0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  p->name);.    }e
1c5d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  lse{.      int k
1c5e0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1c5f0 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73  out," %s", sp->s
1c600 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[0]->name);
1c610 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
1c620 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  k<sp->nsubsym; k
1c630 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
1c640 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73  intf(out,"|%s",s
1c650 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61  p->subsym[k]->na
1c660 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1c670 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
1c680 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20  nerate C source 
1c690 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
1c6a0 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1c6b0 72 74 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63  rtTable(.  struc
1c6c0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
1c6d0 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20   int mhflag     
1c6e0 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b  /* Output in mak
1c6f0 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20  eheaders format 
1c700 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1c710 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
1c720 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
1c730 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69  SIZE];.  int  li
1c740 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  neno;.  struct s
1c750 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
1c760 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
1c770 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1c780 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74  p;.  struct actt
1c790 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69  ab *pActtab;.  i
1c7a0 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a  nt i, j, n, sz;.
1c7b0 20 20 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79    int szActionTy
1c7c0 70 65 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f  pe;     /* sizeo
1c7d0 66 28 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20  f(YYACTIONTYPE) 
1c7e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54  */.  int szCodeT
1c7f0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69  ype;       /* si
1c800 7a 65 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29  zeof(YYCODETYPE)
1c810 20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68     */.  const ch
1c820 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  ar *name;.  int 
1c830 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e  mnTknOfst, mxTkn
1c840 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74  Ofst;.  int mnNt
1c850 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a  Ofst, mxNtOfst;.
1c860 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1c870 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74  ax;..  in = tplt
1c880 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69  _open(lemp);.  i
1c890 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
1c8a0 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f  n;.  out = file_
1c8b0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22  open(lemp,".c","
1c8c0 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d  wb");.  if( out=
1c8d0 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  =0 ){.    fclose
1c8e0 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (in);.    return
1c8f0 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d  ;.  }.  lineno =
1c900 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28   1;.  tplt_xfer(
1c910 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1c920 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1c930 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69  * Generate the i
1c940 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20  nclude code, if 
1c950 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  any */.  tplt_pr
1c960 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1c970 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65  p->include,&line
1c980 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  no);.  if( mhfla
1c990 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69  g ){.    char *i
1c9a0 6e 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61  ncName = file_ma
1c9b0 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68  kename(lemp, ".h
1c9c0 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
1c9d0 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22  out,"#include \"
1c9e0 25 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65  %s\"\n", incName
1c9f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1ca00 20 66 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a   free(incName);.
1ca10 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1ca20 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1ca30 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1ca40 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69  * Generate #defi
1ca50 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65  nes for all toke
1ca60 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c  ns */.  if( mhfl
1ca70 61 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ag ){.    const 
1ca80 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20  char *prefix;.  
1ca90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1caa0 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29  if INTERFACE\n")
1cab0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1cac0 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
1cad0 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
1cae0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1caf0 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20  ix;.    else    
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb10 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  prefix = "";.   
1cb20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
1cb30 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
1cb40 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1cb50 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1cb60 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
1cb70 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
1cb80 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
1cb90 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
1cba0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
1cbb0 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
1cbc0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1cbd0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1cbe0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1cbf0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1cc00 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e  nerate the defin
1cc10 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  es */.  fprintf(
1cc20 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43  out,"#define YYC
1cc30 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  ODETYPE %s\n",. 
1cc40 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1cc50 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73  type(0, lemp->ns
1cc60 79 6d 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65  ymbol+1, &szCode
1cc70 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Type)); lineno++
1cc80 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1cc90 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
1cca0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
1ccb0 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
1ccc0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1ccd0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
1cce0 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
1ccf0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1cd00 5f 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6e 73  _type(0,lemp->ns
1cd10 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65  tate+lemp->nrule
1cd20 2a 32 2b 35 2c 26 73 7a 41 63 74 69 6f 6e 54 79  *2+5,&szActionTy
1cd30 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  pe)); lineno++;.
1cd40 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64    if( lemp->wild
1cd50 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69  card ){.    fpri
1cd60 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1cd70 20 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e   YYWILDCARD %d\n
1cd80 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ",.       lemp->
1cd90 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29  wildcard->index)
1cda0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1cdb0 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e    print_stack_un
1cdc0 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69  ion(out,lemp,&li
1cdd0 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20  neno,mhflag);.  
1cde0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69  fprintf(out, "#i
1cdf0 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50  fndef YYSTACKDEP
1ce00 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  TH\n"); lineno++
1ce10 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  ;.  if( lemp->st
1ce20 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  acksize ){.    f
1ce30 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ce40 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1ce50 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61   %s\n",lemp->sta
1ce60 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f  cksize);  lineno
1ce70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1ce80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ce90 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1cea0 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e  TH 100\n");  lin
1ceb0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72  eno++;.  }.  fpr
1cec0 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69  intf(out, "#endi
1ced0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1cee0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1cef0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1cf00 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
1cf10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cf20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70   }.  name = lemp
1cf30 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
1cf40 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
1cf50 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26   if( lemp->arg &
1cf60 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29  & lemp->arg[0] )
1cf70 7b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53  {.    i = lemonS
1cf80 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29  trlen(lemp->arg)
1cf90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1cfa0 31 20 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d  1 && ISSPACE(lem
1cfb0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69  p->arg[i-1]) ) i
1cfc0 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  --;.    while( i
1cfd0 3e 3d 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28  >=1 && (ISALNUM(
1cfe0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20  lemp->arg[i-1]) 
1cff0 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  || lemp->arg[i-1
1d000 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20  ]=='_') ) i--;. 
1d010 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d020 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44  #define %sARG_SD
1d030 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c  ECL %s;\n",name,
1d040 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
1d050 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1d060 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1d070 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c  %sARG_PDECL ,%s\
1d080 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
1d090 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
1d0a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d0b0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
1d0c0 54 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73  TCH %s = yypPars
1d0d0 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20  er->%s\n",.     
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
1d0f0 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70  ,lemp->arg,&lemp
1d100 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65  ->arg[i]);  line
1d110 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1d120 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1d130 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61  sARG_STORE yypPa
1d140 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22  rser->%s = %s\n"
1d150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d160 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61     name,&lemp->a
1d170 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67  rg[i],&lemp->arg
1d180 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
1d190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
1d1a0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d1b0 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e  ne %sARG_SDECL\n
1d1c0 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
1d1d0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1d1e0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1d1f0 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  RG_PDECL\n",name
1d200 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1d210 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1d220 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1d230 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  CH\n",name); lin
1d240 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1d250 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1d260 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e  %sARG_STORE\n",n
1d270 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1d280 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67    }.  if( mhflag
1d290 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1d2a0 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1d2b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1d2c0 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79   if( lemp->errsy
1d2d0 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20  m->useCnt ){.   
1d2e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1d2f0 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d  efine YYERRORSYM
1d300 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  BOL %d\n",lemp->
1d310 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20  errsym->index); 
1d320 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1d330 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d340 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79  ne YYERRSYMDT yy
1d350 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
1d360 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
1d370 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
1d380 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1d390 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ck ){.    fprint
1d3a0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1d3b0 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b  YFALLBACK 1\n");
1d3c0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a    lineno++;.  }.
1d3d0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1d3e0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20  e action table, 
1d3f0 62 75 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75  but do not outpu
1d400 74 20 69 74 20 79 65 74 2e 20 20 54 68 65 20 61  t it yet.  The a
1d410 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65  ction.  ** table
1d420 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65   must be compute
1d430 64 20 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74  d before generat
1d440 69 6e 67 20 74 68 65 20 59 59 4e 53 54 41 54 45  ing the YYNSTATE
1d450 20 6d 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20   macro because. 
1d460 20 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b   ** we need to k
1d470 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61  now how many sta
1d480 74 65 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69  tes can be elimi
1d490 6e 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78  nated..  */.  ax
1d4a0 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1d4b0 20 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d   *) calloc(lemp-
1d4c0 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65  >nxstate*2, size
1d4d0 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66  of(ax[0]));.  if
1d4e0 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ( ax==0 ){.    f
1d4f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d  printf(stderr,"m
1d500 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29  alloc failed\n")
1d510 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1d520 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1d530 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69  lemp->nxstate; i
1d540 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
1d550 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1d560 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20      ax[i*2].stp 
1d570 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a  = stp;.    ax[i*
1d580 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20  2].isTkn = 1;.  
1d590 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f    ax[i*2].nActio
1d5a0 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74  n = stp->nTknAct
1d5b0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1d5c0 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61  stp = stp;.    a
1d5d0 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d  x[i*2+1].isTkn =
1d5e0 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31   0;.    ax[i*2+1
1d5f0 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
1d600 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d  >nNtAct;.  }.  m
1d610 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e  xTknOfst = mnTkn
1d620 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74  Ofst = 0;.  mxNt
1d630 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  Ofst = mnNtOfst 
1d640 3d 20 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20  = 0;.  /* In an 
1d650 65 66 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69  effort to minimi
1d660 7a 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ze the action ta
1d670 62 6c 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68  ble size, use th
1d680 65 20 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a  e heuristic.  **
1d690 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20   of placing the 
1d6a0 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73  largest action s
1d6b0 65 74 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66  ets first */.  f
1d6c0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d6d0 6e 78 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20  nxstate*2; i++) 
1d6e0 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69  ax[i].iOrder = i
1d6f0 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65  ;.  qsort(ax, le
1d700 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73  mp->nxstate*2, s
1d710 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78  izeof(ax[0]), ax
1d720 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20  set_compare);.  
1d730 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62  pActtab = acttab
1d740 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  _alloc();.  for(
1d750 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
1d760 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e  tate*2 && ax[i].
1d770 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b  nAction>0; i++){
1d780 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d  .    stp = ax[i]
1d790 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78  .stp;.    if( ax
1d7a0 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20  [i].isTkn ){.   
1d7b0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1d7c0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1d7d0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1d7e0 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1d7f0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1d800 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ex>=lemp->ntermi
1d810 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  nal ) continue;.
1d820 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d          action =
1d830 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1d840 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1d850 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1d860 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d870 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f      acttab_actio
1d880 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73  n(pActtab, ap->s
1d890 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e  p->index, action
1d8a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d8b0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1d8c0 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1d8d0 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69  Acttab);.      i
1d8e0 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74  f( stp->iTknOfst
1d8f0 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54  <mnTknOfst ) mnT
1d900 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54  knOfst = stp->iT
1d910 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66  knOfst;.      if
1d920 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e  ( stp->iTknOfst>
1d930 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b  mxTknOfst ) mxTk
1d940 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1d950 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  nOfst;.    }else
1d960 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
1d970 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1d980 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1d990 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
1d9a0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1d9b0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
1d9c0 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
1d9d0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1d9e0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c  ap->sp->index==l
1d9f0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63  emp->nsymbol ) c
1da00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1da10 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1da20 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1da30 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1da40 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1da50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1da60 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1da70 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1da80 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1da90 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1daa0 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  NtOfst = acttab_
1dab0 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b  insert(pActtab);
1dac0 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1dad0 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74  iNtOfst<mnNtOfst
1dae0 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74   ) mnNtOfst = st
1daf0 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1db00 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1db10 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78  st>mxNtOfst ) mx
1db20 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1db30 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66  tOfst;.    }.#if
1db40 20 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74   0  /* Uncomment
1db50 20 66 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20   for a trace of 
1db60 68 6f 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f  how the yy_actio
1db70 6e 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20  n[] table fills 
1db80 6f 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74  out */.    { int
1db90 20 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66   jj, nn;.      f
1dba0 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70  or(jj=nn=0; jj<p
1dbb0 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b  Acttab->nAction;
1dbc0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
1dbd0 69 66 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63  if( pActtab->aAc
1dbe0 74 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c  tion[jj].action<
1dbf0 30 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20  0 ) nn++;.      
1dc00 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
1dc10 25 34 64 3a 20 53 74 61 74 65 20 25 33 64 20 25  %4d: State %3d %
1dc20 73 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25  s n: %2d size: %
1dc30 35 64 20 66 72 65 65 73 70 61 63 65 3a 20 25 64  5d freespace: %d
1dc40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1dc50 20 20 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e    i, stp->staten
1dc60 75 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20  um, ax[i].isTkn 
1dc70 3f 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72  ? "Token" : "Var
1dc80 20 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20    ",.           
1dc90 20 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c    ax[i].nAction,
1dca0 20 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f   pActtab->nActio
1dcb0 6e 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  n, nn);.    }.#e
1dcc0 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28  ndif.  }.  free(
1dcd0 61 78 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 73  ax);..  /* Finis
1dce0 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65 20  h rendering the 
1dcf0 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74 68  constants now th
1dd00 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  at the action ta
1dd10 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ble has.  ** bee
1dd20 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20  n computed */.  
1dd30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1dd40 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20 20  fine YYNSTATE   
1dd50 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
1dd60 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b 20  lemp->nxstate); 
1dd70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1dd80 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1dd90 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20 20  e YYNRULE       
1dda0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
1ddb0 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
1ddc0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1ddd0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1dde0 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20 20 20  MAX_SHIFT       
1ddf0 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78    %d\n",lemp->nx
1de00 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f  state-1); lineno
1de10 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1de20 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49  t,"#define YY_MI
1de30 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20  N_SHIFTREDUCE   
1de40 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61  %d\n",lemp->nsta
1de50 74 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  te); lineno++;. 
1de60 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   i = lemp->nstat
1de70 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
1de80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1de90 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53  #define YY_MAX_S
1dea0 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c  HIFTREDUCE   %d\
1deb0 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", i-1); lineno
1dec0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1ded0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49  t,"#define YY_MI
1dee0 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  N_REDUCE        
1def0 25 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e  %d\n", i); linen
1df00 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d  o++;.  i = lemp-
1df10 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1df20 6e 72 75 6c 65 2a 32 3b 0a 20 20 66 70 72 69 6e  nrule*2;.  fprin
1df30 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1df40 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20 20  YY_MAX_REDUCE   
1df50 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29       %d\n", i-1)
1df60 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1df70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1df80 6e 65 20 59 59 5f 45 52 52 4f 52 5f 41 43 54 49  ne YY_ERROR_ACTI
1df90 4f 4e 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  ON      %d\n", i
1dfa0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1dfb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1dfc0 69 6e 65 20 59 59 5f 41 43 43 45 50 54 5f 41 43  ine YY_ACCEPT_AC
1dfd0 54 49 4f 4e 20 20 20 20 20 25 64 5c 6e 22 2c 20  TION     %d\n", 
1dfe0 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
1dff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e000 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41 43 54  define YY_NO_ACT
1e010 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64 5c 6e  ION         %d\n
1e020 22 2c 20 69 2b 32 29 3b 20 6c 69 6e 65 6e 6f 2b  ", i+2); lineno+
1e030 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
1e040 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e050 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e060 20 4e 6f 77 20 6f 75 74 70 75 74 20 74 68 65 20   Now output the 
1e070 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64  action table and
1e080 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 73 3a   its associates:
1e090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61  .  **.  **  yy_a
1e0a0 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41  ction[]        A
1e0b0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f   single table co
1e0c0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74  ntaining all act
1e0d0 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c  ions..  **  yy_l
1e0e0 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20 41  ookahead[]     A
1e0f0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1e100 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  g the lookahead 
1e110 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 69  for each entry i
1e120 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  n.  **          
1e130 20 20 20 20 20 20 20 20 20 20 20 79 79 5f 61 63             yy_ac
1e140 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f 20 64  tion.  Used to d
1e150 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c 6c 69  etect hash colli
1e160 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  sions..  **  yy_
1e170 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20  shift_ofst[]    
1e180 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1e190 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1e1a0 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1e1b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e1c0 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1e1d0 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20  terminals..  ** 
1e1e0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1e1f0 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61  ]   For each sta
1e200 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1e210 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1e220 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1e230 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1e240 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ing non-terminal
1e250 73 20 61 66 74 65 72 20 61 20 72 65 64 75 63 65  s after a reduce
1e260 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66 61 75  ..  **  yy_defau
1e270 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66 61 75  lt[]       Defau
1e280 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  lt action for ea
1e290 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a  ch state..  */..
1e2a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1e2b0 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1e2c0 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 61 63 74 69  */.  lemp->nacti
1e2d0 6f 6e 74 61 62 20 3d 20 6e 20 3d 20 61 63 74 74  ontab = n = actt
1e2e0 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29  ab_size(pActtab)
1e2f0 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
1e300 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
1e310 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  nType;.  fprintf
1e320 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1e330 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
1e340 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
1e350 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1e360 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1e370 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1e380 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
1e390 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1e3a0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1e3b0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
1e3c0 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
1e3d0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
1e3e0 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
1e3f0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
1e400 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1e410 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
1e420 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1e430 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1e440 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1e450 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1e460 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
1e470 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1e480 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1e490 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1e4a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1e4b0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1e4c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1e4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1e4e0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1e4f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1e500 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1e510 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
1e520 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c   */.  lemp->tabl
1e530 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64  esize += n*szCod
1e540 65 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  eType;.  fprintf
1e550 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
1e560 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79 79  st YYCODETYPE yy
1e570 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b  _lookahead[] = {
1e580 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1e590 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1e5a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1e5b0 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f  la = acttab_yylo
1e5c0 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62 2c  okahead(pActtab,
1e5d0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c   i);.    if( la<
1e5e0 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e  0 ) la = lemp->n
1e5f0 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20  symbol;.    if( 
1e600 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1e610 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1e620 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1e630 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1e640 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  la);.    if( j==
1e650 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1e660 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1e670 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1e680 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1e690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6a0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1e6b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e6c0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1e6d0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1e6e0 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  he yy_shift_ofst
1e6f0 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  [] table */.  fp
1e700 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1e710 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45  ine YY_SHIFT_USE
1e720 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
1e730 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e  nTknOfst-1); lin
1e740 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1e750 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68  p->nxstate;.  wh
1e760 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1e770 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1e780 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  TknOfst==NO_OFFS
1e790 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1e7a0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1e7b0 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54  e YY_SHIFT_COUNT
1e7c0 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
1e7d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1e7e0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1e7f0 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20  e YY_SHIFT_MIN  
1e800 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
1e810 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1e820 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e830 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1e840 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
1e850 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65  mxTknOfst); line
1e860 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1e870 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1e880 73 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f  st %s yy_shift_o
1e890 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
1e8a0 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
1e8b0 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e  _size_type(mnTkn
1e8c0 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73  Ofst-1, mxTknOfs
1e8d0 74 2c 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f  t, &sz)); lineno
1e8e0 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  ++;.  lemp->tabl
1e8f0 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20  esize += n*sz;. 
1e900 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1e910 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1e920 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1e930 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1e940 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1e950 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66  iTknOfst;.    if
1e960 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  ( ofst==NO_OFFSE
1e970 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e  T ) ofst = mnTkn
1e980 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66  Ofst - 1;.    if
1e990 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1e9a0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1e9b0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1e9c0 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1e9d0 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
1e9e0 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1e9f0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1ea00 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1ea10 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1ea20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ea30 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1ea40 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1ea50 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1ea60 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1ea70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63 65  ut the yy_reduce
1ea80 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1ea90 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1eaa0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1eab0 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29  CE_USE_DFLT (%d)
1eac0 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29  \n", mnNtOfst-1)
1ead0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1eae0 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  = lemp->nxstate;
1eaf0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
1eb00 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d   lemp->sorted[n-
1eb10 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f  1]->iNtOfst==NO_
1eb20 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20  OFFSET ) n--;.  
1eb30 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1eb40 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1eb50 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1eb60 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1eb70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1eb80 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1eb90 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MIN   (%d)\n", 
1eba0 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mnNtOfst); linen
1ebb0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1ebc0 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1ebd0 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25 64  REDUCE_MAX   (%d
1ebe0 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29 3b  )\n", mxNtOfst);
1ebf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1ec00 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
1ec10 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65  c const %s yy_re
1ec20 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  duce_ofst[] = {\
1ec30 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d  n", .          m
1ec40 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1ec50 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e  (mnNtOfst-1, mxN
1ec60 74 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20 6c 69  tOfst, &sz)); li
1ec70 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e  neno++;.  lemp->
1ec80 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73  tablesize += n*s
1ec90 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  z;.  for(i=j=0; 
1eca0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1ecb0 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70  nt ofst;.    stp
1ecc0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1ecd0 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73  i];.    ofst = s
1ece0 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
1ecf0 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46   if( ofst==NO_OF
1ed00 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e  FSET ) ofst = mn
1ed10 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20  NtOfst - 1;.    
1ed20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1ed30 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1ed40 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1ed50 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1ed60 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
1ed70 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1ed80 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1ed90 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1eda0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1edb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1edc0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1edd0 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1ede0 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1edf0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1ee00 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74  tput the default
1ee10 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f   action table */
1ee20 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1ee30 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
1ee40 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65  ACTIONTYPE yy_de
1ee50 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  fault[] = {\n");
1ee60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1ee70 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a   lemp->nxstate;.
1ee80 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
1ee90 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54  e += n*szActionT
1eea0 79 70 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ype;.  for(i=j=0
1eeb0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1eec0 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1eed0 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ted[i];.    if( 
1eee0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1eef0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1ef00 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1ef10 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1ef20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65  stp->iDfltReduce
1ef30 2b 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65  +lemp->nstate+le
1ef40 6d 70 2d 3e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  mp->nrule);.    
1ef50 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1ef60 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1ef70 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1ef80 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1ef90 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1efa0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1efb0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1efc0 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1efd0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
1efe0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1eff0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1f000 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1f010 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c  the table of fal
1f020 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20  lback tokens..  
1f030 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  */.  if( lemp->h
1f040 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1f050 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70     int mx = lemp
1f060 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b  ->nterminal - 1;
1f070 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30  .    while( mx>0
1f080 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
1f090 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d  s[mx]->fallback=
1f0a0 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20  =0 ){ mx--; }.  
1f0b0 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
1f0c0 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a 43 6f  e += (mx+1)*szCo
1f0d0 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f 72 28  deType;.    for(
1f0e0 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29  i=0; i<=mx; i++)
1f0f0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1f100 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
1f110 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1f120 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
1f130 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
1f140 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1f150 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
1f160 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
1f170 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
1f180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f190 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1f1a0 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
1f1b0 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
1f1c0 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
1f1d0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
1f1e0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
1f1f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1f200 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1f210 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
1f220 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
1f230 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
1f240 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1f250 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1f260 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
1f270 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
1f280 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
1f290 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1f2a0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1f2b0 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
1f2c0 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c  line,"\"%s\",",l
1f2d0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1f2e0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69  >name);.    fpri
1f2f0 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73  ntf(out,"  %-15s
1f300 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28  ",line);.    if(
1f310 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72   (i&3)==3 ){ fpr
1f320 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
1f330 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a  lineno++; }.  }.
1f340 20 20 69 66 28 20 28 69 26 33 29 21 3d 30 20 29    if( (i&3)!=0 )
1f350 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  { fprintf(out,"\
1f360 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
1f370 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1f380 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1f390 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1f3a0 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20  enerate a table 
1f3b0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78  containing a tex
1f3c0 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  t string that de
1f3d0 73 63 72 69 62 65 73 20 65 76 65 72 79 0a 20 20  scribes every.  
1f3e0 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72  ** rule in the r
1f3f0 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65 20 67  ule set of the g
1f400 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20 69 6e  rammar.  This in
1f410 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
1f420 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63  d.  ** when trac
1f430 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f  ing REDUCE actio
1f440 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
1f450 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  =0, rp=lemp->rul
1f460 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1f470 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  xt, i++){.    as
1f480 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d  sert( rp->index=
1f490 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  =i );.    fprint
1f4a0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a  f(out," /* %3d *
1f4b0 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20 77  / \"", i);.    w
1f4c0 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1f4d0 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
1f4e0 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b  tf(out,"\",\n");
1f4f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1f500 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1f510 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1f520 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1f530 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1f540 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20   executes every 
1f550 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73  time a symbol is
1f560 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a   popped from.  *
1f570 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c  * the stack whil
1f580 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72  e processing err
1f590 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73  ors or while des
1f5a0 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73  troying the pars
1f5b0 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74  er. .  ** (In ot
1f5c0 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72  her words, gener
1f5d0 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63  ate the %destruc
1f5e0 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a  tor actions).  *
1f5f0 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  /.  if( lemp->to
1f600 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 69  kendest ){.    i
1f610 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1f620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1f630 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1f640 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1f650 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1f660 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1f670 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1f680 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  sp->type!=TERMIN
1f690 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
1f6a0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1f6b0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1f6c0 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1f6d0 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63  TERMINAL Destruc
1f6e0 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  tor */\n"); line
1f6f0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e  no++;.        on
1f700 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
1f710 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1f720 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1f730 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d  /* %s */\n", sp-
1f740 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65  >index, sp->name
1f750 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1f760 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1f770 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
1f780 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  && lemp->symbols
1f790 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49  [i]->type!=TERMI
1f7a0 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69  NAL; i++);.    i
1f7b0 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  f( i<lemp->nsymb
1f7c0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  ol ){.      emit
1f7d0 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1f7e0 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  (out,lemp->symbo
1f7f0 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ls[i],lemp,&line
1f800 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  no);.      fprin
1f810 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
1f820 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1f830 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1f840 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
1f850 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
1f860 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20  symbol *dflt_sp 
1f870 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  = 0;.    int onc
1f880 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
1f890 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1f8a0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
1f8b0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1f8c0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1f8d0 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1f8e0 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1f8f0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a  pe==TERMINAL ||.
1f900 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e            sp->in
1f910 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  dex<=0 || sp->de
1f920 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f  structor!=0 ) co
1f930 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1f940 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
1f950 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f960 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
1f970 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20 44 65   NON-TERMINAL De
1f980 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b  structor */\n");
1f990 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1f9a0 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1f9b0 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
1f9c0 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1f9d0 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1f9e0 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1f9f0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1fa00 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20  ;.      dflt_sp 
1fa10 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sp;.    }.    
1fa20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29  if( dflt_sp!=0 )
1fa30 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1fa40 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1fa50 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c  ,dflt_sp,lemp,&l
1fa60 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  ineno);.    }.  
1fa70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1fa80 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1fa90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1faa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1fab0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1fac0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1fad0 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1fae0 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69  ymbols[i];.    i
1faf0 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
1fb00 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
1fb10 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
1fb20 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1fb30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1fb40 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1fb50 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69   %s */\n", sp->i
1fb60 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ndex, sp->name);
1fb70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20   lineno++;..    
1fb80 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69  /* Combine dupli
1fb90 63 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73  cate destructors
1fba0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63   into a single c
1fbb0 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ase */.    for(j
1fbc0 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73  =i+1; j<lemp->ns
1fbd0 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ymbol; j++){.   
1fbe0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1fbf0 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79   *sp2 = lemp->sy
1fc00 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20  mbols[j];.      
1fc10 69 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e  if( sp2 && sp2->
1fc20 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26  type!=TERMINAL &
1fc30 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  & sp2->destructo
1fc40 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  r.          && s
1fc50 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64  p2->dtnum==sp->d
1fc60 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26  tnum.          &
1fc70 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73  & strcmp(sp->des
1fc80 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73  tructor,sp2->des
1fc90 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20  tructor)==0 ){. 
1fca0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1fcb0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1fcc0 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  : /* %s */\n",. 
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d  sp2->index, sp2-
1fcf0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1fd00 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e  ;.         sp2->
1fd10 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
1fd20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fd30 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1fd40 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1fd50 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1fd60 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1fd70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1fd80 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
1fd90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1fda0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1fdb0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1fdc0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1fdd0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1fde0 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72  xecutes whenever
1fdf0 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
1fe00 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  k overflows */. 
1fe10 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1fe20 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66  lemp,lemp->overf
1fe30 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  low,&lineno);.  
1fe40 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1fe50 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1fe60 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1fe70 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  rate the table o
1fe80 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69  f rule informati
1fe90 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  on .  **.  ** No
1fea0 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65  te: This code de
1feb0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1fec0 74 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65  t that rules are
1fed0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71   number.  ** seq
1fee0 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e  uentually beginn
1fef0 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f  ing with 0..  */
1ff00 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1ff10 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1ff20 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69  >next){.    fpri
1ff30 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c  ntf(out,"  { %d,
1ff40 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68   %d },\n",rp->lh
1ff50 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68  s->index,rp->nrh
1ff60 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  s); lineno++;.  
1ff70 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1ff80 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ff90 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ffa0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1ffb0 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75  ich execution du
1ffc0 72 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45  ring each REDUCE
1ffd0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72   action */.  for
1ffe0 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1fff0 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
20000 7b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f  {.    translate_
20010 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a  code(lemp, rp);.
20020 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f    }.  /* First o
20030 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65  utput rules othe
20040 72 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75  r than the defau
20050 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f  lt: rule */.  fo
20060 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
20070 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
20080 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  ){.    struct ru
20090 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20  le *rp2;        
200a0 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20         /* Other 
200b0 72 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73  rules with the s
200c0 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ame action */.  
200d0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
200e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
200f0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 5b 30    if( rp->code[0
20100 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63  ]=='\n' && rp->c
20110 6f 64 65 5b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74  ode[1]==0 ) cont
20120 69 6e 75 65 3b 20 2f 2a 20 57 69 6c 6c 20 62 65  inue; /* Will be
20130 20 64 65 66 61 75 6c 74 3a 20 2a 2f 0a 20 20 20   default: */.   
20140 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
20150 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
20160 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ", rp->index);. 
20170 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
20180 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
20190 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f  printf(out, " */
201a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
201b0 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e      for(rp2=rp->
201c0 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72  next; rp2; rp2=r
201d0 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  p2->next){.     
201e0 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d   if( rp2->code==
201f0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20  rp->code ){.    
20200 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20210 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
20220 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78  /* ", rp2->index
20230 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
20240 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
20250 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  2);.        fpri
20260 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74  ntf(out," */ yyt
20270 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f  estcase(yyruleno
20280 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e  ==%d);\n", rp2->
20290 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
202a0 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63  ;.        rp2->c
202b0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
202c0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f  .    }.    emit_
202d0 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70  code(out,rp,lemp
202e0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66  ,&lineno);.    f
202f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
20300 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
20310 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70  lineno++;.    rp
20320 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a  ->code = 0;.  }.
20330 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75    /* Finally, ou
20340 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74  tput the default
20350 3a 20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f  : rule.  We choo
20360 73 65 20 61 73 20 74 68 65 20 64 65 66 61 75 6c  se as the defaul
20370 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74  t: all.  ** empt
20380 79 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  y actions. */.  
20390 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
203a0 20 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b     default:\n");
203b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
203c0 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
203d0 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
203e0 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  {.    if( rp->co
203f0 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  de==0 ) continue
20400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70  ;.    assert( rp
20410 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20  ->code[0]=='\n' 
20420 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d  && rp->code[1]==
20430 30 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 );.    fprintf
20440 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28  (out,"      /* (
20450 25 64 29 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78  %d) ", rp->index
20460 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
20470 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
20480 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20490 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28  " */ yytestcase(
204a0 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e  yyruleno==%d);\n
204b0 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  ", rp->index); l
204c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
204d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
204e0 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
204f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
20500 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
20510 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
20520 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
20530 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
20540 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20  utes if a parse 
20550 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  fails */.  tplt_
20560 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
20570 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69  emp->failure,&li
20580 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
20590 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
205a0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
205b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
205c0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
205d0 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20  s when a syntax 
205e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
205f0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
20600 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f  ,lemp,lemp->erro
20610 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  r,&lineno);.  tp
20620 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
20630 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
20640 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
20650 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
20660 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
20670 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69  parser accepts i
20680 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70  ts input */.  tp
20690 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
206a0 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26  p,lemp->accept,&
206b0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
206c0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
206d0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
206e0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e  ..  /* Append an
206f0 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20  y addition code 
20700 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73  the user desires
20710 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
20720 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
20730 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e  extracode,&linen
20740 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e  o);..  fclose(in
20750 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  );.  fclose(out)
20760 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
20770 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61  * Generate a hea
20780 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65  der file for the
20790 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
207a0 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74 72  ReportHeader(str
207b0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
207c0 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20  .{.  FILE *out, 
207d0 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *in;.  const cha
207e0 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61  r *prefix;.  cha
207f0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
20800 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e  ;.  char pattern
20810 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
20820 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  t i;..  if( lemp
20830 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
20840 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
20850 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c  okenprefix;.  el
20860 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
20870 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
20880 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f  ";.  in = file_o
20890 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72  pen(lemp,".h","r
208a0 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b  b");.  if( in ){
208b0 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43 68 61  .    int nextCha
208c0 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  r;.    for(i=1; 
208d0 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
208e0 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c  l && fgets(line,
208f0 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b  LINESIZE,in); i+
20900 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  +){.      lemon_
20910 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c  sprintf(pattern,
20920 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
20930 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20   %3d\n",.       
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
20950 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
20960 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
20970 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
20980 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20  line,pattern) ) 
20990 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
209a0 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67 65 74   nextChar = fget
209b0 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73  c(in);.    fclos
209c0 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
209d0 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
209e0 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d 3d 45  l && nextChar==E
209f0 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  OF ){.      /* N
20a00 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  o change in the 
20a10 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77  file.  Don't rew
20a20 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  rite it. */.    
20a30 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
20a40 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65    }.  out = file
20a50 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
20a60 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  "wb");.  if( out
20a70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
20a80 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
20a90 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
20aa0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
20ab0 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64  fine %s%-30s %3d
20ac0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
20ad0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
20ae0 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e,i);.    }.    
20af0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20  fclose(out);  . 
20b00 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
20b10 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69  /* Reduce the si
20b20 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
20b30 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73   tables, if poss
20b40 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ible, by making 
20b50 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c  use.** of defaul
20b60 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ts..**.** In thi
20b70 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61  s version, we ta
20b80 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71  ke the most freq
20b90 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69  uent REDUCE acti
20ba0 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69  on and make.** i
20bb0 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  t the default.  
20bc0 45 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73  Except, there is
20bd0 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74   no default if t
20be0 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
20bf0 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62  n.** is a possib
20c00 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a  le look-ahead..*
20c10 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54  /.void CompressT
20c20 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ables(struct lem
20c30 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
20c40 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
20c50 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
20c60 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74   *ap, *ap2;.  st
20c70 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a  ruct rule *rp, *
20c80 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69  rp2, *rbest;.  i
20c90 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69  nt nbest, n;.  i
20ca0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73  nt i;.  int uses
20cb0 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72  Wildcard;..  for
20cc0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
20cd0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
20ce0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
20cf0 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74  ed[i];.    nbest
20d00 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20   = 0;.    rbest 
20d10 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c  = 0;.    usesWil
20d20 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20  dcard = 0;..    
20d30 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
20d40 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
20d50 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
20d60 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61  type==SHIFT && a
20d70 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c  p->sp==lemp->wil
20d80 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20  dcard ){.       
20d90 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20   usesWildcard = 
20da0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
20db0 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52   if( ap->type!=R
20dc0 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
20dd0 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d  ;.      rp = ap-
20de0 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28  >x.rp;.      if(
20df0 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20   rp->lhsStart ) 
20e00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20e10 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20  if( rp==rbest ) 
20e20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20e30 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  n = 1;.      for
20e40 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61  (ap2=ap->next; a
20e50 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78  p2; ap2=ap2->nex
20e60 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
20e70 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43  ap2->type!=REDUC
20e80 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
20e90 20 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d        rp2 = ap2-
20ea0 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69  >x.rp;.        i
20eb0 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20  f( rp2==rbest ) 
20ec0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20ed0 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20    if( rp2==rp ) 
20ee0 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
20ef0 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29     if( n>nbest )
20f00 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20  {.        nbest 
20f10 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65  = n;.        rbe
20f20 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d  st = rp;.      }
20f30 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
20f40 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65  Do not make a de
20f50 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d  fault if the num
20f60 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20  ber of rules to 
20f70 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69  default.    ** i
20f80 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31  s not at least 1
20f90 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
20fa0 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70  ard token is a p
20fb0 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c  ossible.    ** l
20fc0 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f  ookahead..    */
20fd0 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31  .    if( nbest<1
20fe0 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64   || usesWildcard
20ff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20   ) continue;... 
21000 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61     /* Combine ma
21010 74 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63  tching REDUCE ac
21020 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e  tions into a sin
21030 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20  gle default */. 
21040 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
21050 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
21060 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
21070 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
21080 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
21090 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  st ) break;.    
210a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  }.    assert( ap
210b0 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d   );.    ap->sp =
210c0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
210d0 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f  fault}");.    fo
210e0 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61  r(ap=ap->next; a
210f0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
21100 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
21110 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
21120 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29  p->x.rp==rbest )
21130 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f   ap->type = NOT_
21140 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  USED;.    }.    
21150 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
21160 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
21170 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
21180 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
21190 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
211a0 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54   ap->type==SHIFT
211b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
211c0 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
211d0 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
211e0 21 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b  !=rbest ) break;
211f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
21200 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  p==0 ){.      st
21210 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 3d 20  p->autoReduce = 
21220 31 3b 0a 20 20 20 20 20 20 73 74 70 2d 3e 70 44  1;.      stp->pD
21230 66 6c 74 52 65 64 75 63 65 20 3d 20 72 62 65 73  fltReduce = rbes
21240 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
21250 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64  /* Make a second
21260 20 70 61 73 73 20 6f 76 65 72 20 61 6c 6c 20 73   pass over all s
21270 74 61 74 65 73 20 61 6e 64 20 61 63 74 69 6f 6e  tates and action
21280 73 2e 20 20 43 6f 6e 76 65 72 74 0a 20 20 2a 2a  s.  Convert.  **
21290 20 65 76 65 72 79 20 61 63 74 69 6f 6e 20 74 68   every action th
212a0 61 74 20 69 73 20 61 20 53 48 49 46 54 20 74 6f  at is a SHIFT to
212b0 20 61 6e 20 61 75 74 6f 52 65 64 75 63 65 20 73   an autoReduce s
212c0 74 61 74 65 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  tate into.  ** a
212d0 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74   SHIFTREDUCE act
212e0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ion..  */.  for(
212f0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
21300 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
21310 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
21320 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70  d[i];.    for(ap
21330 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
21340 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
21350 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
21360 70 4e 65 78 74 53 74 61 74 65 3b 0a 20 20 20 20  pNextState;.    
21370 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d    if( ap->type!=
21380 53 48 49 46 54 20 29 20 63 6f 6e 74 69 6e 75 65  SHIFT ) continue
21390 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 53 74 61  ;.      pNextSta
213a0 74 65 20 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a  te = ap->x.stp;.
213b0 20 20 20 20 20 20 69 66 28 20 70 4e 65 78 74 53        if( pNextS
213c0 74 61 74 65 2d 3e 61 75 74 6f 52 65 64 75 63 65  tate->autoReduce
213d0 20 26 26 20 70 4e 65 78 74 53 74 61 74 65 2d 3e   && pNextState->
213e0 70 44 66 6c 74 52 65 64 75 63 65 21 3d 30 20 29  pDfltReduce!=0 )
213f0 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 74 79  {.        ap->ty
21400 70 65 20 3d 20 53 48 49 46 54 52 45 44 55 43 45  pe = SHIFTREDUCE
21410 3b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e  ;.        ap->x.
21420 72 70 20 3d 20 70 4e 65 78 74 53 74 61 74 65 2d  rp = pNextState-
21430 3e 70 44 66 6c 74 52 65 64 75 63 65 3b 0a 20 20  >pDfltReduce;.  
21440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21450 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
21460 65 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72  e two states for
21470 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
21480 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20  s.  The smaller 
21490 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20  state is the.** 
214a0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
214b0 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  t non-terminal a
214c0 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79  ctions.  If they
214d0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
214e0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d  umber.** of non-
214f0 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
21500 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c  , then the small
21510 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  er is the one wi
21520 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74  th the most.** t
21530 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f  oken actions..*/
21540 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74  .static int stat
21550 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63  eResortCompare(c
21560 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
21570 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
21580 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
21590 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74  te *pA = *(const
215a0 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29   struct state**)
215b0 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  a;.  const struc
215c0 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28  t state *pB = *(
215d0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
215e0 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b  te**)b;.  int n;
215f0 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41  ..  n = pB->nNtA
21600 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b  ct - pA->nNtAct;
21610 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
21620 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41     n = pB->nTknA
21630 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74  ct - pA->nTknAct
21640 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  ;.    if( n==0 )
21650 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e  {.      n = pB->
21660 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73  statenum - pA->s
21670 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  tatenum;.    }. 
21680 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d   }.  assert( n!=
21690 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  0 );.  return n;
216a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d  .}.../*.** Renum
216b0 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73  ber and resort s
216c0 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74  tates so that st
216d0 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20  ates with fewer 
216e0 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72  choices.** occur
216f0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78   at the end.  Ex
21700 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65  cept, keep state
21710 20 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20   0 as the first 
21720 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52  state..*/.void R
21730 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75  esortStates(stru
21740 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
21750 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
21760 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
21770 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
21780 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  *ap;..  for(i=0;
21790 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
217a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
217b0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
217c0 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41  ;.    stp->nTknA
217d0 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74  ct = stp->nNtAct
217e0 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69   = 0;.    stp->i
217f0 44 66 6c 74 52 65 64 75 63 65 20 3d 20 6c 65 6d  DfltReduce = lem
21800 70 2d 3e 6e 72 75 6c 65 3b 20 20 2f 2a 20 49 6e  p->nrule;  /* In
21810 69 74 20 64 66 6c 74 20 61 63 74 69 6f 6e 20 74  it dflt action t
21820 6f 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72 22  o "syntax error"
21830 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b   */.    stp->iTk
21840 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  nOfst = NO_OFFSE
21850 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f  T;.    stp->iNtO
21860 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
21870 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
21880 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
21890 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  next){.      int
218a0 20 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75   iAction = compu
218b0 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61  te_action(lemp,a
218c0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 41  p);.      if( iA
218d0 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  ction>=0 ){.    
218e0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
218f0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
21900 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  minal ){.       
21910 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b     stp->nTknAct+
21920 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
21930 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
21940 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  ex<lemp->nsymbol
21950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
21960 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20  p->nNtAct++;.   
21970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74        assert( st
21990 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d 3d 30  p->autoReduce==0
219a0 20 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74 52 65   || stp->pDfltRe
219b0 64 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70 20 29  duce==ap->x.rp )
219c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  ;.          stp-
219d0 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 69  >iDfltReduce = i
219e0 41 63 74 69 6f 6e 20 2d 20 6c 65 6d 70 2d 3e 6e  Action - lemp->n
219f0 73 74 61 74 65 20 2d 20 6c 65 6d 70 2d 3e 6e 72  state - lemp->nr
21a00 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ule;.        }. 
21a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21a20 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e  .  qsort(&lemp->
21a30 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d  sorted[1], lemp-
21a40 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f  >nstate-1, sizeo
21a50 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  f(lemp->sorted[0
21a60 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74  ]),.        stat
21a70 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b  eResortCompare);
21a80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
21a90 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
21aa0 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74  {.    lemp->sort
21ab0 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20  ed[i]->statenum 
21ac0 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d 70 2d  = i;.  }.  lemp-
21ad0 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d 70 2d  >nxstate = lemp-
21ae0 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
21af0 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3e  ( lemp->nxstate>
21b00 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  1 && lemp->sorte
21b10 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d  d[lemp->nxstate-
21b20 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 29  1]->autoReduce )
21b30 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78 73 74  {.    lemp->nxst
21b40 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ate--;.  }.}.../
21b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b60 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
21b70 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
21b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
21ba0 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
21bb0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
21bc0 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
21bd0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
21be0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
21bf0 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
21c00 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
21c10 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20  oid SetSize(int 
21c20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n).{.  size = n+
21c30 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
21c40 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
21c50 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20  har *SetNew(){. 
21c60 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20   char *s;.  s = 
21c70 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73  (char*)calloc( s
21c80 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  ize, 1);.  if( s
21c90 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
21ca0 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
21cb0 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72  ror();.    memor
21cc0 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
21cd0 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a   return s;.}../*
21ce0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
21cf0 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65  t */.void SetFre
21d00 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66  e(char *s).{.  f
21d10 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64  ree(s);.}../* Ad
21d20 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
21d30 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74  to the set.  Ret
21d40 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
21d50 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65  element was adde
21d60 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69  d.** and FALSE i
21d70 66 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79  f it was already
21d80 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53   there. */.int S
21d90 65 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69  etAdd(char *s, i
21da0 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76  nt e).{.  int rv
21db0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30  ;.  assert( e>=0
21dc0 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20   && e<size );.  
21dd0 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65  rv = s[e];.  s[e
21de0 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
21df0 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65  !rv;.}../* Add e
21e00 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
21e10 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72  s2 to s1.  Retur
21e20 6e 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61  n TRUE if s1 cha
21e30 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  nges. */.int Set
21e40 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20  Union(char *s1, 
21e50 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e  char *s2).{.  in
21e60 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20  t i, progress;. 
21e70 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
21e80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
21e90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
21ea0 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  s2[i]==0 ) conti
21eb0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b  nue;.    if( s1[
21ec0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  i]==0 ){.      p
21ed0 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
21ee0 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20     s1[i] = 1;.  
21ef0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21f00 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a   progress;.}./**
21f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f20 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
21f30 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a  le "table.c" ***
21f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
21f60 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
21f70 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
21f80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
21f90 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
21fa0 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
21fb0 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
21fd0 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
21fe0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
21ff0 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
22000 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
22010 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
22020 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
22030 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
22040 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
22050 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
22060 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
22070 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
22080 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
22090 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
220a0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52  enerator..*/..PR
220b0 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73  IVATE unsigned s
220c0 74 72 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61  trhash(const cha
220d0 72 20 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  r *x).{.  unsign
220e0 65 64 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c  ed h = 0;.  whil
220f0 65 28 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33  e( *x ) h = h*13
22100 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74   + *(x++);.  ret
22110 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72  urn h;.}../* Wor
22120 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20  ks like strdup, 
22130 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61  sort of.  Save a
22140 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f   string in mallo
22150 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a  ced memory, but.
22160 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20  ** keep strings 
22170 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68  in a table so th
22180 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
22190 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72  ng is not in mor
221a0 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c  e.** than one pl
221b0 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ace..*/.const ch
221c0 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
221d0 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63  t char *y).{.  c
221e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
221f0 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66  char *cpy;..  if
22200 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( y==0 ) return 
22210 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65  0;.  z = Strsafe
22220 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20  _find(y);.  if( 
22230 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68  z==0 && (cpy=(ch
22240 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
22250 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29  onStrlen(y)+1 ))
22260 21 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e  !=0 ){.    lemon
22270 5f 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a  _strcpy(cpy,y);.
22280 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20      z = cpy;.   
22290 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
222a0 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79  z);.  }.  Memory
222b0 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75  Check(z);.  retu
222c0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn z;.}../* Ther
222d0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
222e0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
222f0 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
22300 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
22310 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
22320 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x1"..*/.stru
22330 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20  ct s_x1 {.  int 
22340 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
22350 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
22360 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
22370 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
223a0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
223b0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
223e0 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
223f0 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
22400 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22410 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
22420 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
22430 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
22440 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
22450 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
22460 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
22470 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
22480 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
22490 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
224a0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
224b0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
224c0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
224d0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
224e0 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
224f0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
22500 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x1"..*/.typede
22510 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64  f struct s_x1nod
22520 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e {.  const char
22530 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f   *data;        /
22540 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
22550 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
22560 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
22570 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
22580 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
22590 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
225a0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
225b0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31  ous link */.} x1
225c0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
225d0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
225e0 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
225f0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
22600 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
22610 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20  tic struct s_x1 
22620 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x1a;../* Alloca
22630 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
22640 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
22650 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  id Strsafe_init(
22660 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72  ){.  if( x1a ) r
22670 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28  eturn;.  x1a = (
22680 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c  struct s_x1*)mal
22690 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
226a0 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66  ct s_x1) );.  if
226b0 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61  ( x1a ){.    x1a
226c0 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  ->size = 1024;. 
226d0 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20     x1a->count = 
226e0 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20  0;.    x1a->tbl 
226f0 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x1node*)callo
22700 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78  c(1024, sizeof(x
22710 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
22720 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
22730 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x1a->tbl==0 )
22740 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61  {.      free(x1a
22750 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30  );.      x1a = 0
22760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
22780 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64  x1a->ht = (x1nod
22790 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31  e**)&(x1a->tbl[1
227a0 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  024]);.      for
227b0 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b  (i=0; i<1024; i+
227c0 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x1a->ht[i] = 
227d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
227e0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
227f0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
22800 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
22810 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
22820 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
22830 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
22840 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
22850 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73  tten */.int Strs
22860 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
22870 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20   char *data).{. 
22880 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x1node *np;.  u
22890 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
228a0 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
228b0 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
228c0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
228d0 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
228e0 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
228f0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
22900 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
22910 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
22920 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  rcmp(np->data,da
22930 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
22940 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22950 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
22960 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
22970 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
22980 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
22990 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
229a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
229b0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
229c0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
229d0 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f   }.  if( x1a->co
229e0 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29  unt>=x1a->size )
229f0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
22a00 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22a10 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22a20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
22a30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
22a40 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  1 array;.    arr
22a50 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
22a60 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b  e = x1a->size*2;
22a70 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
22a80 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x1a->count;. 
22a90 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
22aa0 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x1node*)calloc(a
22ab0 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
22ac0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
22ad0 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
22ae0 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
22af0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
22b00 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
22b10 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
22b20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31    array.ht = (x1
22b30 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
22b40 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
22b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
22b60 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
22b70 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
22b80 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e  for(i=0; i<x1a->
22b90 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
22ba0 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x1node *oldnp
22bb0 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
22bc0 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  oldnp = &(x1a->t
22bd0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
22be0 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
22bf0 3e 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a  >data) & (arrSiz
22c00 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
22c10 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
22c20 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
22c30 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
22c40 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
22c50 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
22c60 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
22c70 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
22c80 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
22c90 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
22ca0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
22cb0 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
22cc0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
22cd0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
22ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
22cf0 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
22d00 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
22d10 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
22d20 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
22d30 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
22d40 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
22d50 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
22d60 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
22d70 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
22d80 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
22d90 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
22da0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
22db0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
22dc0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
22dd0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
22de0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
22df0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
22e00 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
22e10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
22e20 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
22e30 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
22e40 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
22e50 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
22e60 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
22e70 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
22e80 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  char *key).{.  u
22e90 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e  nsigned h;.  x1n
22ea0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
22eb0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
22ec0 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
22ed0 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
22ee0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
22ef0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
22f00 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
22f10 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
22f20 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
22f30 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
22f40 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
22f50 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
22f60 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
22f70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22f80 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
22f90 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
22fa0 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
22fb0 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
22fc0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
22fd0 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
22fe0 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
22ff0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
23000 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
23010 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72  char *x).{.  str
23020 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
23030 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  .  sp = Symbol_f
23040 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70  ind(x);.  if( sp
23050 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  ==0 ){.    sp = 
23060 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
23070 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
23080 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29  f(struct symbol)
23090 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   );.    MemoryCh
230a0 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d  eck(sp);.    sp-
230b0 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28  >name = Strsafe(
230c0 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65  x);.    sp->type
230d0 20 3d 20 49 53 55 50 50 45 52 28 2a 78 29 20 3f   = ISUPPER(*x) ?
230e0 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54   TERMINAL : NONT
230f0 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d  ERMINAL;.    sp-
23100 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73  >rule = 0;.    s
23110 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
23120 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20  .    sp->prec = 
23130 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f  -1;.    sp->asso
23140 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d  c = UNK;.    sp-
23150 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20  >firstset = 0;. 
23160 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20     sp->lambda = 
23170 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20  LEMON_FALSE;.   
23180 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
23190 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  = 0;.    sp->des
231a0 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20  tLineno = 0;.   
231b0 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20   sp->datatype = 
231c0 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e  0;.    sp->useCn
231d0 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f  t = 0;.    Symbo
231e0 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e  l_insert(sp,sp->
231f0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d  name);.  }.  sp-
23200 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74  >useCnt++;.  ret
23210 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  urn sp;.}../* Co
23220 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c  mpare two symbol
23230 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
23240 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
23250 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72  negative,.** zer
23260 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
23270 66 20 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e  f a is less then
23280 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
23290 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62  reater.** than b
232a0 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20  ..**.** Symbols 
232b0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
232c0 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65  upper case lette
232d0 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72  rs (terminals or
232e0 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74   tokens).** must
232f0 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d   sort before sym
23300 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
23310 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20  with lower case 
23320 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d  letters.** (non-
23330 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64  terminals).  And
23340 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73   MULTITERMINAL s
23350 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20  ymbols (created 
23360 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f  using the.** %to
23370 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74  ken_class direct
23380 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61  ive) must sort a
23390 74 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20  t the very end. 
233a0 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  Other than.** th
233b0 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f  at, the order do
233c0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a  es not matter..*
233d0 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70  *.** We find exp
233e0 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74  erimentally that
233f0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d   leaving the sym
23400 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72  bols in their or
23410 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20  iginal.** order 
23420 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20  (the order they 
23430 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
23440 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69  grammar file) gi
23450 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c  ves the.** small
23460 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65  est parser table
23470 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
23480 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63  int Symbolcmpp(c
23490 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63  onst void *_a, c
234a0 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b  onst void *_b).{
234b0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
234c0 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f  symbol *a = *(co
234d0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
234e0 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73  l **) _a;.  cons
234f0 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
23500 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  *b = *(const str
23510 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f  uct symbol **) _
23520 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d  b;.  int i1 = a-
23530 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
23540 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61  INAL ? 3 : a->na
23550 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
23560 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d  1;.  int i2 = b-
23570 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
23580 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61  INAL ? 3 : b->na
23590 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
235a0 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d  1;.  return i1==
235b0 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20  i2 ? a->index - 
235c0 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20  b->index : i1 - 
235d0 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
235e0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
235f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
23600 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
23610 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
23620 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
23630 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
23640 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
23650 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
23660 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
23670 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
23680 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
236b0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
236c0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
236f0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
23700 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
23710 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23720 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
23730 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
23740 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
23750 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
23760 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
23770 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
23780 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
23790 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
237a0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
237b0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
237c0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
237d0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
237e0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
237f0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
23800 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
23810 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
23820 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
23830 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
23840 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20  l *data;     /* 
23850 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f  The data */.  co
23860 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20  nst char *key;  
23870 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
23880 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
23890 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
238a0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
238b0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
238c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
238d0 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
238e0 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
238f0 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
23900 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
23910 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
23920 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
23930 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
23940 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
23950 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
23960 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
23970 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
23980 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
23990 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
239a0 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  2a ) return;.  x
239b0 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  2a = (struct s_x
239c0 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  2*)malloc( sizeo
239d0 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29  f(struct s_x2) )
239e0 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20  ;.  if( x2a ){. 
239f0 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31     x2a->size = 1
23a00 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75  28;.    x2a->cou
23a10 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d  nt = 0;.    x2a-
23a20 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  >tbl = (x2node*)
23a30 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65  calloc(128, size
23a40 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
23a50 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x2node*));. 
23a60 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d     if( x2a->tbl=
23a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
23a80 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61  (x2a);.      x2a
23a90 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
23aa0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
23ab0 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78      x2a->ht = (x
23ac0 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74  2node**)&(x2a->t
23ad0 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
23ae0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
23af0 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20  i++) x2a->ht[i] 
23b00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
23b10 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
23b20 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
23b30 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
23b40 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
23b50 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
23b60 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
23b70 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
23b80 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79  ritten */.int Sy
23b90 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75  mbol_insert(stru
23ba0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c  ct symbol *data,
23bb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79   const char *key
23bc0 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70  ).{.  x2node *np
23bd0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
23be0 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
23bf0 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
23c00 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
23c10 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  strhash(key);.  
23c20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
23c30 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
23c40 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
23c50 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
23c60 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
23c70 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
23c80 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
23c90 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
23ca0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
23cb0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
23cc0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
23cd0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
23ce0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
23cf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
23d00 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
23d10 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e  .  }.  if( x2a->
23d20 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65  count>=x2a->size
23d30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
23d40 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
23d50 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
23d60 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69  .    int i,arrSi
23d70 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
23d80 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x2 array;.    a
23d90 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53  rray.size = arrS
23da0 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a  ize = x2a->size*
23db0 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
23dc0 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b  nt = x2a->count;
23dd0 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
23de0 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x2node*)calloc
23df0 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
23e00 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x2node) + sizeo
23e10 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x2node*));.   
23e20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
23e30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
23e40 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
23e50 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
23e60 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
23e70 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x2node**)&(array
23e80 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a  .tbl[arrSize]);.
23e90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
23ea0 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
23eb0 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
23ec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61    for(i=0; i<x2a
23ed0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
23ee0 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64       x2node *old
23ef0 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
23f00 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d    oldnp = &(x2a-
23f10 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
23f20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e  h = strhash(oldn
23f30 70 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69  p->key) & (arrSi
23f40 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
23f50 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
23f60 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
23f70 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
23f80 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
23f90 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
23fa0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
23fb0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
23fc0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
23fd0 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
23fe0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
23ff0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
24000 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
24010 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
24020 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
24030 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
24040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
24050 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x2a->tbl);.    
24060 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x2a = array;.  
24070 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
24080 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
24090 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
240a0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
240b0 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63  (x2a->tbl[x2a->c
240c0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
240d0 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
240e0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
240f0 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29  if( x2a->ht[h] )
24100 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x2a->ht[h]->fro
24110 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
24120 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32  .  np->next = x2
24130 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d  a->ht[h];.  x2a-
24140 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
24150 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d  p->from = &(x2a-
24160 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
24170 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
24180 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
24190 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
241a0 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
241b0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
241c0 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
241d0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
241e0 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e  *Symbol_find(con
241f0 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a  st char *key).{.
24200 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
24210 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x2node *np;..  i
24220 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
24230 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68  rn 0;.  h = strh
24240 61 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d  ash(key) & (x2a-
24250 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
24260 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x2a->ht[h];.  w
24270 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
24280 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b  if( strcmp(np->k
24290 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ey,key)==0 ) bre
242a0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
242b0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
242c0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
242d0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
242e0 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74  urn the n-th dat
242f0 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  a.  Return NULL 
24300 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72  if n is out of r
24310 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20  ange. */.struct 
24320 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e  symbol *Symbol_N
24330 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74  th(int n).{.  st
24340 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74  ruct symbol *dat
24350 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20  a;.  if( x2a && 
24360 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63  n>0 && n<=x2a->c
24370 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61  ount ){.    data
24380 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d   = x2a->tbl[n-1]
24390 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a  .data;.  }else{.
243a0 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20      data = 0;.  
243b0 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b  }.  return data;
243c0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
243d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
243e0 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f  ray */.int Symbo
243f0 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65  l_count().{.  re
24400 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e  turn x2a ? x2a->
24410 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  count : 0;.}../*
24420 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
24430 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
24440 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
24450 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
24460 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
24470 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
24480 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
24490 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
244a0 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
244b0 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
244c0 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
244d0 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f  symbol **Symbol_
244e0 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74  arrayof().{.  st
244f0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72  ruct symbol **ar
24500 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72  ray;.  int i,arr
24510 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d  Size;.  if( x2a=
24520 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24530 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e   arrSize = x2a->
24540 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
24550 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
24560 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  **)calloc(arrSiz
24570 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
24580 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69   symbol *));.  i
24590 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
245a0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
245b0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
245c0 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x2a->tbl[i].
245d0 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
245e0 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
245f0 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66  Compare two conf
24600 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e  igurations */.in
24610 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73  t Configcmp(cons
24620 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74  t char *_a,const
24630 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63   char *_b).{.  c
24640 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66  onst struct conf
24650 69 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20  ig *a = (struct 
24660 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20  config *) _a;.  
24670 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e  const struct con
24680 66 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74  fig *b = (struct
24690 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20   config *) _b;. 
246a0 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d   int x;.  x = a-
246b0 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
246c0 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  rp->index;.  if(
246d0 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64   x==0 ) x = a->d
246e0 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72  ot - b->dot;.  r
246f0 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43  eturn x;.}../* C
24700 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65  ompare two state
24710 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  s */.PRIVATE int
24720 20 73 74 61 74 65 63 6d 70 28 73 74 72 75 63 74   statecmp(struct
24730 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75   config *a, stru
24740 63 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a  ct config *b).{.
24750 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28    int rc;.  for(
24760 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61  rc=0; rc==0 && a
24770 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c   && b;  a=a->bp,
24780 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72   b=b->bp){.    r
24790 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  c = a->rp->index
247a0 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
247b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29  .    if( rc==0 )
247c0 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62   rc = a->dot - b
247d0 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ->dot;.  }.  if(
247e0 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
247f0 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20  ( a ) rc = 1;.  
24800 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d    if( b ) rc = -
24810 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
24820 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  rc;.}../* Hash a
24830 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54   state */.PRIVAT
24840 45 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65  E unsigned state
24850 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66  hash(struct conf
24860 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67  ig *a).{.  unsig
24870 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  ned h=0;.  while
24880 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
24890 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
248a0 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
248b0 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
248c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
248d0 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
248e0 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
248f0 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
24900 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
24910 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
24920 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20  te *newstate;.  
24930 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75  newstate = (stru
24940 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f  ct state *)callo
24950 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  c(1, sizeof(stru
24960 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d  ct state) );.  M
24970 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74  emoryCheck(newst
24980 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ate);.  return n
24990 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54  ewstate;.}../* T
249a0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
249b0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
249c0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
249d0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
249e0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
249f0 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73   type "x3"..*/.s
24a00 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69  truct s_x3 {.  i
24a10 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
24a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
24a30 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
24a40 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
24a70 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
24a80 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
24a90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ab0 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
24ac0 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
24ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24ae0 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
24af0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
24b00 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
24b10 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
24b20 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
24b30 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
24b40 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x3node **ht;  /*
24b50 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
24b60 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
24b70 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
24b80 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
24b90 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
24ba0 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
24bb0 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
24bc0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
24bd0 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70  ype "x3"..*/.typ
24be0 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33  edef struct s_x3
24bf0 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
24c00 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20  state *data;    
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c20 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
24c30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
24c40 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
24c50 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
24c60 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
24c70 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
24c80 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
24c90 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
24ca0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
24cb0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
24cc0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
24cd0 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x3node;../* T
24ce0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
24cf0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
24d00 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
24d10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
24d20 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
24d30 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41  s_x3 *x3a;../* A
24d40 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
24d50 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
24d60 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e  */.void State_in
24d70 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20  it(){.  if( x3a 
24d80 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20  ) return;.  x3a 
24d90 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29  = (struct s_x3*)
24da0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
24db0 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20  truct s_x3) );. 
24dc0 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20   if( x3a ){.    
24dd0 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x3a->size = 128;
24de0 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20  .    x3a->count 
24df0 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62  = 0;.    x3a->tb
24e00 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c  l = (x3node*)cal
24e10 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28  loc(128, sizeof(
24e20 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
24e30 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x3node*));.    
24e40 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20  if( x3a->tbl==0 
24e50 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33  ){.      free(x3
24e60 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20  a);.      x3a = 
24e70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
24e80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
24e90 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f   x3a->ht = (x3no
24ea0 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b  de**)&(x3a->tbl[
24eb0 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
24ec0 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
24ed0 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x3a->ht[i] = 0
24ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
24ef0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
24f00 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
24f10 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
24f20 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
24f30 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
24f40 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
24f50 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
24f60 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65  ten */.int State
24f70 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
24f80 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74 72 75  tate *data, stru
24f90 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a  ct config *key).
24fa0 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x3node *np;.
24fb0 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
24fc0 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
24fd0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
24fe0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
24ff0 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  atehash(key);.  
25000 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
25010 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
25020 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
25030 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
25040 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
25050 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
25060 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
25070 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
25080 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
25090 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
250a0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
250b0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
250c0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
250d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
250e0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
250f0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61  t;.  }.  if( x3a
25100 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69  ->count>=x3a->si
25110 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
25120 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
25130 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
25140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
25150 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
25160 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20   s_x3 array;.   
25170 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
25180 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a  rSize = x3a->siz
25190 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
251a0 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  ount = x3a->coun
251b0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
251c0 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c   = (x3node*)call
251d0 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
251e0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
251f0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x3node*));. 
25200 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
25210 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
25220 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
25230 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
25240 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
25250 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x3node**)&(arr
25260 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
25270 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25280 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
25290 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
252a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
252b0 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  3a->count; i++){
252c0 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f  .      x3node *o
252d0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
252e0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33      oldnp = &(x3
252f0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
25300 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
25310 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61  oldnp->key) & (a
25320 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
25330 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
25340 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
25350 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
25360 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
25370 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
25380 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
25390 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
253a0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
253b0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
253c0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
253d0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
253e0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
253f0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
25400 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
25410 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
25420 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
25430 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
25440 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
25450 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
25460 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
25470 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
25480 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
25490 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
254a0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
254b0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
254c0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
254d0 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
254e0 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
254f0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
25500 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
25510 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
25520 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
25530 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
25540 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
25550 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
25560 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25570 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
25580 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
25590 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
255a0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
255b0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
255c0 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73  te *State_find(s
255d0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
255e0 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  y).{.  unsigned 
255f0 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  h;.  x3node *np;
25600 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
25610 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
25620 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20   statehash(key) 
25630 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
25640 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
25650 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
25660 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
25670 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
25680 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25690 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
256a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
256b0 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
256c0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
256d0 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
256e0 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
256f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
25700 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
25710 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
25720 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
25730 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
25740 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
25750 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
25760 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
25770 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
25780 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20  te_arrayof().{. 
25790 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
257a0 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61  array;.  int i,a
257b0 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 33  rrSize;.  if( x3
257c0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
257d0 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61  .  arrSize = x3a
257e0 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
257f0 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
25800 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69   **)calloc(arrSi
25810 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ze, sizeof(struc
25820 74 20 73 74 61 74 65 20 2a 29 29 3b 0a 20 20 69  t state *));.  i
25830 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
25840 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
25850 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
25860 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
25870 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
25880 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
25890 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
258a0 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
258b0 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 68  unsigned configh
258c0 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ash(struct confi
258d0 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  g *a).{.  unsign
258e0 65 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a  ed h=0;.  h = h*
258f0 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
25900 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
25910 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
25920 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
25930 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
25940 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
25950 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
25960 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
25970 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
25980 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a  /.struct s_x4 {.
25990 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
259a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
259b0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
259c0 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
259f0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
25a00 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
25a10 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
25a40 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a60 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
25a70 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
25a80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
25a90 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  4node *tbl;  /* 
25aa0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
25ab0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
25ac0 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x4node **ht; 
25ad0 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
25ae0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
25af0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
25b00 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
25b10 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
25b20 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
25b30 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
25b40 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
25b50 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
25b60 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
25b70 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x4node {.  stru
25b80 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
25bb0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
25bc0 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
25bd0 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
25be0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
25bf0 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
25c00 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
25c10 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
25c20 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x4node;../* The
25c30 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
25c40 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
25c50 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
25c60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
25c70 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
25c80 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c  x4 *x4a;../* All
25c90 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
25ca0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
25cb0 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
25cc0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
25cd0 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
25ce0 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
25cf0 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
25d00 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
25d10 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
25d20 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
25d30 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
25d40 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
25d50 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
25d60 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f  calloc(64, sizeo
25d70 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
25d80 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
25d90 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
25da0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
25db0 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
25dc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
25dd0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25de0 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
25df0 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
25e00 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
25e10 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
25e20 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
25e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
25e40 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
25e50 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
25e60 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
25e70 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
25e80 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
25e90 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
25ea0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
25eb0 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
25ec0 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74  gtable_insert(st
25ed0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
25ee0 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a).{.  x4node *n
25ef0 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
25f00 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
25f10 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
25f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
25f30 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
25f40 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
25f50 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
25f60 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
25f70 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
25f80 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
25f90 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
25fa0 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20  np->data,(const 
25fb0 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30  char *) data)==0
25fc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
25fd0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
25fe0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
25ff0 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
26000 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
26010 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
26020 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
26030 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
26040 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
26050 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
26060 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
26070 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
26080 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
26090 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
260a0 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
260b0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
260c0 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61  struct s_x4 arra
260d0 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
260e0 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 34  e = arrSize = x4
260f0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
26100 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
26110 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
26120 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
26130 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
26140 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29  , sizeof(x4node)
26150 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
26160 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
26170 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
26180 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
26190 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
261a0 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
261b0 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  y.ht = (x4node**
261c0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
261d0 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
261e0 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
261f0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
26200 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
26210 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
26220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
26230 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
26240 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
26250 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
26260 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
26270 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
26280 74 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ta) & (arrSize-1
26290 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
262a0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
262b0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
262c0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
262d0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
262e0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
262f0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
26300 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
26310 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
26320 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
26330 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
26340 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
26350 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
26360 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
26370 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
26380 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
26390 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
263a0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
263b0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
263c0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
263d0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
263e0 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
263f0 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
26400 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
26410 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
26420 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
26430 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
26440 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
26450 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
26460 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
26470 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
26480 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
26490 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
264a0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
264b0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
264c0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
264d0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
264e0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
264f0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
26500 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
26510 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
26520 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
26530 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
26540 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
26550 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
26560 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
26570 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
26580 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
26590 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
265a0 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
265b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
265c0 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
265d0 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29  har *) key)==0 )
265e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
265f0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
26600 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
26610 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
26620 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
26630 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
26640 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
26650 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
26660 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
26670 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
26680 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
26690 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
266a0 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
266b0 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
266c0 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  f)(struct config
266d0 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *)).{.  int i;.
266e0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
266f0 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
26700 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
26710 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
26720 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
26730 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
26740 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
26750 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
26760 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
26770 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
26780 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
26790 0a                                               .