/ Hex Artifact Content
Login

Artifact d02a276728c507a7007333944eeabafab1668033794af348389b1166075869ee:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62  bject */.  int b
2310: 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
2320: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2330: 68 69 73 20 73 79 6d 62 6f 6c 20 65 76 65 72 20  his symbol ever 
2340: 63 61 72 72 69 65 73 20 63 6f 6e 74 65 6e 74 20  carries content 
2350: 2d 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  - if.           
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2a 2a 20 69 74 20 69 73 20 65 76 65 72 20 6d 6f  ** it is ever mo
2380: 72 65 20 74 68 61 6e 20 6a 75 73 74 20 73 79 6e  re than just syn
2390: 74 61 78 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20  tax */.  /* The 
23a0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
23b0: 20 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c   are used by MUL
23c0: 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79  TITERMINALs only
23d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79   */.  int nsubsy
23e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
23f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
2400: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
2410: 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a  in the MULTI */.
2420: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
2430: 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72  **subsym;  /* Ar
2440: 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65  ray of constitue
2450: 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b  nt symbols */.};
2460: 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63  ../* Each produc
2470: 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65  tion rule in the
2480: 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72   grammar is stor
2490: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
24a0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
24b0: 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .  */.struct rul
24c0: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
24d0: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f  bol *lhs;      /
24e0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
24f0: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a   of the rule */.
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68    const char *lh
2510: 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20 41 6c  salias;    /* Al
2520: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
2530: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
2540: 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74  /.  int lhsStart
2550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2560: 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e  True if left-han
2570: 64 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74  d side is the st
2580: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
2590: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
25a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
25b0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
25c0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
25d0: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
25e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25f0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
2600: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2610: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
2620: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
2630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 72    const char **r
2640: 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20 41 6e  hsalias;   /* An
2650: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
2660: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
2670: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
2680: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
2690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
26a0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
26b0: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
26c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64   const char *cod
26d0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
26e0: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
26f0: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
2700: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 63 6f   reduced */.  co
2710: 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65 50 72  nst char *codePr
2720: 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75 70 20  efix;  /* Setup 
2730: 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f 64 65  code before code
2740: 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20 63 6f  [] above */.  co
2750: 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65 53 75  nst char *codeSu
2760: 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61 6b 64  ffix;  /* Breakd
2770: 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72 20 63  own code after c
2780: 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20  ode[] above */. 
2790: 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20 20 20   int noCode;    
27a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27b0: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 68  e if this rule h
27c0: 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64  as no associated
27d0: 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   C code */.  int
27e0: 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20 20 20   codeEmitted;   
27f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2800: 20 74 68 65 20 63 6f 64 65 20 68 61 73 20 62 65   the code has be
2810: 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72 65 61  en emitted alrea
2820: 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  dy */.  struct s
2830: 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20  ymbol *precsym; 
2840: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73   /* Precedence s
2850: 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72  ymbol for this r
2860: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64  ule */.  int ind
2870: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
2880: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75    /* An index nu
2890: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75  mber for this ru
28a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 75 6c  le */.  int iRul
28b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
28c0: 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65 72 20   /* Rule number 
28d0: 61 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 67  as used in the g
28e0: 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 73 20  enerated tables 
28f0: 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e  */.  Boolean can
2900: 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a  Reduce;       /*
2910: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75   True if this ru
2920: 6c 65 20 69 73 20 65 76 65 72 20 72 65 64 75 63  le is ever reduc
2930: 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ed */.  Boolean 
2940: 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20 20 20  doesReduce;     
2950: 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74 69 6f   /* Reduce actio
2960: 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72 20 6f  ns occur after o
2970: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  ptimization */. 
2980: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
2990: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
29a0: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
29b0: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
29c0: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
29d0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
29e0: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
29f0: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
2a00: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
2a10: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
2a20: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
2a30: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
2a40: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
2a50: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
2a60: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
2a70: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
2a80: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
2a90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
2aa0: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
2ab0: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
2ac0: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
2ad0: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
2ae0: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
2af0: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
2b00: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
2b10: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
2b20: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
2b30: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
2b40: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2b50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
2b60: 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61 74 75  */.enum cfgstatu
2b70: 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45 2c 0a  s {.  COMPLETE,.
2b80: 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d 3b 0a    INCOMPLETE.};.
2b90: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a  struct config {.
2ba0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
2bb0: 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p;         /* Th
2bc0: 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63  e rule upon whic
2bd0: 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  h the configurat
2be0: 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a  ion is based */.
2bf0: 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20    int dot;      
2c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c10: 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f  e parse point */
2c20: 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20  .  char *fws;   
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68  ollow-set for th
2c50: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2c60: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63   only */.  struc
2c70: 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20  t plink *fplp;  
2c80: 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65      /* Follow-se
2c90: 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67  t forward propag
2ca0: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
2cb0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62   struct plink *b
2cc0: 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c  plp;      /* Fol
2cd0: 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64  low-set backward
2ce0: 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  s propagation li
2cf0: 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nks */.  struct 
2d00: 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20  state *stp;     
2d10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2d20: 73 74 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74  state which cont
2d30: 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65  ains this */.  e
2d40: 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20 73 74  num cfgstatus st
2d50: 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65 64 20  atus;   /* used 
2d60: 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73 65 74  during followset
2d70: 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d 70 75   and shift compu
2d80: 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  tations */.  str
2d90: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
2da0: 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f  ;     /* Next co
2db0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
2dc0: 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74  he state */.  st
2dd0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b  ruct config *bp;
2de0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2df0: 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  xt basis configu
2e00: 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 65 6e  ration */.};..en
2e10: 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  um e_action {.  
2e20: 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50 54 2c  SHIFT,.  ACCEPT,
2e30: 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45 52 52  .  REDUCE,.  ERR
2e40: 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49 43 54  OR,.  SSCONFLICT
2e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e60: 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66 74 20  * A shift/shift 
2e70: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 52  conflict */.  SR
2e80: 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20  CONFLICT,       
2e90: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2ea0: 72 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74  reduce, but part
2eb0: 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a   of a conflict *
2ec0: 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54 2c 20  /.  RRCONFLICT, 
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
2ef0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
2f00: 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52 45 53  lict */.  SH_RES
2f10: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2f20: 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68 69 66     /* Was a shif
2f30: 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  t.  Precedence r
2f40: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
2f50: 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c 56 45   */.  RD_RESOLVE
2f60: 44 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  D,             /
2f70: 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20 20 50  * Was reduce.  P
2f80: 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76  recedence resolv
2f90: 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ed conflict */. 
2fa0: 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20 20 20   NOT_USED,      
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2fc0: 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73  eted by compress
2fd0: 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54 52 45  ion */.  SHIFTRE
2fe0: 44 55 43 45 20 20 20 20 20 20 20 20 20 20 20 20  DUCE            
2ff0: 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72 73 74    /* Shift first
3000: 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20 2a 2f  , then reduce */
3010: 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68  .};../* Every sh
3020: 69 66 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70  ift or reduce op
3030: 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65  eration is store
3040: 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  d as one of the 
3050: 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72  following */.str
3060: 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73  uct action {.  s
3070: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
3080: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
3090: 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c  ook-ahead symbol
30a0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74   */.  enum e_act
30b0: 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f  ion type;.  unio
30c0: 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  n {.    struct s
30d0: 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f  tate *stp;     /
30e0: 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c  * The new state,
30f0: 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20   if a shift */. 
3100: 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
3110: 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rp;       /* The
3120: 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75   rule, if a redu
3130: 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73  ce */.  } x;.  s
3140: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
3150: 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49 46 54  Opt;    /* SHIFT
3160: 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a 61 74  REDUCE optimizat
3170: 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79 6d 62  ion to this symb
3180: 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  ol */.  struct a
3190: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
31a0: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
31b0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
31c0: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
31d0: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
31e0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
31f0: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
3200: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
3210: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
3220: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
3230: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
3240: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
3250: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
3260: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3270: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
3280: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
3290: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
32a0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
32b0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
32c0: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
32d0: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
32e0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
32f0: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
3300: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
3310: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  set */.  int sta
3320: 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
3330: 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c 20    /* Sequential 
3340: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
3350: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3360: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
3370: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3380: 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ctions for this 
3390: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  state */.  int n
33a0: 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20  TknAct, nNtAct; 
33b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33c0: 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d   actions on term
33d0: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
33e0: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  minals */.  int 
33f0: 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73  iTknOfst, iNtOfs
3400: 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f  t;   /* yy_actio
3410: 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72 20 74  n[] offset for t
3420: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
3430: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69  terms */.  int i
3440: 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20 20 20  DfltReduce;     
3450: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61      /* Default a
3460: 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45 44 55  ction is to REDU
3470: 43 45 20 62 79 20 74 68 69 73 20 72 75 6c 65 20  CE by this rule 
3480: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
3490: 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b 2f 2a   *pDfltReduce;/*
34a0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 52 45 44   The default RED
34b0: 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20 20 69  UCE rule. */.  i
34c0: 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b 20 20  nt autoReduce;  
34d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34e0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  if this is an au
34f0: 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74 65 20  to-reduce state 
3500: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f  */.};.#define NO
3510: 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37 34 38  _OFFSET (-214748
3520: 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c  3647)../* A foll
3530: 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  owset propagatio
3540: 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74 65 73  n link indicates
3550: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
3560: 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e  ts of one.** con
3570: 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f  figuration follo
3580: 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65 20 70  wset should be p
3590: 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61 6e 6f  ropagated to ano
35a0: 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a  ther whenever.**
35b0: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e 67   the first chang
35c0: 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c  es. */.struct pl
35d0: 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ink {.  struct c
35e0: 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20  onfig *cfp;     
35f0: 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72   /* The configur
3600: 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c  ation to which l
3610: 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  inked */.  struc
3620: 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20  t plink *next;  
3630: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
3640: 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a  propagate link *
3650: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61  /.};../* The sta
3660: 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20 74 68  te vector for th
3670: 65 20 65 6e 74 69 72 65 20 70 61 72 73 65 72 20  e entire parser 
3680: 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72 65 63  generator is rec
3690: 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c  orded as.** foll
36a0: 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65  ows.  (LEMON use
36b0: 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69  s no global vari
36c0: 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65 73 20  ables and makes 
36d0: 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a  little use of.**
36e0: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
36f0: 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20 74 68  s.  Fields in th
3700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3710: 63 74 75 72 65 20 63 61 6e 20 62 65 20 74 68 6f  cture can be tho
3720: 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65  ught.** of as be
3730: 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  gin global varia
3740: 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72 6f 67  bles in the prog
3750: 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20  ram.) */.struct 
3760: 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  lemon {.  struct
3770: 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b   state **sorted;
3780: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73     /* Table of s
3790: 74 61 74 65 73 20 73 6f 72 74 65 64 20 62 79 20  tates sorted by 
37a0: 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  state number */.
37b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
37c0: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
37d0: 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20  st of all rules 
37e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
37f0: 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20 2f 2a   *startRule;  /*
3800: 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f 0a 20   First rule */. 
3810: 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20   int nstate;    
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3830: 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f  ber of states */
3840: 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65 3b 20  .  int nxstate; 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
3860: 73 74 61 74 65 20 77 69 74 68 20 74 61 69 6c 20  state with tail 
3870: 64 65 67 65 6e 65 72 61 74 65 20 73 74 61 74 65  degenerate state
3880: 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 69  s removed */.  i
3890: 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20  nt nrule;       
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38b0: 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20  r of rules */.  
38c0: 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20  int nsymbol;    
38d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38e0: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61  er of terminal a
38f0: 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73  nd nonterminal s
3900: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3910: 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20  nterminal;      
3920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3930: 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  f terminal symbo
3940: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 53  ls */.  int minS
3950: 68 69 66 74 52 65 64 75 63 65 3b 20 20 20 20 20  hiftReduce;     
3960: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68 69 66   /* Minimum shif
3970: 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  t-reduce action 
3980: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65  value */.  int e
3990: 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrAction;       
39a0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61 63 74      /* Error act
39b0: 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ion value */.  i
39c0: 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20 20 20  nt accAction;   
39d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 70          /* Accep
39e0: 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a  t action value *
39f0: 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69 6f 6e  /.  int noAction
3a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a10: 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76 61 6c  No-op action val
3a20: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 52  ue */.  int minR
3a30: 65 64 75 63 65 3b 20 20 20 20 20 20 20 20 20 20  educe;          
3a40: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 64 75   /* Minimum redu
3a50: 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ce action */.  i
3a60: 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20 20 20  nt maxAction;   
3a70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3a80: 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75 65 20  um action value 
3a90: 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f 0a 20  of any kind */. 
3aa0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3ab0: 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72  *symbols; /* Sor
3ac0: 74 65 64 20 61 72 72 61 79 20 6f 66 20 70 6f 69  ted array of poi
3ad0: 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f 6c 73  nters to symbols
3ae0: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63   */.  int errorc
3af0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
3b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
3b10: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  rs */.  struct s
3b20: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
3b30: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
3b40: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3b50: 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63 61 72   symbol *wildcar
3b60: 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74  d; /* Token that
3b70: 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e   matches anythin
3b80: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d  g */.  char *nam
3b90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3ba0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67  /* Name of the g
3bb0: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
3bc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20  */.  char *arg; 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3be0: 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20   Declaration of 
3bf0: 74 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74  the 3th argument
3c00: 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20   to parser */.  
3c10: 63 68 61 72 20 2a 63 74 78 3b 20 20 20 20 20 20  char *ctx;      
3c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c           /* Decl
3c30: 61 72 61 74 69 6f 6e 20 6f 66 20 32 6e 64 20 61  aration of 2nd a
3c40: 72 67 75 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  rgument to const
3c50: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
3c60: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
3c70: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
3c80: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
3c90: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
3ca0: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
3cb0: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
3cc0: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
3cd0: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
3ce0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
3cf0: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d10: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
3d20: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
3d30: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
3d40: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
3d50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3d60: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
3d70: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
3d80: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
3d90: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
3da0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
3db0: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
3dc0: 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20  char *error;    
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
3de0: 20 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e   to execute when
3df0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
3e00: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65  n */.  char *ove
3e10: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
3e20: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3e30: 74 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76  te on a stack ov
3e40: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72  erflow */.  char
3e50: 20 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20   *failure;      
3e60: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3e70: 65 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65  execute on parse
3e80: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63  r failure */.  c
3e90: 68 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20  har *accept;    
3ea0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3eb0: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
3ec0: 74 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70  the parser excep
3ed0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  ts */.  char *ex
3ee0: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
3ef0: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
3f00: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
3f10: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ed file */.  cha
3f20: 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20  r *tokendest;   
3f30: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3f40: 20 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74   execute to dest
3f50: 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a  roy token data *
3f60: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73  /.  char *vardes
3f70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
3f80: 43 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66  Code for the def
3f90: 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ault non-termina
3fa0: 6c 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a  l destructor */.
3fb0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
3fc0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
3fd0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
3fe0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3ff0: 6f 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  outname;        
4000: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4010: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
4020: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
4030: 2a 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20  *tokenprefix;   
4040: 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20      /* A prefix 
4050: 61 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e  added to token n
4060: 61 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66  ames in the .h f
4070: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f  ile */.  int nco
4080: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
4090: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
40a0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f   */.  int nactio
40c0: 6e 74 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f  ntab;          /
40d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
40e0: 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
40f0: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a  tion[] table */.
4100: 20 20 69 6e 74 20 6e 6c 6f 6f 6b 61 68 65 61 64    int nlookahead
4110: 74 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  tab;       /* Nu
4120: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4130: 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  in yy_lookahead[
4140: 5d 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65  ] */.  int table
4150: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
4160: 2f 2a 20 54 6f 74 61 6c 20 74 61 62 6c 65 20 73  /* Total table s
4170: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ize of all table
4180: 73 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  s in bytes */.  
4190: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20  int basisflag;  
41a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e           /* Prin
41b0: 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e  t only basis con
41c0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
41d0: 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63   int has_fallbac
41e0: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  k;        /* Tru
41f0: 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61  e if any %fallba
4200: 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68  ck is seen in th
4210: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 69  e grammar */.  i
4220: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
4230: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
4240: 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65  if #line stateme
4250: 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  nts should not b
4260: 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 63  e printed */.  c
4270: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
4280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4290: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a  of the program *
42a0: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65  /.};..#define Me
42b0: 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28  moryCheck(X) if(
42c0: 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74  (X)==0){ \.  ext
42d0: 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
42e0: 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d  error(); \.  mem
42f0: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d  ory_error(); \.}
4300: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4310: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
4320: 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a  e "table.h" ****
4330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
4350: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
4360: 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
4370: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
4380: 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
4390: 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
43a0: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
43b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
43c0: 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
43d0: 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
43e0: 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
43f0: 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
4400: 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
4410: 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
4420: 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
4430: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
4440: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
4450: 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
4460: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
4470: 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
4480: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
4490: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
44a0: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
44b0: 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69   handling a stri
44c0: 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68  ngs */..const ch
44d0: 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
44e0: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69 64  t char *);..void
44f0: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f   Strsafe_init(vo
4500: 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65  id);.int Strsafe
4510: 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68  _insert(const ch
4520: 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61  ar *);.const cha
4530: 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
4540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
4550: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  /* Routines for 
4560: 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73  handling symbols
4570: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
4580: 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  */..struct symbo
4590: 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f  l *Symbol_new(co
45a0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74  nst char *);.int
45b0: 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73   Symbolcmpp(cons
45c0: 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20  t void *, const 
45d0: 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53 79  void *);.void Sy
45e0: 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 3b  mbol_init(void);
45f0: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
4600: 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
4610: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
4620: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4630: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f   *Symbol_find(co
4640: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
4650: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
4660: 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e 74  ol_Nth(int);.int
4670: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f   Symbol_count(vo
4680: 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  id);.struct symb
4690: 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
46a0: 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52  yof(void);../* R
46b0: 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67  outines to manag
46c0: 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  e the state tabl
46d0: 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67  e */..int Config
46e0: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
46f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
4700: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
4710: 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tate_new(void);.
4720: 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
4730: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61 74 65  void);.int State
4740: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
4750: 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63  tate *, struct c
4760: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
4770: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
4780: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
4790: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
47a0: 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
47b0: 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75  f(void);../* Rou
47c0: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 65  tines used for e
47d0: 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e  fficiency in Con
47e0: 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a  figlist_add */..
47f0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
4800: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4810: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
4820: 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
4830: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *);.struct con
4840: 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
4850: 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
4860: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
4870: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69  figtable_clear(i
4880: 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e  nt(*)(struct con
4890: 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  fig *));../*****
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
48b0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
48c0: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
48f0: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
4900: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
4910: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
4920: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
4930: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
4940: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
4950: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
4960: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
4970: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20  ion_new(void){. 
4980: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61   static struct a
4990: 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20  ction *freelist 
49a0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63  = 0;.  struct ac
49b0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
49c0: 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ..  if( freelist
49d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
49e0: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
49f0: 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  100;.    freelis
4a00: 74 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  t = (struct acti
4a10: 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c  on *)calloc(amt,
4a20: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61   sizeof(struct a
4a30: 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28  ction));.    if(
4a40: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
4a50: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
4a60: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
4a70: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
4a80: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
4a90: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
4aa0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
4ab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4ac0: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
4ad0: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
4ae0: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
4af0: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
4b00: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
4b10: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66  .  newaction = f
4b20: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
4b30: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
4b40: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
4b50: 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20  ewaction;.}../* 
4b60: 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69  Compare two acti
4b70: 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ons for sorting 
4b80: 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72  purposes.  Retur
4b90: 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
4ba0: 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65  , or.** positive
4bb0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 63   if the first ac
4bc0: 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61  tion is less tha
4bd0: 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
4be0: 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
4bf0: 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61  the first.*/.sta
4c00: 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d  tic int actioncm
4c10: 70 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p(.  struct acti
4c20: 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63  on *ap1,.  struc
4c30: 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b  t action *ap2.){
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
4c50: 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78  = ap1->sp->index
4c60: 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65   - ap2->sp->inde
4c70: 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  x;.  if( rc==0 )
4c80: 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29  {.    rc = (int)
4c90: 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74  ap1->type - (int
4ca0: 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a  )ap2->type;.  }.
4cb0: 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 28    if( rc==0 && (
4cc0: 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  ap1->type==REDUC
4cd0: 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d  E || ap1->type==
4ce0: 53 48 49 46 54 52 45 44 55 43 45 29 20 29 7b 0a  SHIFTREDUCE) ){.
4cf0: 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e      rc = ap1->x.
4d00: 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  rp->index - ap2-
4d10: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  >x.rp->index;.  
4d20: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
4d30: 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 20  .    rc = (int) 
4d40: 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20 7d  (ap2 - ap1);.  }
4d50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4d60: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
4d70: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
4d80: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
4d90: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
4da0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
4db0: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
4dc0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
4dd0: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
4de0: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
4df0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
4e20: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
4e30: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
4e40: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
4e50: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
4e60: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
4e70: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
4e80: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
4e90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
4ea0: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
4eb0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4ec0: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4ed0: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
4ee0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
4ef0: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
4f00: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
4f10: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
4f20: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
4f30: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
4f40: 20 73 70 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e   sp;.  newaction
4f50: 2d 3e 73 70 4f 70 74 20 3d 20 30 3b 0a 20 20 69  ->spOpt = 0;.  i
4f60: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
4f70: 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d  {.    newaction-
4f80: 3e 78 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74  >x.stp = (struct
4f90: 20 73 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20   state *)arg;.  
4fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63  }else{.    newac
4fb0: 74 69 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74  tion->x.rp = (st
4fc0: 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b  ruct rule *)arg;
4fd0: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
4ff0: 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  ew code to imple
5000: 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74 61 62  ment the "acttab
5010: 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a  " module *******
5020: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ****/./*.** This
5030: 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
5040: 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20  ts routines use 
5050: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5060: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
5070: 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  le..*/../*.** Th
5080: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 79  e state of the y
5090: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75  y_action table u
50a0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
50b0: 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  n is an instance
50c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   of.** the follo
50d0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
50e0: 2a 2a 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74  **.** The yy_act
50f0: 69 6f 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74  ion table maps t
5100: 68 65 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e  he pair (state_n
5110: 75 6d 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64  umber, lookahead
5120: 29 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74  ) into an.** act
5130: 69 6f 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65  ion_number.  The
5140: 20 74 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72   table is an arr
5150: 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70  ay of integers p
5160: 61 69 72 73 2e 20 20 54 68 65 20 73 74 61 74 65  airs.  The state
5170: 5f 6e 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72  _number.** deter
5180: 6d 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  mines an initial
5190: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
51a0: 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79   yy_action array
51b0: 2e 20 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64  .  The lookahead
51c0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65  .** value is the
51d0: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 69 73 20  n added to this 
51e0: 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74  initial offset t
51f0: 6f 20 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58  o get an index X
5200: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f   into the.** yy_
5210: 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66  action array. If
5220: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e   the aAction[X].
5230: 6c 6f 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73  lookahead equals
5240: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5250: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b  e.** of the look
5260: 61 68 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65  ahead input, the
5270: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
5280: 68 65 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  he action_number
5290: 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41   output is.** aA
52a0: 63 74 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e  ction[X].action.
52b0: 20 20 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65    If the lookahe
52c0: 61 64 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  ads do not match
52d0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66   then the.** def
52e0: 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
52f0: 74 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  the state_number
5300: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
5310: 0a 2a 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20  .** All actions 
5320: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5330: 61 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e  a single state_n
5340: 75 6d 62 65 72 20 61 72 65 20 66 69 72 73 74 20  umber are first 
5350: 65 6e 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20  entered.** into 
5360: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69  aLookahead[] usi
5370: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  ng multiple call
5380: 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69  s to acttab_acti
5390: 6f 6e 28 29 2e 20 20 54 68 65 6e 20 74 68 65 0a  on().  Then the.
53a0: 2a 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  ** actions for t
53b0: 68 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65  hat single state
53c0: 5f 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63  _number are plac
53d0: 65 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74  ed into the aAct
53e0: 69 6f 6e 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  ion[].** array w
53f0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
5400: 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65  l to acttab_inse
5410: 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61  rt().  The actta
5420: 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a  b_insert() call.
5430: 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74  ** also resets t
5440: 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  he aLookahead[] 
5450: 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61  array in prepara
5460: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78  tion for the nex
5470: 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65  t.** state numbe
5480: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f  r..*/.struct loo
5490: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a  kahead_action {.
54a0: 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b    int lookahead;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54c0: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
54d0: 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a  kahead token */.
54e0: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5500: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
5510: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
5520: 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  ahead */.};.type
5530: 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61  def struct actta
5540: 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74  b acttab;.struct
5550: 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20   acttab {.  int 
5560: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
5570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5580: 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73  er of used slots
5590: 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f   in aAction[] */
55a0: 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c  .  int nActionAl
55b0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
55c0: 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  /* Slots allocat
55d0: 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d  ed for aAction[]
55e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f   */.  struct loo
55f0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20  kahead_action.  
5600: 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20    *aAction,     
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5620: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  The yy_action[] 
5630: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5640: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
5650: 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  *aLookahead;    
5660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
5670: 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73  single new trans
5680: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
5690: 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  int mnLookahead;
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56b0: 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Minimum aLookahe
56c0: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
56d0: 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e  /.  int mnAction
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63   /* Action assoc
5700: 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f  iated with mnLoo
5710: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5720: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  mxLookahead;    
5730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
5740: 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  mum aLookahead[]
5750: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  .lookahead */.  
5760: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  int nLookahead; 
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5780: 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c  Used slots in aL
5790: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20  ookahead[] */.  
57a0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  int nLookaheadAl
57b0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
57c0: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
57d0: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
57e0: 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d 69 6e  */.  int ntermin
57f0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
5800: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
5810: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
5820: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
5830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5840: 20 20 2f 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65    /* total numbe
5850: 72 20 6f 66 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  r of symbols */.
5860: 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  };../* Return th
5870: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5880: 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
5890: 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64  tion table */.#d
58a0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 6c 6f 6f  efine acttab_loo
58b0: 6b 61 68 65 61 64 5f 73 69 7a 65 28 58 29 20 28  kahead_size(X) (
58c0: 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f  (X)->nAction)../
58d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * The value for 
58e0: 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69  the N-th entry i
58f0: 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23  n yy_action */.#
5900: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79  define acttab_yy
5910: 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58  action(X,N)  ((X
5920: 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63  )->aAction[N].ac
5930: 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61  tion)../* The va
5940: 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  lue for the N-th
5950: 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f   entry in yy_loo
5960: 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e  kahead */.#defin
5970: 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  e acttab_yylooka
5980: 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d  head(X,N)  ((X)-
5990: 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b  >aAction[N].look
59a0: 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20  ahead)../* Free 
59b0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
59c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
59d0: 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76  iven acttab */.v
59e0: 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65 28  oid acttab_free(
59f0: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72  acttab *p){.  fr
5a00: 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29  ee( p->aAction )
5a10: 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f  ;.  free( p->aLo
5a20: 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65  okahead );.  fre
5a30: 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c  e( p );.}../* Al
5a40: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63 74  locate a new act
5a50: 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f  tab structure */
5a60: 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f  .acttab *acttab_
5a70: 61 6c 6c 6f 63 28 69 6e 74 20 6e 73 79 6d 62 6f  alloc(int nsymbo
5a80: 6c 2c 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c  l, int nterminal
5a90: 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d  ){.  acttab *p =
5aa0: 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c 6c   (acttab *) call
5ab0: 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70  oc( 1, sizeof(*p
5ac0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
5ad0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
5ae0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
5af0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
5b00: 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61   for a new actta
5b10: 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  b.");.    exit(1
5b20: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
5b30: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
5b40: 29 3b 0a 20 20 70 2d 3e 6e 73 79 6d 62 6f 6c 20  );.  p->nsymbol 
5b50: 3d 20 6e 73 79 6d 62 6f 6c 3b 0a 20 20 70 2d 3e  = nsymbol;.  p->
5b60: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 6e 74 65 72  nterminal = nter
5b70: 6d 69 6e 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  minal;.  return 
5b80: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  p;.}../* Add a n
5b90: 65 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ew action to the
5ba0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
5bb0: 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  tion set..**.** 
5bc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5bd0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
5be0: 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66  each lookahead f
5bf0: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a  or a particular.
5c00: 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  ** state..*/.voi
5c10: 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  d acttab_action(
5c20: 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c  acttab *p, int l
5c30: 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63  ookahead, int ac
5c40: 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  tion){.  if( p->
5c50: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e  nLookahead>=p->n
5c60: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
5c70: 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  {.    p->nLookah
5c80: 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a  eadAlloc += 25;.
5c90: 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61      p->aLookahea
5ca0: 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  d = (struct look
5cb0: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
5cc0: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f  realloc( p->aLoo
5cd0: 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20  kahead,.        
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61       sizeof(p->a
5d00: 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d  Lookahead[0])*p-
5d10: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
5d20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   );.    if( p->a
5d30: 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a  Lookahead==0 ){.
5d40: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
5d50: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
5d60: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
5d70: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
5d80: 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  }.  if( p->nLook
5d90: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
5da0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
5db0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5dc0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
5dd0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5de0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5df0: 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
5e00: 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b     if( p->mxLook
5e10: 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20  ahead<lookahead 
5e20: 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ) p->mxLookahead
5e30: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
5e40: 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61    if( p->mnLooka
5e50: 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29  head>lookahead )
5e60: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  {.      p->mnLoo
5e70: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5e80: 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41  ad;.      p->mnA
5e90: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5ea0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61      }.  }.  p->a
5eb0: 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f  Lookahead[p->nLo
5ec0: 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65  okahead].lookahe
5ed0: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
5ee0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5ef0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61  p->nLookahead].a
5f00: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5f10: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b    p->nLookahead+
5f20: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  +;.}../*.** Add 
5f30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5f40: 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74  set built up wit
5f50: 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  h prior calls to
5f60: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
5f70: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72  .** into the cur
5f80: 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  rent action tabl
5f90: 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74  e.  Then reset t
5fa0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5fb0: 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e  et back.** to an
5fc0: 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72   empty set in pr
5fd0: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20  eparation for a 
5fe0: 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74  new round of act
5ff0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c  tab_action() cal
6000: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ls..**.** Return
6010: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
6020: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
6030: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61  e of the new tra
6040: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
6050: 49 66 20 74 68 65 20 6d 61 6b 65 49 74 53 61 66  If the makeItSaf
6060: 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
6070: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 66  rue, then the of
6080: 66 73 65 74 20 69 73 20 63 68 6f 73 65 6e 20 73  fset is chosen s
6090: 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 73 20  o that.** it is 
60a0: 69 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 76  impossible to ov
60b0: 65 72 72 65 61 64 20 74 68 65 20 79 79 5f 6c 6f  erread the yy_lo
60c0: 6f 6b 61 73 69 64 65 5b 5d 20 74 61 62 6c 65 20  okaside[] table 
60d0: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
60e0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 74   the lookaside t
60f0: 6f 6b 65 6e 2e 20 20 54 68 69 73 20 69 73 20 64  oken.  This is d
6100: 6f 6e 65 20 66 6f 72 20 74 68 65 20 74 65 72 6d  one for the term
6110: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2c 20 61 73  inal symbols, as
6120: 20 74 68 65 79 0a 2a 2a 20 63 6f 6d 65 20 66 72   they.** come fr
6130: 6f 6d 20 65 78 74 65 72 6e 61 6c 20 69 6e 70 75  om external inpu
6140: 74 73 20 61 6e 64 20 63 61 6e 20 63 6f 6e 74 61  ts and can conta
6150: 69 6e 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  in syntax errors
6160: 2e 20 20 57 68 65 6e 20 6d 61 6b 65 49 74 53 61  .  When makeItSa
6170: 66 65 0a 2a 2a 20 69 73 20 66 61 6c 73 65 2c 20  fe.** is false, 
6180: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 66 6c  there is more fl
6190: 65 78 69 62 69 6c 69 74 79 20 69 6e 20 73 65 6c  exibility in sel
61a0: 65 63 74 69 6e 67 20 6f 66 66 73 65 74 73 2c 20  ecting offsets, 
61b0: 72 65 73 75 6c 74 69 6e 67 20 69 6e 0a 2a 2a 20  resulting in.** 
61c0: 61 20 73 6d 61 6c 6c 65 72 20 74 61 62 6c 65 2e  a smaller table.
61d0: 20 20 46 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e    For non-termin
61e0: 61 6c 20 73 79 6d 62 6f 6c 73 2c 20 77 68 69 63  al symbols, whic
61f0: 68 20 61 72 65 20 6e 65 76 65 72 20 73 79 6e 74  h are never synt
6200: 61 78 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 6d 61  ax errors,.** ma
6210: 6b 65 49 74 53 61 66 65 20 63 61 6e 20 62 65 20  keItSafe can be 
6220: 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 61 63  false..*/.int ac
6230: 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74  ttab_insert(actt
6240: 61 62 20 2a 70 2c 20 69 6e 74 20 6d 61 6b 65 49  ab *p, int makeI
6250: 74 53 61 66 65 29 7b 0a 20 20 69 6e 74 20 69 2c  tSafe){.  int i,
6260: 20 6a 2c 20 6b 2c 20 6e 2c 20 65 6e 64 3b 0a 20   j, k, n, end;. 
6270: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f   assert( p->nLoo
6280: 6b 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f  kahead>0 );..  /
6290: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
62a0: 61 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ave enough space
62b0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70   to hold the exp
62c0: 61 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62  anded action tab
62d0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77  le.  ** in the w
62e0: 6f 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20  orst case.  The 
62f0: 77 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72  worst case occur
6300: 73 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  s if the transac
6310: 74 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75  tion set.  ** mu
6320: 73 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  st be appended t
6330: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63  o the current ac
6340: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  tion table.  */.
6350: 20 20 6e 20 3d 20 70 2d 3e 6e 73 79 6d 62 6f 6c    n = p->nsymbol
6360: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   + 1;.  if( p->n
6370: 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d  Action + n >= p-
6380: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b  >nActionAlloc ){
6390: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f  .    int oldAllo
63a0: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  c = p->nActionAl
63b0: 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74  loc;.    p->nAct
63c0: 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ionAlloc = p->nA
63d0: 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e  ction + n + p->n
63e0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30  ActionAlloc + 20
63f0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
6400: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
6410: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
6420: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69  ealloc( p->aActi
6430: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6450: 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b  zeof(p->aAction[
6460: 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  0])*p->nActionAl
6470: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
6480: 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  >aAction==0 ){. 
6490: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
64a0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
64b0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
64c0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
64d0: 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b   for(i=oldAlloc;
64e0: 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   i<p->nActionAll
64f0: 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  oc; i++){.      
6500: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
6510: 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20  okahead = -1;.  
6520: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
6530: 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20  ].action = -1;. 
6540: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
6550: 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67  can the existing
6560: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f   action table lo
6570: 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66  oking for an off
6580: 73 65 74 20 74 68 61 74 20 69 73 20 61 0a 20 20  set that is a.  
6590: 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20  ** duplicate of 
65a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
65b0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61  saction set.  Fa
65c0: 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ll out of the lo
65d0: 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77  op.  ** if and w
65e0: 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74  hen the duplicat
65f0: 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a  e is found..  **
6600: 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69  .  ** i is the i
6610: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69  ndex in p->aActi
6620: 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e  on[] where p->mn
6630: 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73  Lookahead is ins
6640: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6e  erted..  */.  en
6650: 64 20 3d 20 6d 61 6b 65 49 74 53 61 66 65 20 3f  d = makeItSafe ?
6660: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6670: 3a 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  : 0;.  for(i=p->
6680: 6e 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 65 6e  nAction-1; i>=en
6690: 64 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  d; i--){.    if(
66a0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
66b0: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
66c0: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
66d0: 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65    /* All lookahe
66e0: 61 64 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 20  ads and actions 
66f0: 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61  in the aLookahea
6700: 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  d[] transaction.
6710: 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61        ** must ma
6720: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
6730: 63 61 6e 64 69 64 61 74 65 20 61 41 63 74 69 6f  candidate aActio
6740: 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  n[i] entry. */. 
6750: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
6760: 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70  ion[i].action!=p
6770: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e  ->mnAction ) con
6780: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
6790: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
67a0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
67b0: 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f       k = p->aLoo
67c0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
67d0: 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ead - p->mnLooka
67e0: 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20  head + i;.      
67f0: 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d    if( k<0 || k>=
6800: 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65  p->nAction ) bre
6810: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
6820: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6830: 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61  .lookahead!=p->a
6840: 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68  Action[k].lookah
6850: 65 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ead ) break;.   
6860: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
6870: 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e  kahead[j].action
6880: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6890: 61 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a  action ) break;.
68a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
68b0: 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ( j<p->nLookahea
68c0: 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  d ) continue;.. 
68d0: 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69       /* No possi
68e0: 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61  ble lookahead va
68f0: 6c 75 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lue that is not 
6900: 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61  in the aLookahea
6910: 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  d[].      ** tra
6920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f  nsaction is allo
6930: 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 41 63  wed to match aAc
6940: 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20  tion[i] */.     
6950: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
6960: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
6970: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
6980: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6990: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[j].lookahead<0
69a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
69b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
69c0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
69d0: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
69e0: 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ad-i ) n++;.    
69f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d    }.      if( n=
6a00: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
6a10: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
6a20: 20 20 2f 2a 20 41 6e 20 65 78 61 63 74 20 6d 61    /* An exact ma
6a30: 74 63 68 20 69 73 20 66 6f 75 6e 64 20 61 74 20  tch is found at 
6a40: 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20 20 20 20  offset i */.    
6a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6a60: 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69 73 74 69   /* If no existi
6a70: 6e 67 20 6f 66 66 73 65 74 73 20 65 78 61 63 74  ng offsets exact
6a80: 6c 79 20 6d 61 74 63 68 20 74 68 65 20 63 75 72  ly match the cur
6a90: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6aa0: 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61  , find an.  ** a
6ab0: 6e 20 65 6d 70 74 79 20 6f 66 66 73 65 74 20 69  n empty offset i
6ac0: 6e 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  n the aAction[] 
6ad0: 74 61 62 6c 65 20 69 6e 20 77 68 69 63 68 20 77  table in which w
6ae0: 65 20 63 61 6e 20 61 64 64 20 74 68 65 0a 20 20  e can add the.  
6af0: 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  ** aLookahead[] 
6b00: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
6b10: 2f 0a 20 20 69 66 28 20 69 3c 65 6e 64 20 29 7b  /.  if( i<end ){
6b20: 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
6b30: 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61 41   holes in the aA
6b40: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74 68  ction[] table th
6b50: 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72 65  at fit the curre
6b60: 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b 61  nt.    ** aLooka
6b70: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
6b80: 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65 74  on.  Leave i set
6b90: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f   to the offset o
6ba0: 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20 20  f the hole..    
6bb0: 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20 61  ** If no holes a
6bc0: 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20 6c  re found, i is l
6bd0: 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69 6f  eft at p->nActio
6be0: 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  n, which means t
6bf0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
6c00: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 70  ction will be ap
6c10: 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 69  pended. */.    i
6c20: 20 3d 20 6d 61 6b 65 49 74 53 61 66 65 20 3f 20   = makeItSafe ? 
6c30: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3a  p->mnLookahead :
6c40: 20 30 3b 0a 20 20 20 20 66 6f 72 28 3b 20 69 3c   0;.    for(; i<
6c50: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
6c60: 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  - p->mxLookahead
6c70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6c80: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
6c90: 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20  lookahead<0 ){. 
6ca0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6cb0: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
6cc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6cd0: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
6ce0: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
6cf0: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
6d00: 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   + i;.          
6d10: 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b  if( k<0 ) break;
6d20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6d30: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
6d40: 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61  kahead>=0 ) brea
6d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d60: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
6d70: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
6d80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
6d90: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69  (j=0; j<p->nActi
6da0: 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  on; j++){.      
6db0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6dc0: 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[j].lookahead=
6dd0: 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  =j+p->mnLookahea
6de0: 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  d-i ) break;.   
6df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6e00: 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e  f( j==p->nAction
6e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
6e20: 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e  eak;  /* Fits in
6e30: 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a   empty slots */.
6e40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
6e60: 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74   Insert transact
6e70: 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78  ion set at index
6e80: 20 69 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70   i. */.#if 0.  p
6e90: 72 69 6e 74 66 28 22 41 63 74 74 61 62 3a 22 29  rintf("Acttab:")
6ea0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
6eb0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
6ec0: 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  +){.    printf("
6ed0: 20 25 64 22 2c 20 70 2d 3e 61 4c 6f 6f 6b 61 68   %d", p->aLookah
6ee0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6ef0: 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  );.  }.  printf(
6f00: 22 20 69 6e 73 65 72 74 65 64 20 61 74 20 25 64  " inserted at %d
6f10: 5c 6e 22 2c 20 69 29 3b 0a 23 65 6e 64 69 66 0a  \n", i);.#endif.
6f20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
6f30: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
6f40: 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f  {.    k = p->aLo
6f50: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
6f60: 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  head - p->mnLook
6f70: 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 70  ahead + i;.    p
6f80: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70  ->aAction[k] = p
6f90: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b  ->aLookahead[j];
6fa0: 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e  .    if( k>=p->n
6fb0: 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74  Action ) p->nAct
6fc0: 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20  ion = k+1;.  }. 
6fd0: 20 69 66 28 20 6d 61 6b 65 49 74 53 61 66 65 20   if( makeItSafe 
6fe0: 26 26 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61  && i+p->ntermina
6ff0: 6c 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  l>=p->nAction ) 
7000: 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 69 2b 70  p->nAction = i+p
7010: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b 31 3b 0a 20  ->nterminal+1;. 
7020: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->nLookahead =
7030: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e   0;..  /* Return
7040: 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61 74   the offset that
7050: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
7060: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f 72   lookahead in or
7070: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a 20  der to get the. 
7080: 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 79   ** index into y
7090: 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  y_action of the 
70a0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75  action */.  retu
70b0: 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  rn i - p->mnLook
70c0: 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ahead;.}../*.** 
70d0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
70e0: 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  of the action ta
70f0: 62 6c 65 20 77 69 74 68 6f 75 74 20 74 68 65 20  ble without the 
7100: 74 72 61 69 6c 69 6e 67 20 73 79 6e 74 61 78 20  trailing syntax 
7110: 65 72 72 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73  error.** entries
7120: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
7130: 61 63 74 69 6f 6e 5f 73 69 7a 65 28 61 63 74 74  action_size(actt
7140: 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 20  ab *p){.  int n 
7150: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20  = p->nAction;.  
7160: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 70 2d  while( n>0 && p-
7170: 3e 61 41 63 74 69 6f 6e 5b 6e 2d 31 5d 2e 6c 6f  >aAction[n-1].lo
7180: 6f 6b 61 68 65 61 64 3c 30 20 29 7b 20 6e 2d 2d  okahead<0 ){ n--
7190: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ; }.  return n;.
71a0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
71c0: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
71d0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71f0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
7200: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   to construction
7210: 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74   the finite stat
7220: 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
7230: 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65  e LEMON.** parse
7240: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
7250: 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65  ./* Find a prece
7260: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20  dence symbol of 
7270: 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68  every rule in th
7280: 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 0a 2a 2a  e grammar..**.**
7290: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
72a0: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
72b0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
72c0: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
72d0: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
72e0: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
72f0: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
7300: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
7310: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
7320: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
7330: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
7340: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
7350: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
7360: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
7370: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
7380: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
7390: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
73a0: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
73b0: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
73c0: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
73d0: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
73e0: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
73f0: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
7400: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
7410: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
7420: 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp).{.  struct r
7430: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
7440: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
7450: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
7460: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
7470: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
7480: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
7490: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
74a0: 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d  s && rp->precsym
74b0: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ==0; i++){.     
74c0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
74d0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
74e0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
74f0: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
7500: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7510: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
7520: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
7530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
7540: 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ( sp->subsym[j]-
7550: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
7560: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
7570: 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73  ecsym = sp->subs
7580: 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  ym[j];.         
7590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
75c0: 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63  lse if( sp->prec
75d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
75e0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
75f0: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
7600: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7610: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
7620: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
7630: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
7640: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
7650: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
7660: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
7670: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
7680: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
7690: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
76a0: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
76b0: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
76c0: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
76d0: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
76e0: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
76f0: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
7700: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
7710: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
7720: 69 72 73 74 53 65 74 73 28 73 74 72 75 63 74 20  irstSets(struct 
7730: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
7740: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
7750: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
7760: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
7770: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
7780: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
7790: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
77a0: 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20  ls[i]->lambda = 
77b0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d  LEMON_FALSE;.  }
77c0: 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e  .  for(i=lemp->n
77d0: 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70  terminal; i<lemp
77e0: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
77f0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
7800: 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20  ls[i]->firstset 
7810: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a  = SetNew();.  }.
7820: 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70  .  /* First comp
7830: 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20  ute all lambdas 
7840: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f  */.  do{.    pro
7850: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
7860: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
7870: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
7880: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
7890: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20  ->lhs->lambda ) 
78a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
78b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
78c0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
78d0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
78e0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
78f0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
7900: 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  t( sp->type==NON
7910: 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
7920: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
7930: 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69  LSE );.        i
7940: 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( sp->lambda==L
7950: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
7960: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7970: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
7980: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
7990: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
79a0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
79b0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
79c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
79d0: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
79e0: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
79f0: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
7a00: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
7a10: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
7a20: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
7a30: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
7a40: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
7a50: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
7a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
7a70: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
7a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
7a90: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
7aa0: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
7ab0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
7ac0: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
7ad0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
7ae0: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
7af0: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
7b00: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
7b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7b30: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
7b40: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7b50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
7b60: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
7b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
7b80: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
7b90: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7ba0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
7bb0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
7bc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7bd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
7be0: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
7bf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
7c00: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
7c10: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LSE ) break;.   
7c20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7c30: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7c40: 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66  = SetUnion(s1->f
7c50: 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73  irstset,s2->firs
7c60: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
7c70: 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d   if( s2->lambda=
7c80: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
7c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7cb0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7cc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   );.  return;.}.
7cd0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
7ce0: 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72  LR(0) states for
7cf0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c   the grammar.  L
7d00: 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65  inks.** are adde
7d10: 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d  d to between som
7d20: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
7d30: 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f   the LR(1) follo
7d40: 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65  w sets.** can be
7d50: 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e   computed later.
7d60: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75  .*/.PRIVATE stru
7d70: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
7d80: 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  te(struct lemon 
7d90: 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  *);  /* forward 
7da0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
7db0: 64 20 46 69 6e 64 53 74 61 74 65 73 28 73 74 72  d FindStates(str
7dc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
7dd0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
7de0: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
7df0: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f   rule *rp;..  Co
7e00: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b  nfiglist_init();
7e10: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
7e20: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
7e30: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
7e40: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
7e50: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
7e60: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
7e70: 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  sp==0 ){.      E
7e80: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
7e90: 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73  lename,0,."The s
7ea0: 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73  pecified start s
7eb0: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20  ymbol \"%s\" is 
7ec0: 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65  not \.in a nonte
7ed0: 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72  rminal of the gr
7ee0: 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77  ammar.  \"%s\" w
7ef0: 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74  ill be used as t
7f00: 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f  he start \.symbo
7f10: 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70  l instead.",lemp
7f20: 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 73 74  ->start,lemp->st
7f30: 61 72 74 52 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61  artRule->lhs->na
7f40: 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
7f50: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
7f60: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74     sp = lemp->st
7f70: 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  artRule->lhs;.  
7f80: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
7f90: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
7fa0: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  tRule->lhs;.  }.
7fb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7fc0: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
7fd0: 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f   doesn't occur o
7fe0: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
7ff0: 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e   side of.  ** an
8000: 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20  y rule.  Report 
8010: 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64  an error if it d
8020: 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c  oes.  (YACC woul
8030: 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77  d generate a new
8040: 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62  .  ** start symb
8050: 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ol in this case.
8060: 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  ) */.  for(rp=le
8070: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8080: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8090: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
80a0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
80b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
80c0: 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29  rp->rhs[i]==sp )
80d0: 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20  {   /* FIX ME:  
80e0: 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74  Deal with multit
80f0: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20  erminals */.    
8100: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
8110: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
8120: 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  The start symbol
8130: 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f   \"%s\" occurs o
8140: 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61  n the \.right-ha
8150: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c  nd side of a rul
8160: 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73  e. This will res
8170: 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20  ult in a parser 
8180: 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74  which \.does not
8190: 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22   work properly."
81a0: 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
81b0: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
81c0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
81d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
81e0: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
81f0: 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68  ation set for th
8200: 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20  e first state.  
8210: 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20  ** is all rules 
8220: 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73  which have the s
8230: 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74  tart symbol as t
8240: 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68  heir.  ** left-h
8250: 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f  and side */.  fo
8260: 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72  r(rp=sp->rule; r
8270: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68  p; rp=rp->nextlh
8280: 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63  s){.    struct c
8290: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20  onfig *newcfp;. 
82a0: 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20     rp->lhsStart 
82b0: 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20  = 1;.    newcfp 
82c0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
82d0: 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20  basis(rp,0);.   
82e0: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
82f0: 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  fws,0);.  }..  /
8300: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69  * Compute the fi
8310: 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20  rst state.  All 
8320: 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c  other states wil
8330: 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  l be.  ** comput
8340: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
8350: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70   during the comp
8360: 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  utation of the f
8370: 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54  irst one..  ** T
8380: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
8390: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
83a0: 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73   state is not us
83b0: 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ed. */.  (void)g
83c0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20  etstate(lemp);. 
83d0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
83e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
83f0: 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68  to a state which
8400: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
8410: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8420: 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68  on.** list which
8430: 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20   has been built 
8440: 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f  from calls to Co
8450: 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f  nfiglist_add..*/
8460: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75  .PRIVATE void bu
8470: 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74  ildshifts(struct
8480: 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74   lemon *, struct
8490: 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f   state *); /* Fo
84a0: 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41  rwd ref */.PRIVA
84b0: 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20  TE struct state 
84c0: 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74  *getstate(struct
84d0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
84e0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
84f0: 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72  *cfp, *bp;.  str
8500: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
8510: 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68  .  /* Extract th
8520: 65 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f  e sorted basis o
8530: 66 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e  f the new state.
8540: 20 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20    The basis was 
8550: 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
8560: 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20   by prior calls 
8570: 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61  to "Configlist_a
8580: 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20  ddbasis()". */. 
8590: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
85a0: 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20  basis();.  bp = 
85b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
85c0: 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  ();..  /* Get a 
85d0: 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73  state with the s
85e0: 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73  ame basis */.  s
85f0: 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28  tp = State_find(
8600: 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29  bp);.  if( stp )
8610: 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65  {.    /* A state
8620: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62   with the same b
8630: 61 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69  asis already exi
8640: 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74  sts!  Copy all t
8650: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20  he follow-set.  
8660: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e    ** propagation
8670: 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20   links from the 
8680: 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73  state under cons
8690: 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  truction into th
86a0: 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73  e.    ** preexis
86b0: 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e  ting state, then
86c0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
86d0: 72 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73  r to the preexis
86e0: 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20  ting state */.  
86f0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8700: 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28  *x, *y;.    for(
8710: 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b  x=bp, y=stp->bp;
8720: 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70   x && y; x=x->bp
8730: 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20  , y=y->bp){.    
8740: 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d    Plink_copy(&y-
8750: 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a  >bplp,x->bplp);.
8760: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65        Plink_dele
8770: 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20  te(x->fplp);.   
8780: 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e     x->fplp = x->
8790: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  bplp = 0;.    }.
87a0: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
87b0: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20  list_return();. 
87c0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61     Configlist_ea
87d0: 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  t(cfp);.  }else{
87e0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61  .    /* This rea
87f0: 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61  lly is a new sta
8800: 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61  te.  Construct a
8810: 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a  ll the details *
8820: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
8830: 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20  _closure(lemp); 
8840: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
8850: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8860: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43  closure */.    C
8870: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29  onfiglist_sort()
8880: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
8890: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
88a0: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
88b0: 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  .    cfp = Confi
88c0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20  glist_return(); 
88d0: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
88e0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  er to the config
88f0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70   list */.    stp
8900: 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20   = State_new(); 
8910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
8920: 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75  ew state structu
8930: 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79  re */.    Memory
8940: 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20  Check(stp);.    
8950: 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20  stp->bp = bp;   
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8970: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e  Remember the con
8980: 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73  figuration basis
8990: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70   */.    stp->cfp
89a0: 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20   = cfp;         
89b0: 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72       /* Remember
89c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
89d0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
89e0: 20 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20    stp->statenum 
89f0: 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b  = lemp->nstate++
8a00: 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65  ; /* Every state
8a10: 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65   gets a sequence
8a20: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73   number */.    s
8a30: 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20  tp->ap = 0;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8a50: 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20  o actions, yet. 
8a60: 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73  */.    State_ins
8a70: 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29  ert(stp,stp->bp)
8a80: 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  ;   /* Add to th
8a90: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
8aa0: 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73  .    buildshifts
8ab0: 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20  (lemp,stp);     
8ac0: 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
8ad0: 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   compute success
8ae0: 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d  or states */.  }
8af0: 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d  .  return stp;.}
8b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8b10: 72 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f  rue if two symbo
8b20: 6c 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ls are the same.
8b30: 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d  .*/.int same_sym
8b40: 62 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f  bol(struct symbo
8b50: 6c 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d  l *a, struct sym
8b60: 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20  bol *b).{.  int 
8b70: 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  i;.  if( a==b ) 
8b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
8b90: 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  a->type!=MULTITE
8ba0: 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20  RMINAL ) return 
8bb0: 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65  0;.  if( b->type
8bc0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
8bd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
8be0: 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d  ( a->nsubsym!=b-
8bf0: 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72  >nsubsym ) retur
8c00: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
8c10: 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  i<a->nsubsym; i+
8c20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73  +){.    if( a->s
8c30: 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62  ubsym[i]!=b->sub
8c40: 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  sym[i] ) return 
8c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8c60: 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  1;.}../* Constru
8c70: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
8c80: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
8c90: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
8ca0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
8cb0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
8cc0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
8cd0: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
8ce0: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
8cf0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
8d00: 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  ifts(struct lemo
8d10: 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20  n *lemp, struct 
8d20: 73 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20  state *stp).{.  
8d30: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
8d40: 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  fp;  /* For loop
8d50: 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e  ing thru the con
8d60: 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22  fig closure of "
8d70: 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  stp" */.  struct
8d80: 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f   config *bcfp; /
8d90: 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20  * For the inner 
8da0: 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63  loop on config c
8db0: 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20  losure of "stp" 
8dc0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
8dd0: 69 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20  ig *newcfg;  /* 
8de0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
8df0: 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d  ol *sp;   /* Sym
8e00: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
8e10: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
8e20: 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a  ration "cfp" */.
8e30: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
8e40: 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c  *bsp;  /* Symbol
8e50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
8e60: 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74  ot in configurat
8e70: 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20  ion "bcfp" */.  
8e80: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
8e90: 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74  wstp; /* A point
8ea0: 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  er to a successo
8eb0: 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
8ec0: 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74   Each configurat
8ed0: 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70  ion becomes comp
8ee0: 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f  lete after it co
8ef0: 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75  ntibutes to a su
8f00: 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61  ccessor.  ** sta
8f10: 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20  te.  Initially, 
8f20: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8f30: 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74  ns are incomplet
8f40: 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73  e */.  for(cfp=s
8f50: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
8f60: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70  p=cfp->next) cfp
8f70: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
8f80: 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  PLETE;..  /* Loo
8f90: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
8fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20  nfigurations of 
8fb0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8fc0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
8fd0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8fe0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8ff0: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
9000: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
9010: 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65  inue;    /* Alre
9020: 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65  ady used by inne
9030: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66  r loop */.    if
9040: 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d  ( cfp->dot>=cfp-
9050: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
9060: 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20  inue;  /* Can't 
9070: 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69  shift this confi
9080: 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  g */.    Configl
9090: 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20  ist_reset();    
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e    /* Reset the n
90c0: 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f  ew config set */
90d0: 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72  .    sp = cfp->r
90e0: 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d  p->rhs[cfp->dot]
90f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9100: 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68   Symbol after th
9110: 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e dot */..    /*
9120: 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69   For every confi
9130: 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  guration in the 
9140: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
9150: 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c  h has the symbol
9160: 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c   "sp".    ** fol
9170: 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20  lowing its dot, 
9180: 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  add the same con
9190: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68  figuration to th
91a0: 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65  e basis set unde
91b0: 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  r.    ** constru
91c0: 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74  ction but with t
91d0: 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f  he dot shifted o
91e0: 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65  ne symbol to the
91f0: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66   right. */.    f
9200: 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66  or(bcfp=cfp; bcf
9210: 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65  p; bcfp=bcfp->ne
9220: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  xt){.      if( b
9230: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
9240: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
9250: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
9260: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  used */.      if
9270: 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66  ( bcfp->dot>=bcf
9280: 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  p->rp->nrhs ) co
9290: 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74  ntinue; /* Can't
92a0: 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20   shift this one 
92b0: 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62  */.      bsp = b
92c0: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66  cfp->rp->rhs[bcf
92d0: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
92e0: 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c     /* Get symbol
92f0: 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20   after dot */.  
9300: 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79      if( !same_sy
9310: 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63  mbol(bsp,sp) ) c
9320: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a  ontinue;      /*
9330: 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73   Must be same as
9340: 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20   for "cfp" */.  
9350: 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73      bcfp->status
9360: 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20   = COMPLETE;    
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9380: 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69   Mark this confi
9390: 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20  g as used */.   
93a0: 20 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66     newcfg = Conf
93b0: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
93c0: 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64  bcfp->rp,bcfp->d
93d0: 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69  ot+1);.      Pli
93e0: 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e  nk_add(&newcfg->
93f0: 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20  bplp,bcfp);.    
9400: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20  }..    /* Get a 
9410: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
9420: 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62  tate described b
9430: 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66  y the basis conf
9440: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20  iguration set.  
9450: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64    ** constructed
9460: 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e   in the precedin
9470: 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65  g loop */.    ne
9480: 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28  wstp = getstate(
9490: 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  lemp);..    /* T
94a0: 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70  he state "newstp
94b0: 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f  " is reached fro
94c0: 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  m the state "stp
94d0: 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  " by a shift act
94e0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ion.    ** on th
94f0: 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f  e symbol "sp" */
9500: 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
9510: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
9520: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
9530: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9540: 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69  i<sp->nsubsym; i
9550: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74  ++){.        Act
9560: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
9570: 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79  ,SHIFT,sp->subsy
9580: 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73  m[i],(char*)news
9590: 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tp);.      }.   
95a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63   }else{.      Ac
95b0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
95c0: 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72  p,SHIFT,sp,(char
95d0: 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20   *)newstp);.    
95e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
95f0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72 6f  onstruct the pro
9600: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
9610: 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73  /.void FindLinks
9620: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
9630: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
9640: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
9650: 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20  *cfp, *other;.  
9660: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
9670: 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  p;.  struct plin
9680: 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f  k *plp;..  /* Ho
9690: 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69  usekeeping detai
96a0: 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65  l:.  ** Add to e
96b0: 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c  very propagate l
96c0: 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61  ink a pointer ba
96d0: 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ck to the state 
96e0: 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68  to.  ** which th
96f0: 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68  e link is attach
9700: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ed. */.  for(i=0
9710: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
9720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
9730: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
9740: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
9750: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
9760: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
9770: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73      cfp->stp = s
9780: 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  tp;.    }.  }.. 
9790: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20   /* Convert all 
97a0: 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66  backlinks into f
97b0: 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f  orward links.  O
97c0: 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a  nly the forward.
97d0: 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75    ** links are u
97e0: 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  sed in the follo
97f0: 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f  w-set computatio
9800: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
9810: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9820: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
9830: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
9840: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
9850: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
9860: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
9870: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
9880: 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  bplp; plp; plp=p
9890: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
98a0: 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e     other = plp->
98b0: 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69  cfp;.        Pli
98c0: 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66  nk_add(&other->f
98d0: 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  plp,cfp);.      
98e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
98f0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f  * Compute all fo
9900: 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20  llowsets..**.** 
9910: 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74  A followset is t
9920: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79  he set of all sy
9930: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
9940: 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  come immediately
9950: 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66  .** after a conf
9960: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  iguration..*/.vo
9970: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
9980: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
9990: 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
99a0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
99b0: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
99c0: 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e  plink *plp;.  in
99d0: 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e  t progress;.  in
99e0: 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72  t change;..  for
99f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9a00: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
9a10: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
9a20: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
9a30: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9a40: 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74  ){.      cfp->st
9a50: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
9a60: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
9a70: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
9a80: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
9a90: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9aa0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
9ab0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
9ac0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
9ad0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9ae0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
9af0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
9b00: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
9b10: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
9b20: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
9b30: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
9b40: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
9b50: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
9b60: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
9b70: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
9b80: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
9b90: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
9ba0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
9bb0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
9bc0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
9bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9bf0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
9c00: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  MPLETE;.      }.
9c10: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9c20: 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73  progress );.}..s
9c30: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
9c40: 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63  e_conflict(struc
9c50: 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63  t action *,struc
9c60: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
9c70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64   Compute the red
9c80: 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64  uce actions, and
9c90: 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   resolve conflic
9ca0: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  ts..*/.void Find
9cb0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
9cc0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
9cd0: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
9ce0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
9cf0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
9d00: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
9d10: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
9d20: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
9d30: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
9d40: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 0a   reduce actions.
9d50: 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63    ** A reduce ac
9d60: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f  tion is added fo
9d70: 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  r each element o
9d80: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20  f the followset 
9d90: 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67  of.  ** a config
9da0: 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61  uration which ha
9db0: 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65  s its dot at the
9dc0: 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a   extreme right..
9dd0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
9de0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
9df0: 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20  i++){   /* Loop 
9e00: 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
9e10: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
9e20: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
9e30: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
9e40: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
9e50: 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f  ->next){  /* Loo
9e60: 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69  p over all confi
9e70: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  gurations */.   
9e80: 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e     if( cfp->rp->
9e90: 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  nrhs==cfp->dot )
9ea0: 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64  {        /* Is d
9eb0: 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69  ot at extreme ri
9ec0: 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght? */.        
9ed0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d  for(j=0; j<lemp-
9ee0: 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29  >nterminal; j++)
9ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9f00: 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73  SetFind(cfp->fws
9f10: 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,j) ){.         
9f20: 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75     /* Add a redu
9f30: 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ce action to the
9f40: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
9f50: 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62  ch will reduce b
9f60: 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  y the.          
9f70: 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e    ** rule "cfp->
9f80: 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61  rp" if the looka
9f90: 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22  head symbol is "
9fa0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
9fb0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  " */.           
9fc0: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
9fd0: 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70  ->ap,REDUCE,lemp
9fe0: 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68  ->symbols[j],(ch
9ff0: 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20  ar *)cfp->rp);. 
a000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a020: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64   }.  }..  /* Add
a030: 20 74 68 65 20 61 63 63 65 70 74 69 6e 67 20 74   the accepting t
a040: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65  oken */.  if( le
a050: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
a060: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
a070: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
a080: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 20      if( sp==0 ) 
a090: 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74  sp = lemp->start
a0a0: 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c  Rule->lhs;.  }el
a0b0: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
a0c0: 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68  p->startRule->lh
a0d0: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
a0e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
a0f0: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
a100: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
a110: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
a120: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
a130: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
a140: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
a150: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
a160: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
a170: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
a180: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
a190: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
a1a0: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
a1b0: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
a1c0: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
a1d0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
a1e0: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
a1f0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a200: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
a210: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
a220: 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  [i];.    /* asse
a230: 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a  rt( stp->ap ); *
a240: 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  /.    stp->ap = 
a250: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
a260: 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  >ap);.    for(ap
a270: 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20  =stp->ap; ap && 
a280: 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d  ap->next; ap=ap-
a290: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f  >next){.      fo
a2a0: 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20  r(nap=ap->next; 
a2b0: 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d  nap && nap->sp==
a2c0: 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d  ap->sp; nap=nap-
a2d0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
a2e0: 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69   /* The two acti
a2f0: 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61  ons "ap" and "na
a300: 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  p" have the same
a310: 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
a320: 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f       ** Figure o
a330: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f  ut which one sho
a340: 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20  uld be used */. 
a350: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63          lemp->nc
a360: 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c  onflict += resol
a370: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e  ve_conflict(ap,n
a380: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
a390: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
a3a0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ort an error for
a3b0: 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20   each rule that 
a3c0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64  can never be red
a3d0: 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72  uced. */.  for(r
a3e0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
a3f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72  ; rp=rp->next) r
a400: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
a410: 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f  EMON_FALSE;.  fo
a420: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
a430: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
a440: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a450: 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c  ap;.    for(ap=l
a460: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
a470: 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
a480: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
a490: 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
a4a0: 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e   ) ap->x.rp->can
a4b0: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54  Reduce = LEMON_T
a4c0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
a4d0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
a4e0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
a4f0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
a500: 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f  ->canReduce ) co
a510: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f  ntinue;.    Erro
a520: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
a530: 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
a540: 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20  ,"This rule can 
a550: 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c  not be reduced.\
a560: 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  n");.    lemp->e
a570: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d  rrorcnt++;.  }.}
a580: 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63  ../* Resolve a c
a590: 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20  onflict between 
a5a0: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63  the two given ac
a5b0: 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a  tions.  If the.*
a5c0: 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74  * conflict can't
a5d0: 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72 65   be resolved, re
a5e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
a5f0: 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54  *.** NO LONGER T
a600: 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73  RUE:.**   To res
a610: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c  olve a conflict,
a620: 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73   first look to s
a630: 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63 74  ee if either act
a640: 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61  ion.**   is on a
a650: 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49  n error rule.  I
a660: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61 6b  n that case, tak
a670: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68 69  e the action whi
a680: 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  ch.**   is not a
a690: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
a6a0: 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  he error rule.  
a6b0: 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62 6f  If neither or bo
a6c0: 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20  th.**   actions 
a6d0: 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  are associated w
a6e0: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75 6c  ith an error rul
a6f0: 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a  e, then try to.*
a700: 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65 6e  *   use preceden
a710: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ce to resolve th
a720: 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a  e conflict..**.*
a730: 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74 69  * If either acti
a740: 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20 74  on is a SHIFT, t
a750: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 61  hen it must be a
a760: 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e  px.  This.** fun
a770: 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b  ction won't work
a780: 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52   if apx->type==R
a790: 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e 74  EDUCE and apy->t
a7a0: 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73  ype==SHIFT..*/.s
a7b0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
a7c0: 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73 74  e_conflict(.  st
a7d0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78  ruct action *apx
a7e0: 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ,.  struct actio
a7f0: 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72 75  n *apy.){.  stru
a800: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20  ct symbol *spx, 
a810: 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63  *spy;.  int errc
a820: 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  nt = 0;.  assert
a830: 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e  ( apx->sp==apy->
a840: 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  sp );  /* Otherw
a850: 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ise there would 
a860: 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a  be no conflict *
a870: 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  /.  if( apx->typ
a880: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
a890: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a  >type==SHIFT ){.
a8a0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a8b0: 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SSCONFLICT;.    
a8c0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  errcnt++;.  }.  
a8d0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
a8e0: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
a8f0: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
a900: 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a   spx = apx->sp;.
a910: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
a920: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
a930: 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20    if( spy==0 || 
a940: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spx->prec<0 || s
a950: 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20  py->prec<0 ){.  
a960: 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67      /* Not enoug
a970: 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66  h precedence inf
a980: 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ormation. */.   
a990: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
a9a0: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
a9b0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
a9c0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
a9d0: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
a9e0: 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72 65     /* higher pre
a9f0: 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a  cedence wins */.
aa00: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
aa10: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
aa20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
aa30: 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63  ->prec<spy->prec
aa40: 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ){.      apx->t
aa50: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
aa60: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
aa70: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
aa80: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
aa90: 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a  soc==RIGHT ){ /*
aaa0: 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   Use operator */
aab0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
aac0: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20   = RD_RESOLVED; 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
aaf0: 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a  ssociativity */.
ab00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
ab10: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
ab20: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
ab30: 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f  ==LEFT ){  /* to
ab40: 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20   break tie */.  
ab50: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
ab60: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
ab70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
ab80: 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d  sert( spx->prec=
ab90: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
aba0: 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29  x->assoc==NONE )
abb0: 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  ;.      apx->typ
abc0: 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20 20 7d  e = ERROR;.    }
abd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
abe0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
abf0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
ac00: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
ac10: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
ac20: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
ac30: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
ac40: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
ac50: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
ac60: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
ac70: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
ac80: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
ac90: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
aca0: 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e  py->type = RRCON
acb0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
acc0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
acd0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
ace0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
acf0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
ad00: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
ad10: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
ad20: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
ad30: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
ad40: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
ad50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ad60: 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
ad70: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
ad80: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
ad90: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
ada0: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
adb0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apx->type==SSCON
adc0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
add0: 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  px->type==SRCONF
ade0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
adf0: 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  x->type==RRCONFL
ae00: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
ae10: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
ae20: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
ae30: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
ae40: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
ae50: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
ae60: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
ae70: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
ae80: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
ae90: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
aea0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
aeb0: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
aec0: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
aed0: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
aee0: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
aef0: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
af00: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
af10: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
af20: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
af30: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
af40: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
af50: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
af60: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
af70: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
af80: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
af90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
afa0: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
afb0: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
afc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
afd0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
afe0: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
aff0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
b000: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
b010: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
b020: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
b030: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
b040: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
b050: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
b060: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
b070: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
b080: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
b090: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
b0a0: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
b0b0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
b0c0: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
b0d0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
b0e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
b0f0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
b100: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
b110: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
b120: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
b130: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
b140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
b150: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
b160: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
b170: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
b180: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
b190: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
b1a0: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
b1b0: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
b1c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b1d0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
b1e0: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
b1f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
b200: 77 63 6f 6e 66 69 67 28 76 6f 69 64 29 7b 0a 20  wconfig(void){. 
b210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b220: 6e 65 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72  newcfg;.  if( fr
b230: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
b240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b250: 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65  amt = 3;.    fre
b260: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
b270: 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28  config *)calloc(
b280: 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72   amt, sizeof(str
b290: 75 63 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20  uct config) );. 
b2a0: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
b2b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
b2c0: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
b2d0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
b2e0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
b2f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29  configuration.")
b300: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
b310: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
b320: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
b330: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
b340: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
b350: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
b360: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
b370: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20  0;.  }.  newcfg 
b380: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
b390: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
b3a0: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
b3b0: 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20  n newcfg;.}../* 
b3c0: 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  The configuratio
b3d0: 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f  n "old" is no lo
b3e0: 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49  nger used */.PRI
b3f0: 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65  VATE void delete
b400: 63 6f 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f  config(struct co
b410: 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f  nfig *old).{.  o
b420: 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c  ld->next = freel
b430: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
b440: 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  = old;.}../* Ini
b450: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
b460: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b470: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
b480: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
b490: 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74  void){.  current
b4a0: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
b4b0: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
b4c0: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
b4d0: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
b4e0: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  .  Configtable_i
b4f0: 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b  nit();.  return;
b500: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
b510: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
b520: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
b530: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
b540: 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64 29  list_reset(void)
b550: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
b560: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
b570: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
b580: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
b590: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
b5a0: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
b5b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
b5c0: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
b5d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
b5e0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
b5f0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
b600: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
b610: 6c 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75  list_add(.  stru
b620: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20  ct rule *rp,    
b630: 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20  /* The rule */. 
b640: 20 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20   int dot        
b650: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
b660: 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  to the RHS of th
b670: 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65  e rule where the
b680: 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a   dot goes */.){.
b690: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
b6a0: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
b6b0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
b6c0: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
b6d0: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
b6e0: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
b6f0: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
b700: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
b710: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
b720: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
b730: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
b740: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
b750: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
b760: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
b770: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
b780: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
b790: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
b7a0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
b7b0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
b7c0: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
b7d0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
b7e0: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
b7f0: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
b800: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
b810: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
b820: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
b830: 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63  /* Add a basis c
b840: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
b850: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b860: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
b870: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b880: 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72  ist_addbasis(str
b890: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e  uct rule *rp, in
b8a0: 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63  t dot).{.  struc
b8b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d  t config *cfp, m
b8c0: 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  odel;..  assert(
b8d0: 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a   basisend!=0 );.
b8e0: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
b8f0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
b900: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
b910: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
b920: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
b930: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
b940: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
b950: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
b960: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
b970: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
b980: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
b990: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
b9a0: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
b9b0: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
b9c0: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
b9d0: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
b9e0: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
b9f0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
ba00: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
ba10: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
ba20: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
ba30: 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20      *basisend = 
ba40: 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e  cfp;.    basisen
ba50: 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20  d = &cfp->bp;.  
ba60: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
ba70: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
ba80: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
ba90: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
baa0: 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f  losure of the co
bab0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
bac0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
bad0: 69 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75  ist_closure(stru
bae0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
baf0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
bb00: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
bb10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
bb20: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
bb30: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
bb40: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
bb50: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
bb60: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
bb70: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
bb80: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
bb90: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
bba0: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
bbb0: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
bbc0: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
bbd0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
bbe0: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
bbf0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
bc00: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
bc10: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
bc20: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
bc30: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
bc40: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
bc50: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
bc60: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
bc70: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
bc80: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
bc90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
bca0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
bcb0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
bcc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bcd0: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
bce0: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
bcf0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
bd00: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
bd10: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
bd20: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
bd30: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
bd40: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
bd50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
bd60: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
bd70: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
bd80: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
bd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
bda0: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
bdb0: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
bde0: 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65  se if( xsp->type
bdf0: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
be00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
be10: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
be20: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70    for(k=0; k<xsp
be30: 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
be40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
be50: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
be60: 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b  s, xsp->subsym[k
be70: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
be80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bea0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
beb0: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
bec0: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
bed0: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
bee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
bef0: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
bf00: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
bf10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bf20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
bf30: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
bf40: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
bf50: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
bf60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bf70: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
bf80: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
bf90: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
bfa0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
bfb0: 6f 72 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72  ort(void){.  cur
bfc0: 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63  rent = (struct c
bfd0: 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68  onfig*)msort((ch
bfe0: 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61  ar*)current,(cha
bff0: 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e  r**)&(current->n
c000: 65 78 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ext),.          
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d          Configcm
c030: 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64  p);.  currentend
c040: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
c050: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62  }../* Sort the b
c060: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
c070: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
c080: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
c090: 61 73 69 73 28 76 6f 69 64 29 7b 0a 20 20 62 61  asis(void){.  ba
c0a0: 73 69 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f  sis = (struct co
c0b0: 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61  nfig*)msort((cha
c0c0: 72 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72  r*)current,(char
c0d0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
c0e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20     Configcmp);. 
c110: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
c120: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
c130: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c140: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
c150: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
c160: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
c170: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
c180: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
c190: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
c1a0: 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20  void){.  struct 
c1b0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
c1c0: 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20  ld = current;.  
c1d0: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
c1e0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
c1f0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
c200: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
c210: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
c220: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
c230: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
c240: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
c250: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
c260: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73   *Configlist_bas
c270: 69 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 72 75  is(void){.  stru
c280: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
c290: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
c2a0: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
c2b0: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
c2c0: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
c2d0: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
c2e0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
c2f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
c300: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
c310: 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20  list_eat(struct 
c320: 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
c330: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
c340: 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b  nextcfp;.  for(;
c350: 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66   cfp; cfp=nextcf
c360: 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20  p){.    nextcfp 
c370: 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = cfp->next;.   
c380: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70   assert( cfp->fp
c390: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  lp==0 );.    ass
c3a0: 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d  ert( cfp->bplp==
c3b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70  0 );.    if( cfp
c3c0: 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28  ->fws ) SetFree(
c3d0: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64  cfp->fws);.    d
c3e0: 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29  eleteconfig(cfp)
c3f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
c400: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c410: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
c420: 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a  le "error.c" ***
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
c450: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
c460: 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65  rinting error me
c470: 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20  ssage..*/..void 
c480: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
c490: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69  har *filename, i
c4a0: 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
c4b0: 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e   char *format, .
c4c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
c4d0: 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  p;.  fprintf(std
c4e0: 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20  err, "%s:%d: ", 
c4f0: 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f  filename, lineno
c500: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
c510: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70  , format);.  vfp
c520: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f 72  rintf(stderr,for
c530: 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mat,ap);.  va_en
c540: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
c550: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
c560: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c570: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c580: 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a  e "main.c" *****
c590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c5b0: 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67  ./*.** Main prog
c5c0: 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ram file for the
c5d0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
c5e0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
c5f0: 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66  Report an out-of
c600: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
c610: 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68  n and abort.  Th
c620: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
c630: 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79  s used mostly by
c640: 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63   the "MemoryChec
c650: 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75  k" macro in stru
c660: 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ct.h.*/.void mem
c670: 6f 72 79 5f 65 72 72 6f 72 28 76 6f 69 64 29 7b  ory_error(void){
c680: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
c690: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
c6a0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
c6b0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
c6c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
c6d0: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
c6e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
c6f0: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
c700: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
c710: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
c720: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
c730: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
c740: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
c750: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c760: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
c770: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
c780: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
c790: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
c7a0: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
c7b0: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
c7c0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
c7d0: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
c7e0: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
c7f0: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
c800: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
c810: 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72  ne = (char **) r
c820: 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c  ealloc(azDefine,
c830: 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65   sizeof(azDefine
c840: 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20  [0])*nDefine);. 
c850: 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30   if( azDefine==0
c860: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
c870: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
c880: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
c890: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61  xit(1);.  }.  pa
c8a0: 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44  z = &azDefine[nD
c8b0: 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a  efine-1];.  *paz
c8c0: 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
c8d0: 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
c8e0: 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70  z)+1 );.  if( *p
c8f0: 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  az==0 ){.    fpr
c900: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74  intf(stderr,"out
c910: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
c920: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
c930: 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
c940: 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28  *paz, z);.  for(
c950: 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a  z=*paz; *z && *z
c960: 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20  !='='; z++){}.  
c970: 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  *z = 0;.}../* Re
c980: 6d 62 65 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  mber the name of
c990: 20 74 68 65 20 6f 75 74 70 75 74 20 64 69 72 65   the output dire
c9a0: 63 74 6f 72 79 20 0a 2a 2f 0a 73 74 61 74 69 63  ctory .*/.static
c9b0: 20 63 68 61 72 20 2a 6f 75 74 70 75 74 44 69 72   char *outputDir
c9c0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
c9d0: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 64 5f 6f 70  void handle_d_op
c9e0: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
c9f0: 20 6f 75 74 70 75 74 44 69 72 20 3d 20 28 63 68   outputDir = (ch
ca00: 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
ca10: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29  monStrlen(z)+1 )
ca20: 3b 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69  ;.  if( outputDi
ca30: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  r==0 ){.    fpri
ca40: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
ca50: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
ca60: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
ca70: 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6f    lemon_strcpy(o
ca80: 75 74 70 75 74 44 69 72 2c 20 7a 29 3b 0a 7d 0a  utputDir, z);.}.
ca90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73  .static char *us
caa0: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
cab0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
cac0: 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  oid handle_T_opt
cad0: 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ion(char *z){.  
cae0: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
caf0: 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  e = (char *) mal
cb00: 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
cb10: 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75  (z)+1 );.  if( u
cb20: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
cb30: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72  ==0 ){.    memor
cb40: 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
cb50: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73   lemon_strcpy(us
cb60: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
cb70: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65   z);.}../* Merge
cb80: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73   together to lis
cb90: 74 73 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65  ts of rules orde
cba0: 72 65 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c  red by rule.iRul
cbb0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e */.static stru
cbc0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65  ct rule *Rule_me
cbd0: 72 67 65 28 73 74 72 75 63 74 20 72 75 6c 65 20  rge(struct rule 
cbe0: 2a 70 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *pA, struct rule
cbf0: 20 2a 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20   *pB){.  struct 
cc00: 72 75 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30  rule *pFirst = 0
cc10: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
cc20: 2a 2a 70 70 50 72 65 76 20 3d 20 26 70 46 69 72  **ppPrev = &pFir
cc30: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  st;.  while( pA 
cc40: 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
cc50: 20 70 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69   pA->iRule<pB->i
cc60: 52 75 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Rule ){.      *p
cc70: 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20  pPrev = pA;.    
cc80: 20 20 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e    ppPrev = &pA->
cc90: 6e 65 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d  next;.      pA =
cca0: 20 70 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d   pA->next;.    }
ccb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
ccc0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rev = pB;.      
ccd0: 70 70 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65  ppPrev = &pB->ne
cce0: 78 74 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  xt;.      pB = p
ccf0: 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  B->next;.    }. 
cd00: 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
cd10: 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b     *ppPrev = pA;
cd20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
cd30: 70 50 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a  pPrev = pB;.  }.
cd40: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
cd50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
cd60: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69   list of rules i
cd70: 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65  n order of incre
cd80: 61 73 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75  asing iRule valu
cd90: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e.*/.static stru
cda0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f  ct rule *Rule_so
cdb0: 72 74 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  rt(struct rule *
cdc0: 72 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rp){.  int i;.  
cdd0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65  struct rule *pNe
cde0: 78 74 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  xt;.  struct rul
cdf0: 65 20 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73  e *x[32];.  mems
ce00: 65 74 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(x, 0, sizeof(
ce10: 78 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70  x));.  while( rp
ce20: 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20   ){.    pNext = 
ce30: 72 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70  rp->next;.    rp
ce40: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
ce50: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
ce60: 66 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d  f(x)/sizeof(x[0]
ce70: 29 20 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b  ) && x[i]; i++){
ce80: 0a 20 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65  .      rp = Rule
ce90: 5f 6d 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29  _merge(x[i], rp)
cea0: 3b 0a 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30  ;.      x[i] = 0
ceb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d  ;.    }.    x[i]
cec0: 20 3d 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20   = rp;.    rp = 
ced0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20  pNext;.  }.  rp 
cee0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
cef0: 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65  i<sizeof(x)/size
cf00: 6f 66 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  of(x[0]); i++){.
cf10: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
cf20: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
cf30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a   }.  return rp;.
cf40: 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  }../* forward re
cf50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
cf60: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
cf70: 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
cf80: 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
cf90: 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a  , int *pnByte);.
cfa0: 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
cfb0: 6c 65 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22  le line of the "
cfc0: 50 61 72 73 65 72 20 53 74 61 74 73 22 20 6f 75  Parser Stats" ou
cfd0: 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tput.*/.static v
cfe0: 6f 69 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63  oid stats_line(c
cff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
d000: 6c 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a  l, int iValue){.
d010: 20 20 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c    int nLabel = l
d020: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65  emonStrlen(zLabe
d030: 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  l);.  printf("  
d040: 25 73 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a  %s%.*s %5d\n", z
d050: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
d060: 33 35 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e  35-nLabel, "....
d070: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
d080: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20  ............",. 
d090: 20 20 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b          iValue);
d0a0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20  .}../* The main 
d0b0: 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20  program.  Parse 
d0c0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
d0d0: 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f   and do it... */
d0e0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
d0f0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
d100: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
d110: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
d120: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
d130: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
d140: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
d150: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
d160: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
d170: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
d180: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
d190: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
d1a0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
d1b0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
d1c0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
d1d0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
d1e0: 74 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74  tic int noResort
d1f0: 20 3d 20 30 3b 0a 20 20 0a 20 20 73 74 61 74 69   = 0;.  .  stati
d200: 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  c struct s_optio
d210: 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b  ns options[] = {
d220: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
d230: 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73  "b", (char*)&bas
d240: 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f  isflag, "Print o
d250: 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20 69 6e  nly the basis in
d260: 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20   report."},.    
d270: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20  {OPT_FLAG, "c", 
d280: 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73  (char*)&compress
d290: 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73  , "Don't compres
d2a0: 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  s the action tab
d2b0: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
d2c0: 46 53 54 52 2c 20 22 64 22 2c 20 28 63 68 61 72  FSTR, "d", (char
d2d0: 2a 29 26 68 61 6e 64 6c 65 5f 64 5f 6f 70 74 69  *)&handle_d_opti
d2e0: 6f 6e 2c 20 22 4f 75 74 70 75 74 20 64 69 72 65  on, "Output dire
d2f0: 63 74 6f 72 79 2e 20 20 44 65 66 61 75 6c 74 20  ctory.  Default 
d300: 27 2e 27 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  '.'"},.    {OPT_
d310: 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68 61 72  FSTR, "D", (char
d320: 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f  *)handle_D_optio
d330: 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20 25 69  n, "Define an %i
d340: 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20  fdef macro."},. 
d350: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 66     {OPT_FSTR, "f
d360: 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20  ", 0, "Ignored. 
d370: 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f   (Placeholder fo
d380: 72 20 2d 66 20 63 6f 6d 70 69 6c 65 72 20 6f 70  r -f compiler op
d390: 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b  tions.)"},.    {
d3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
d3b0: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
d3c0: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
d3d0: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
d3e0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
d3f0: 20 22 49 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65   "I", 0, "Ignore
d400: 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72  d.  (Placeholder
d410: 20 66 6f 72 20 27 2d 49 27 20 63 6f 6d 70 69 6c   for '-I' compil
d420: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
d430: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
d440: 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c  m", (char*)&mhfl
d450: 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61  ag, "Output a ma
d460: 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74  keheaders compat
d470: 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  ible file."},.  
d480: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22    {OPT_FLAG, "l"
d490: 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65  , (char*)&noline
d4a0: 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74  nosflag, "Do not
d4b0: 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74 61   print #line sta
d4c0: 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20  tements."},.    
d4d0: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 4f 22 2c 20  {OPT_FSTR, "O", 
d4e0: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
d4f0: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
d500: 2d 4f 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -O' compiler opt
d510: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
d520: 50 54 5f 46 4c 41 47 2c 20 22 70 22 2c 20 28 63  PT_FLAG, "p", (c
d530: 68 61 72 2a 29 26 73 68 6f 77 50 72 65 63 65 64  har*)&showPreced
d540: 65 6e 63 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20  enceConflict,.  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 22 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74    "Show conflict
d570: 73 20 72 65 73 6f 6c 76 65 64 20 62 79 20 70 72  s resolved by pr
d580: 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 22 7d  ecedence rules"}
d590: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
d5a0: 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26 71 75   "q", (char*)&qu
d5b0: 69 65 74 2c 20 22 28 51 75 69 65 74 29 20 44 6f  iet, "(Quiet) Do
d5c0: 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20 72 65  n't print the re
d5d0: 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  port file."},.  
d5e0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22    {OPT_FLAG, "r"
d5f0: 2c 20 28 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f  , (char*)&noReso
d600: 72 74 2c 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74  rt, "Do not sort
d610: 20 6f 72 20 72 65 6e 75 6d 62 65 72 20 73 74 61   or renumber sta
d620: 74 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  tes"},.    {OPT_
d630: 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72  FLAG, "s", (char
d640: 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a 20  *)&statistics,. 
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 22 50 72 69 6e 74 20 70 61 72 73 65 72 20    "Print parser 
d680: 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72  stats to standar
d690: 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20  d output."},.   
d6a0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c   {OPT_FLAG, "x",
d6b0: 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e   (char*)&version
d6c0: 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65 72  , "Print the ver
d6d0: 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a  sion number."},.
d6e0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
d6f0: 54 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  T", (char*)handl
d700: 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22 53 70 65  e_T_option, "Spe
d710: 63 69 66 79 20 61 20 74 65 6d 70 6c 61 74 65 20  cify a template 
d720: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
d730: 54 5f 46 53 54 52 2c 20 22 57 22 2c 20 30 2c 20  T_FSTR, "W", 0, 
d740: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
d750: 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 57 27  eholder for '-W'
d760: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
d770: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
d780: 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b  FLAG,0,0,0}.  };
d790: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d7a0: 65 78 69 74 63 6f 64 65 3b 0a 20 20 73 74 72 75  exitcode;.  stru
d7b0: 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 20 20  ct lemon lem;.  
d7c0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
d7d0: 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76  ..  OptInit(argv
d7e0: 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29  ,options,stderr)
d7f0: 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20  ;.  if( version 
d800: 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22  ){.     printf("
d810: 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e  Lemon version 1.
d820: 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74  0\n");.     exit
d830: 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4f  (0);.  }.  if( O
d840: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
d850: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d860: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
d870: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
d880: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
d890: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
d8a0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
d8b0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
d8c0: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
d8d0: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
d8e0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
d8f0: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
d900: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
d910: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
d920: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
d930: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
d940: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
d950: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
d960: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
d970: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
d980: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
d990: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
d9a0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
d9b0: 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  ");..  /* Parse 
d9c0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
d9d0: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
d9e0: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
d9f0: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
da00: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
da10: 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a  lem.nrule==0 ){.
da20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
da30: 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61  rr,"Empty gramma
da40: 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  r.\n");.    exit
da50: 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65  (1);.  }.  lem.e
da60: 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 66  rrsym = Symbol_f
da70: 69 6e 64 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20  ind("error");.. 
da80: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
da90: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
daa0: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
dab0: 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  /.  Symbol_new("
dac0: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
dad0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d  em.nsymbol = Sym
dae0: 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c  bol_count();.  l
daf0: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
db00: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
db10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e   for(i=0; i<lem.
db20: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
db30: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
db40: 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74  dex = i;.  qsort
db50: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d  (lem.symbols,lem
db60: 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28  .nsymbol,sizeof(
db70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
db80: 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20   Symbolcmpp);.  
db90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e  for(i=0; i<lem.n
dba0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d  symbol; i++) lem
dbb0: 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64  .symbols[i]->ind
dbc0: 65 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28  ex = i;.  while(
dbd0: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31   lem.symbols[i-1
dbe0: 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  ]->type==MULTITE
dbf0: 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d  RMINAL ){ i--; }
dc00: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 63 6d  .  assert( strcm
dc10: 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d  p(lem.symbols[i-
dc20: 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75  1]->name,"{defau
dc30: 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65  lt}")==0 );.  le
dc40: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20  m.nsymbol = i - 
dc50: 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 49 53  1;.  for(i=1; IS
dc60: 55 50 50 45 52 28 6c 65 6d 2e 73 79 6d 62 6f 6c  UPPER(lem.symbol
dc70: 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20  s[i]->name[0]); 
dc80: 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72  i++);.  lem.nter
dc90: 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a  minal = i;..  /*
dca0: 20 41 73 73 69 67 6e 20 73 65 71 75 65 6e 74 69   Assign sequenti
dcb0: 61 6c 20 72 75 6c 65 20 6e 75 6d 62 65 72 73 2e  al rule numbers.
dcc0: 20 20 53 74 61 72 74 20 77 69 74 68 20 30 2e 20    Start with 0. 
dcd0: 20 50 75 74 20 72 75 6c 65 73 20 74 68 61 74 20   Put rules that 
dce0: 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 72 65 64  have no.  ** red
dcf0: 75 63 65 20 61 63 74 69 6f 6e 20 43 2d 63 6f 64  uce action C-cod
dd00: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
dd10: 68 20 74 68 65 6d 20 6c 61 73 74 2c 20 73 6f 20  h them last, so 
dd20: 74 68 61 74 20 74 68 65 20 73 77 69 74 63 68 28  that the switch(
dd30: 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ).  ** statement
dd40: 20 74 68 61 74 20 73 65 6c 65 63 74 73 20 72 65   that selects re
dd50: 64 75 63 74 69 6f 6e 20 61 63 74 69 6f 6e 73 20  duction actions 
dd60: 77 69 6c 6c 20 68 61 76 65 20 61 20 73 6d 61 6c  will have a smal
dd70: 6c 65 72 20 6a 75 6d 70 20 74 61 62 6c 65 2e 0a  ler jump table..
dd80: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
dd90: 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b  rp=lem.rule; rp;
dda0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
ddb0: 20 20 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 72     rp->iRule = r
ddc0: 70 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b 20 3a 20  p->code ? i++ : 
ddd0: 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  -1;.  }.  for(rp
dde0: 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b 20 72  =lem.rule; rp; r
ddf0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
de00: 20 69 66 28 20 72 70 2d 3e 69 52 75 6c 65 3c 30   if( rp->iRule<0
de10: 20 29 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 69   ) rp->iRule = i
de20: 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 73 74  ++;.  }.  lem.st
de30: 61 72 74 52 75 6c 65 20 3d 20 6c 65 6d 2e 72 75  artRule = lem.ru
de40: 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c 65 20 3d  le;.  lem.rule =
de50: 20 52 75 6c 65 5f 73 6f 72 74 28 6c 65 6d 2e 72   Rule_sort(lem.r
de60: 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ule);..  /* Gene
de70: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
de80: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
de90: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
dea0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
deb0: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
dec0: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
ded0: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
dee0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
def0: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
df00: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
df10: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
df20: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
df30: 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  inal+1);..    /*
df40: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
df50: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
df60: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
df70: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
df80: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
df90: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
dfa0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
dfb0: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
dfc0: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
dfd0: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
dfe0: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
dff0: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
e000: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
e010: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
e020: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
e030: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
e040: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
e050: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
e060: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
e070: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
e080: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
e090: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
e0a0: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
e0b0: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
e0c0: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
e0d0: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
e0e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
e0f0: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
e100: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
e110: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
e120: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
e130: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
e140: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
e150: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
e160: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
e170: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
e180: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
e190: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
e1a0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
e1b0: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
e1c0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
e1d0: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
e1e0: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
e1f0: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
e200: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
e210: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
e220: 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e   Reorder and ren
e230: 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73  umber the states
e240: 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
e250: 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
e260: 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  es.    ** occur 
e270: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
e280: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
e290: 74 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73 20  tion that helps 
e2a0: 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  make the.    ** 
e2b0: 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72  generated parser
e2c0: 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e   tables smaller.
e2d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 52 65   */.    if( noRe
e2e0: 73 6f 72 74 3d 3d 30 20 29 20 52 65 73 6f 72 74  sort==0 ) Resort
e2f0: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  States(&lem);.. 
e300: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
e310: 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70   report of the p
e320: 61 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e  arser generated.
e330: 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74    (the "y.output
e340: 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69  " file) */.    i
e350: 66 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f  f( !quiet ) Repo
e360: 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a  rtOutput(&lem);.
e370: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
e380: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
e390: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
e3a0: 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62  */.    ReportTab
e3b0: 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29  le(&lem, mhflag)
e3c0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63  ;..    /* Produc
e3d0: 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
e3e0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73  for use by the s
e3f0: 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73  canner.  (This s
e400: 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d  tep is.    ** om
e410: 69 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d  itted if the "-m
e420: 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  " option is used
e430: 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61   because makehea
e440: 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ders will.    **
e450: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69   generate the fi
e460: 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20  le for us.) */. 
e470: 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29     if( !mhflag )
e480: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c   ReportHeader(&l
e490: 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  em);.  }.  if( s
e4a0: 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20  tatistics ){.   
e4b0: 20 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20   printf("Parser 
e4c0: 73 74 61 74 69 73 74 69 63 73 3a 5c 6e 22 29 3b  statistics:\n");
e4d0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e4e0: 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  "terminal symbol
e4f0: 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  s", lem.ntermina
e500: 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  l);.    stats_li
e510: 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ne("non-terminal
e520: 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e   symbols", lem.n
e530: 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65  symbol - lem.nte
e540: 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61  rminal);.    sta
e550: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 73  ts_line("total s
e560: 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79  ymbols", lem.nsy
e570: 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  mbol);.    stats
e580: 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22 2c 20 6c  _line("rules", l
e590: 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 73  em.nrule);.    s
e5a0: 74 61 74 73 5f 6c 69 6e 65 28 22 73 74 61 74 65  tats_line("state
e5b0: 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61 74 65 29  s", lem.nxstate)
e5c0: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
e5d0: 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c 20 6c 65  ("conflicts", le
e5e0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
e5f0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 61 63    stats_line("ac
e600: 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e 74 72 69  tion table entri
e610: 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74 69 6f 6e  es", lem.naction
e620: 74 61 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  tab);.    stats_
e630: 6c 69 6e 65 28 22 6c 6f 6f 6b 61 68 65 61 64 20  line("lookahead 
e640: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 22 2c 20  table entries", 
e650: 6c 65 6d 2e 6e 6c 6f 6f 6b 61 68 65 61 64 74 61  lem.nlookaheadta
e660: 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  b);.    stats_li
e670: 6e 65 28 22 74 6f 74 61 6c 20 74 61 62 6c 65 20  ne("total table 
e680: 73 69 7a 65 20 28 62 79 74 65 73 29 22 2c 20 6c  size (bytes)", l
e690: 65 6d 2e 74 61 62 6c 65 73 69 7a 65 29 3b 0a 20  em.tablesize);. 
e6a0: 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f   }.  if( lem.nco
e6b0: 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a 20 20  nflict > 0 ){.  
e6c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
e6d0: 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e  ,"%d parsing con
e6e0: 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e  flicts.\n",lem.n
e6f0: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 0a  conflict);.  }..
e700: 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e    /* return 0 on
e710: 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20 66   success, 1 on f
e720: 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65 78 69  ailure. */.  exi
e730: 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e 65 72  tcode = ((lem.er
e740: 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c 20 28  rorcnt > 0) || (
e750: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20  lem.nconflict > 
e760: 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 65  0)) ? 1 : 0;.  e
e770: 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b 0a 20  xit(exitcode);. 
e780: 20 72 65 74 75 72 6e 20 28 65 78 69 74 63 6f 64   return (exitcod
e790: 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  e);.}./*********
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
e7b0: 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74   the file "msort
e7c0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7e0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e  ***/./*.** A gen
e7f0: 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20  eric merge-sort 
e800: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55  program..**.** U
e810: 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74  SAGE:.** Let "pt
e820: 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  r" be a pointer 
e830: 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72  to some structur
e840: 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74 68  e which is at th
e850: 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e  e head of.** a n
e860: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
e870: 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f  ist.  Then to so
e880: 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c  rt the list call
e890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20  :.**.**     ptr 
e8a0: 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74  = msort(ptr,&(pt
e8b0: 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29  r->next),cmpfnc)
e8c0: 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ;.**.** In the a
e8d0: 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69  bove, "cmpfnc" i
e8e0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
e8f0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20   function which 
e900: 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20  compares.** two 
e910: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
e920: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
e930: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
e940: 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63  r, as in.** strc
e950: 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  mp.  The second 
e960: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
e970: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69  inter to the poi
e980: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  nter to the.** s
e990: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66  econd element of
e9a0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e9b0: 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73 20  .  This address 
e9c0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  is used to compu
e9d0: 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74  te.** the offset
e9e0: 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66   to the "next" f
e9f0: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
ea00: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
ea10: 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  offset to.** the
ea20: 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75   "next" field mu
ea30: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66  st be constant f
ea40: 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  or all structure
ea50: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  s in the list..*
ea60: 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f  *.** The functio
ea70: 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  n returns a new 
ea80: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69 73  pointer which is
ea90: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
eaa0: 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73   list.** after s
eab0: 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c  orting..**.** AL
eac0: 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67  GORITHM:.** Merg
ead0: 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  e-sort..*/../*.*
eae0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
eaf0: 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  er to the next s
eb00: 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65 20  tructure in the 
eb10: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
eb20: 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20  #define NEXT(A) 
eb30: 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63 68 61  (*(char**)(((cha
eb40: 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a  r*)A)+offset))..
eb50: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
eb60: 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f     a:       A so
eb70: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
eb80: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
eb90: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
eba0: 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20  )..**   b:      
ebb0: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
ebc0: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
ebd0: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
ebe0: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70   null)..**   cmp
ebf0: 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20  :     A pointer 
ec00: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
ec10: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20  n function..**  
ec20: 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74   offset:  Offset
ec30: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
ec40: 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  e to the "next" 
ec50: 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  field..**.** Ret
ec60: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
ec70: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
ec80: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
ec90: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
eca0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
ecb0: 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e  *   of both a an
ecc0: 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  d b..**.** Side 
ecd0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
ece0: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
ecf0: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
ed00: 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e  n the lists a an
ed10: 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61  d b are.**   cha
ed20: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
ed30: 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63  char *merge(.  c
ed40: 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a  har *a,.  char *
ed50: 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28  b,.  int (*cmp)(
ed60: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ed70: 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20  t char*),.  int 
ed80: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72  offset.){.  char
ed90: 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20   *ptr, *head;.. 
eda0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
edb0: 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c   head = b;.  }el
edc0: 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20  se if( b==0 ){. 
edd0: 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d     head = a;.  }
ede0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a  else{.    if( (*
edf0: 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a  cmp)(a,b)<=0 ){.
ee00: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
ee10: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
ee20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee30: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
ee40: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
ee50: 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20     }.    head = 
ee60: 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ptr;.    while( 
ee70: 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20  a && b ){.      
ee80: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
ee90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  =0 ){.        NE
eea0: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
eeb0: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
eec0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
eed0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
eee0: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
eef0: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
ef00: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
ef10: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
ef20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ef30: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
ef40: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
ef50: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
ef60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
ef70: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
ef80: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
ef90: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
efa0: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
efb0: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
efc0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
efd0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
efe0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
eff0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
f000: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
f010: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
f020: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
f030: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
f040: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
f050: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
f060: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
f070: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f080: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
f090: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
f0a0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
f0b0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
f0c0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
f0d0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
f0e0: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
f0f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
f100: 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68  IZE 30.static ch
f110: 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61  ar *msort(.  cha
f120: 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20  r *list,.  char 
f130: 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a  **next,.  int (*
f140: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
f150: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
f160: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
f170: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
f180: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
f190: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
f1a0: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
f1b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 28  (unsigned long)(
f1c0: 28 63 68 61 72 2a 29 6e 65 78 74 20 2d 20 28 63  (char*)next - (c
f1d0: 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20 20 66 6f  har*)list);.  fo
f1e0: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
f1f0: 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d  E; i++) set[i] =
f200: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73   0;.  while( lis
f210: 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69  t ){.    ep = li
f220: 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e  st;.    list = N
f230: 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e  EXT(list);.    N
f240: 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20  EXT(ep) = 0;.   
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
f260: 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d  SIZE-1 && set[i]
f270: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
f280: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
f290: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
f2a0: 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20  );.      set[i] 
f2b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
f2c0: 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a  et[i] = ep;.  }.
f2d0: 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28    ep = 0;.  for(
f2e0: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
f2f0: 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d   i++) if( set[i]
f300: 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73 65   ) ep = merge(se
f310: 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73  t[i],ep,cmp,offs
f320: 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70  et);.  return ep
f330: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
f350: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74  om the file "opt
f360: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
f390: 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74  *argv;.static st
f3a0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a  ruct s_options *
f3b0: 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20  op;.static FILE 
f3c0: 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65  *errstream;..#de
f3d0: 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28  fine ISOPT(X) ((
f3e0: 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b  X)[0]=='-'||(X)[
f3f0: 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28  0]=='+'||strchr(
f400: 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a  (X),'=')!=0)../*
f410: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
f420: 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20  mmand line with 
f430: 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e  a carrot pointin
f440: 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68  g to the k-th ch
f450: 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68  aracter.** of th
f460: 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f  e n-th field..*/
f470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72  .static void err
f480: 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20  line(int n, int 
f490: 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  k, FILE *err).{.
f4a0: 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a    int spcnt, i;.
f4b0: 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20    if( argv[0] ) 
f4c0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22  fprintf(err,"%s"
f4d0: 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63  ,argv[0]);.  spc
f4e0: 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  nt = lemonStrlen
f4f0: 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20  (argv[0]) + 1;. 
f500: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
f510: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
f520: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
f530: 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a  " %s",argv[i]);.
f540: 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d      spcnt += lem
f550: 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d  onStrlen(argv[i]
f560: 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74  )+1;.  }.  spcnt
f570: 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61   += k;.  for(; a
f580: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72  rgv[i]; i++) fpr
f590: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
f5a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73  rgv[i]);.  if( s
f5b0: 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66  pcnt<20 ){.    f
f5c0: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
f5d0: 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63  s^-- here\n",spc
f5e0: 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  nt,"");.  }else{
f5f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
f600: 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c  ,"\n%*shere --^\
f610: 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a  n",spcnt-7,"");.
f620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
f630: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
f640: 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77   the N-th non-sw
f650: 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20  itch argument.  
f660: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
f670: 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
f680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f690: 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e 29   argindex(int n)
f6a0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  .{.  int i;.  in
f6b0: 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a  t dashdash = 0;.
f6c0: 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26    if( argv!=0 &&
f6d0: 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20   *argv!=0 ){.   
f6e0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
f6f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
f700: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
f710: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
f720: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  {.        if( n=
f730: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
f740: 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
f750: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
f760: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
f770: 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
f780: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f790: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
f7a0: 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67  static char emsg
f7b0: 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69  [] = "Command li
f7c0: 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a  ne syntax error:
f7d0: 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65   ";../*.** Proce
f7e0: 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e  ss a flag comman
f7f0: 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e  d line argument.
f800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
f810: 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20 69  andleflags(int i
f820: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
f830: 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72   int v;.  int er
f840: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rcnt = 0;.  int 
f850: 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70  j;.  for(j=0; op
f860: 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b  [j].label; j++){
f870: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
f880: 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b  (&argv[i][1],op[
f890: 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74  j].label,lemonSt
f8a0: 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  rlen(op[j].label
f8b0: 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ))==0 ) break;. 
f8c0: 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d   }.  v = argv[i]
f8d0: 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30  [0]=='-' ? 1 : 0
f8e0: 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61  ;.  if( op[j].la
f8f0: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  bel==0 ){.    if
f900: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
f910: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e  printf(err,"%sun
f920: 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c  defined option.\
f930: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
f940: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
f950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
f960: 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nt++;.  }else if
f970: 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20 29  ( op[j].arg==0 )
f980: 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  {.    /* Ignore 
f990: 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  this option */. 
f9a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f9b0: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20  .type==OPT_FLAG 
f9c0: 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f  ){.    *((int*)o
f9d0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20  p[j].arg) = v;. 
f9e0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f9f0: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47  .type==OPT_FFLAG
fa00: 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28   ){.    (*(void(
fa10: 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61  *)(int))(op[j].a
fa20: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
fa30: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
fa40: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
fa50: 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72   (*(void(*)(char
fa60: 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29   *))(op[j].arg))
fa70: 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20  (&argv[i][2]);. 
fa80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
fa90: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
faa0: 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73 73  intf(err,"%smiss
fab0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ing argument on 
fac0: 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29  switch.\n",emsg)
fad0: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
fae0: 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,1,err);.    }.
faf0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fb00: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
fb10: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  t;.}../*.** Proc
fb20: 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69  ess a command li
fb30: 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68 20  ne switch which 
fb40: 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  has an argument.
fb50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
fb60: 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e 74 20  andleswitch(int 
fb70: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
fb80: 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20    int lv = 0;.  
fb90: 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b  double dv = 0.0;
fba0: 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c  .  char *sv = 0,
fbb0: 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63   *end;.  char *c
fbc0: 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  p;.  int j;.  in
fbd0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
fbe0: 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76  cp = strchr(argv
fbf0: 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65  [i],'=');.  asse
fc00: 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a  rt( cp!=0 );.  *
fc10: 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d  cp = 0;.  for(j=
fc20: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
fc30: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
fc40: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b  rcmp(argv[i],op[
fc50: 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62  j].label)==0 ) b
fc60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20  reak;.  }.  *cp 
fc70: 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b  = '=';.  if( op[
fc80: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
fc90: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
fca0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
fcb0: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
fcc0: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
fcd0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
fce0: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
fcf0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
fd00: 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20  se{.    cp++;.  
fd10: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
fd20: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
fd30: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
fd40: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
fd50: 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  G:.        if( e
fd60: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
fd70: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f  fprintf(err,"%so
fd80: 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
fd90: 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  n argument.\n",e
fda0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
fdb0: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
fdc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fdd0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fde0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fdf0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
fe00: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
fe10: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76  FDBL:.        dv
fe20: 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e   = strtod(cp,&en
fe30: 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
fe40: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
fe50: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
fe60: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
fe70: 28 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  (err,.          
fe80: 20 20 20 20 20 22 25 73 69 6c 6c 65 67 61 6c 20       "%sillegal 
fe90: 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f  character in flo
fea0: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75  ating-point argu
feb0: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
fed0: 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63 68 61  ine(i,(int)((cha
fee0: 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29 61 72  r*)end-(char*)ar
fef0: 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20 20 20  gv[i]),err);.   
ff00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff10: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
ff20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ff30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ff40: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
ff50: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
ff60: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
ff70: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
ff80: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
ff90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ffa0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
ffb0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
ffc0: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
ffd0: 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
ffe0: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
fff0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
10000 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28  errline(i,(int)(
10010 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72  (char*)end-(char
10020 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b  *)argv[i]),err);
10030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10040 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
10050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10070 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
10080 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
10090 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20  R:.        sv = 
100a0 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  cp;.        brea
100b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  k;.    }.    swi
100c0 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
100d0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
100e0 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
100f0 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
10100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10110 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
10120 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c  .        *(doubl
10130 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  e*)(op[j].arg) =
10140 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   dv;.        bre
10150 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10160 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
10170 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75 62   (*(void(*)(doub
10180 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  le))(op[j].arg))
10190 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (dv);.        br
101a0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
101b0 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20  OPT_INT:.       
101c0 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61   *(int*)(op[j].a
101d0 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20  rg) = lv;.      
101e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
101f0 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
10200 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
10210 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int))(op[j].arg
10220 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20  ))((int)lv);.   
10230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10240 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
10250 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
10260 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73  )(op[j].arg) = s
10270 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
10280 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10290 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28  _FSTR:.        (
102a0 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a  *(void(*)(char *
102b0 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73  ))(op[j].arg))(s
102c0 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
102d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
102e0 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
102f0 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68 61  .int OptInit(cha
10300 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 5f  r **a, struct s_
10310 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45  options *o, FILE
10320 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65   *err).{.  int e
10330 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67  rrcnt = 0;.  arg
10340 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b  v = a;.  op = o;
10350 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65  .  errstream = e
10360 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26  rr;.  if( argv &
10370 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b  & *argv && op ){
10380 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10390 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
103a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
103b0 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b  ( argv[i][0]=='+
103c0 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  ' || argv[i][0]=
103d0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
103e0 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
103f0 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20  flags(i,err);.  
10400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10410 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
10420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
10430 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
10440 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
10450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10460 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
10470 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
10480 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
10490 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
104a0 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
104b0 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
104c0 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
104d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
104e0 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
104f0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6e  (void){.  int cn
10500 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73  t = 0;.  int das
10510 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74  hdash = 0;.  int
10520 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d   i;.  if( argv!=
10530 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20  0 && argv[0]!=0 
10540 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
10550 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
10560 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
10570 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
10580 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  [i]) ) cnt++;.  
10590 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
105a0 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20  rgv[i],"--")==0 
105b0 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a  ) dashdash = 1;.
105c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
105d0 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20  rn cnt;.}..char 
105e0 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b  *OptArg(int n).{
105f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
10600 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
10610 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
10620 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
10630 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a  d OptErr(int n).
10640 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
10650 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
10660 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
10670 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
10680 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
10690 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  int(void){.  int
106a0 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c   i;.  int max, l
106b0 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20  en;.  max = 0;. 
106c0 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
106d0 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
106e0 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
106f0 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20  en(op[i].label) 
10700 2b 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28  + 1;.    switch(
10710 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
10720 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
10730 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
10740 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
10750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10760 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
10770 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
10780 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
10790 20 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   9;       /* len
107a0 67 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72  gth of "<integer
107b0 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
107c0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
107d0 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
107e0 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
107f0 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20        len += 6; 
10800 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
10810 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20  of "<real>" */. 
10820 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10830 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
10840 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10850 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c  _FSTR:.        l
10860 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f  en += 8;       /
10870 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74  * length of "<st
10880 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20  ring>" */.      
10890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
108a0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29     if( len>max )
108b0 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a   max = len;.  }.
108c0 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d    for(i=0; op[i]
108d0 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  .label; i++){.  
108e0 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
108f0 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
10900 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
10910 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
10920 47 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  G:.        fprin
10930 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
10940 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78  -%-*s  %s\n",max
10950 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b  ,op[i].label,op[
10960 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
10970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10980 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
10990 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
109a0 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72  INT:.        fpr
109b0 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
109c0 20 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a    -%s<integer>%*
109d0 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c  s  %s\n",op[i].l
109e0 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
109f0 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53  (int)(max-lemonS
10a00 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
10a10 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-9),"",op[i].m
10a20 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
10a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10a40 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
10a50 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
10a60 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
10a70 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
10a80 73 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e  s<real>%*s  %s\n
10a90 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
10aa0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
10ab0 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f  ax-lemonStrlen(o
10ac0 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22  p[i].label)-6),"
10ad0 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
10ae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
10af0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10b00 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
10b10 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
10b20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
10b30 65 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e  eam,"  -%s<strin
10b40 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  g>%*s  %s\n",op[
10b50 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
10b60 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
10b70 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
10b80 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b  label)-8),"",op[
10b90 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
10ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10bb0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  }.  }.}./*******
10bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bd0 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
10be0 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  parse.c" *******
10bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c00 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70  *****/./*.** Inp
10c10 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66  ut file parser f
10c20 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
10c30 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
10c40 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  /../* The state 
10c50 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
10c60 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a  .enum e_state {.
10c70 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20    INITIALIZE,.  
10c80 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10c90 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54  _OR_RULE,.  WAIT
10ca0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
10cb0 57 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f  WORD,.  WAITING_
10cc0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20  FOR_DECL_ARG,.  
10cd0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
10ce0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20  EDENCE_SYMBOL,. 
10cf0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
10d00 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20  OW,.  IN_RHS,.  
10d10 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c  LHS_ALIAS_1,.  L
10d20 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48  HS_ALIAS_2,.  LH
10d30 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53  S_ALIAS_3,.  RHS
10d40 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f  _ALIAS_1,.  RHS_
10d50 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45  ALIAS_2,.  PRECE
10d60 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20  DENCE_MARK_1,.  
10d70 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
10d80 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45  2,.  RESYNC_AFTE
10d90 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
10da0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
10db0 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49  L_ERROR,.  WAITI
10dc0 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
10dd0 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  R_SYMBOL,.  WAIT
10de0 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
10df0 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
10e00 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
10e10 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
10e20 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20  R_WILDCARD_ID,. 
10e30 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
10e40 53 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47  SS_ID,.  WAITING
10e50 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e  _FOR_CLASS_TOKEN
10e60 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
10e70 54 4f 4b 45 4e 5f 4e 41 4d 45 0a 7d 3b 0a 73 74  TOKEN_NAME.};.st
10e80 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20  ruct pstate {.  
10e90 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
10ea0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
10eb0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
10ec0 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69  */.  int tokenli
10ed0 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69  neno;      /* Li
10ee0 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  nenumber at whic
10ef0 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20  h current token 
10f00 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20  starts */.  int 
10f10 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
10f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
10f30 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a  rrors so far */.
10f40 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61    char *tokensta
10f50 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  rt;     /* Text 
10f60 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  of current token
10f70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   */.  struct lem
10f80 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47  on *gp;     /* G
10f90 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
10fa0 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73  or */.  enum e_s
10fb0 74 61 74 65 20 73 74 61 74 65 3b 20 20 20 20 20  tate state;     
10fc0 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
10fd0 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
10fe0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
10ff0 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a   *fallback;   /*
11000 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f   The fallback to
11010 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
11020 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b  symbol *tkclass;
11030 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61      /* Token cla
11040 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73  ss symbol */.  s
11050 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
11060 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  s;        /* Lef
11070 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t-hand side of c
11080 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20  urrent rule */. 
11090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
110a0 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20 41  alias;      /* A
110b0 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
110c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20   */.  int nrhs; 
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69   /* Number of ri
110f0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79  ght-hand side sy
11100 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20  mbols seen */.  
11110 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72  struct symbol *r
11120 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20  hs[MAXRHS];  /* 
11130 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
11140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c 69   const char *ali
11150 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41  as[MAXRHS]; /* A
11160 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20  liases for each 
11170 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e  RHS symbol (or N
11180 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74  ULL) */.  struct
11190 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b   rule *prevrule;
111a0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
111b0 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a   rule parsed */.
111c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
111d0 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20  clkeyword;   /* 
111e0 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63  Keyword of a dec
111f0 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  laration */.  ch
11200 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74  ar **declargslot
11210 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
11220 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  e the declaratio
11230 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  n argument shoul
11240 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e  d be put */.  in
11250 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  t insertLineMacr
11260 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  o;       /* Add 
11270 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63  #line before dec
11280 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20  laration insert 
11290 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69  */.  int *declli
112a0 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20  nenoslot;       
112b0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
112c0 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
112d0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65  ne number */.  e
112e0 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c  num e_assoc decl
112f0 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73  assoc;    /* Ass
11300 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61  ign this associa
11310 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67  tion to decl arg
11320 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
11330 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20  preccounter;    
11340 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e         /* Assign
11350 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65   this precedence
11360 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
11370 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ts */.  struct r
11380 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20  ule *firstrule; 
11390 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
113a0 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74   first rule in t
113b0 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
113c0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73  struct rule *las
113d0 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f  trule;     /* Po
113e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73  inter to the mos
113f0 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
11400 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  d rule */.};../*
11410 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20   Parse a single 
11420 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  token */.static 
11430 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b  void parseonetok
11440 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74 65  en(struct pstate
11450 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74   *psp).{.  const
11460 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
11470 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
11480 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
11490 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
114a0 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
114b0 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
114c0 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
114d0 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
114e0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
114f0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11500 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
11510 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
11520 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
11530 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
11540 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
11550 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
11560 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
11570 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
11580 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
11590 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
115a0 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
115b0 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
115c0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
115d0 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
115e0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
115f0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
11600 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
11610 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
11620 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11630 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11640 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
11650 65 6c 73 65 20 69 66 28 20 49 53 4c 4f 57 45 52  else if( ISLOWER
11660 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11670 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
11680 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
11690 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
116a0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
116b0 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
116c0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
116d0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
116e0 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
116f0 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
11700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11710 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
11720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11730 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11740 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11750 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
11760 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 75 70  no prior rule up
11770 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  on which to atta
11780 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72  ch the code \.fr
11790 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67  agment which beg
117a0 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ins on this line
117b0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
117c0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
117d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
117e0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
117f0 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
11800 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11810 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11820 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
11830 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
11840 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
11850 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
11860 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
11870 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
11880 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
11890 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
118a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
118b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
118c0 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
118d0 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
118e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
118f0 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
11900 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20 20 20 20  e = &x[1];.     
11910 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
11920 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a  le->noCode = 0;.
11930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11940 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
11950 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '[' ){.        p
11960 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
11970 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20  EDENCE_MARK_1;. 
11980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11990 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
119a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
119b0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
119c0 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22         "Token \"
119d0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65  %s\" should be e
119e0 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20  ither \"%%\" or 
119f0 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61  a nonterminal na
11a00 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  me.",.          
11a10 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11a20 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11a30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11a40 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
11a50 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20  DENCE_MARK_1:.  
11a60 20 20 20 20 69 66 28 20 21 49 53 55 50 50 45 52      if( !ISUPPER
11a70 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11a80 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11a90 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11aa0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11ab0 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64       "The preced
11ac0 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74  ence symbol must
11ad0 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22   be a terminal."
11ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11af0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11b00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
11b10 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
11b20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11b30 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11b40 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11b50 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72  .          "Ther
11b60 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
11b70 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65  le to assign pre
11b80 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22  cedence \"[%s]\"
11b90 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
11ba0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11bb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11bc0 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
11bd0 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20  recsym!=0 ){.   
11be0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11bf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11c00 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50  >tokenlineno,."P
11c10 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f  recedence mark o
11c20 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
11c30 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
11c40 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
11c50 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
11c60 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11c70 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
11c90 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
11ca0 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
11cb0 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
11cc0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11cd0 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
11ce0 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
11cf0 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
11d00 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20  NCE_MARK_2:.    
11d10 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20    if( x[0]!=']' 
11d20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
11d30 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11d40 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11d50 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
11d60 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20  issing \"]\" on 
11d70 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e  precedence mark.
11d80 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
11d90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11da0 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
11db0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11dc0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11dd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11de0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11df0 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20  FOR_ARROW:.     
11e00 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
11e10 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
11e20 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
11e30 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11e40 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
11e50 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
11e60 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  (' ){.        ps
11e70 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
11e80 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
11e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11ea0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11eb0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11ec0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11ed0 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65  "Expected to see
11ee0 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69   a \":\" followi
11ef0 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  ng the LHS symbo
11f00 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  l \"%s\".",.    
11f10 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
11f20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
11f30 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11f40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11f50 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11f60 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
11f70 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11f80 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
11f90 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
11fa0 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29  f( ISALPHA(x[0])
11fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11fc0 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20  >lhsalias = x;. 
11fd0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11fe0 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b  e = LHS_ALIAS_2;
11ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12000 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12010 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12020 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12030 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
12040 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
12050 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  alias for the LH
12060 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  S \"%s\"\n",.   
12070 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68         x,psp->lh
12080 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
12090 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
120a0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
120b0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
120c0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
120d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
120e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
120f0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
12100 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
12110 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12120 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
12130 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_3;.      }else
12140 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12150 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12160 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12170 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
12180 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
12190 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
121a0 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
121b0 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
121c0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
121d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
121e0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
121f0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
12200 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12220 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a  se LHS_ALIAS_3:.
12230 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12240 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
12250 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
12260 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12270 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
12280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12290 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
122a0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
122b0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
122c0 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
122d0 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a  "->\" following:
122e0 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20   \"%s(%s)\".",. 
122f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
12300 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68  hs->name,psp->lh
12310 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
12320 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12330 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12340 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12350 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
12370 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e  eak;.    case IN
12380 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20  _RHS:.      if( 
12390 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
123a0 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
123b0 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70   *rp;.        rp
123c0 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
123d0 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)calloc( sizeof
123e0 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 0a  (struct rule) +.
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
12400 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
12410 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
12420 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
12430 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
12440 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
12450 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
12460 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12470 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12480 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12490 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
124a0 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
124b0 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
124c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
124d0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
124e0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
124f0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ule = 0;.       
12500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12510 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
12520 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20     rp->ruleline 
12530 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
12540 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  no;.          rp
12550 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20  ->rhs = (struct 
12560 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b  symbol**)&rp[1];
12570 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
12580 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74  hsalias = (const
12590 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68   char**)&(rp->rh
125a0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20  s[psp->nrhs]);. 
125b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
125c0 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69  ; i<psp->nrhs; i
125d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
125e0 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73   rp->rhs[i] = ps
125f0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
12600 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
12610 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c  ias[i] = psp->al
12620 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ias[i];.        
12630 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
12640 6c 69 61 73 5b 69 5d 21 3d 30 20 29 7b 20 72 70  lias[i]!=0 ){ rp
12650 2d 3e 72 68 73 5b 69 5d 2d 3e 62 43 6f 6e 74 65  ->rhs[i]->bConte
12660 6e 74 20 3d 20 31 3b 20 7d 0a 20 20 20 20 20 20  nt = 1; }.      
12670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12680 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c  rp->lhs = psp->l
12690 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  hs;.          rp
126a0 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70  ->lhsalias = psp
126b0 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20  ->lhsalias;.    
126c0 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d        rp->nrhs =
126d0 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20   psp->nrhs;.    
126e0 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d        rp->code =
126f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   0;.          rp
12700 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20  ->noCode = 1;.  
12710 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
12720 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
12730 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
12740 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
12750 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
12760 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
12770 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
12780 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
12790 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
127a0 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
127b0 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
127c0 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
127d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
127e0 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
127f0 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
12800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
12810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
12820 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65  sp->lastrule->ne
12830 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  xt = rp;.       
12840 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
12850 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
12860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12870 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
12880 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
12890 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
128a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
128b0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
128c0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c    }else if( ISAL
128d0 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
128e0 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
128f0 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
12900 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12910 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12920 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12930 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
12940 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
12950 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65  n RHS of rule be
12960 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
12970 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
12980 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
12990 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
129a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
129b0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
129c0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
129d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
129e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
129f0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
12a00 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12a10 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
12a20 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
12a30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
12a40 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20 20 20  ->nrhs++;.      
12a50 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
12a60 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c  if( (x[0]=='|' |
12a70 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20  | x[0]=='/') && 
12a80 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
12a90 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12aa0 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
12ab0 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
12ac0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
12ad0 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
12ae0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
12af0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
12b00 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70  ol *origsp = msp
12b10 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20  ;.          msp 
12b20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
12b30 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a   *) calloc(1,siz
12b40 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20  eof(*msp));.    
12b50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70        memset(msp
12b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70  , 0, sizeof(*msp
12b70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
12b80 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  p->type = MULTIT
12b90 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
12ba0 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20     msp->nsubsym 
12bb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 1;.          m
12bc0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
12bd0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
12be0 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
12bf0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
12c00 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
12c10 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
12c20 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
12c30 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
12c40 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
12c50 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
12c60 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
12c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c80 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
12c90 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
12ca0 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
12cb0 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
12cc0 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
12cd0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
12ce0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
12cf0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
12d00 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
12d10 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  sym[msp->nsubsym
12d20 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  -1] = Symbol_new
12d30 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (&x[1]);.       
12d40 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b 31   if( ISLOWER(x[1
12d50 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28 6d 73  ]) || ISLOWER(ms
12d60 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
12d70 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
12d80 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12d90 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
12da0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12db0 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
12dc0 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64   form a compound
12dd0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f   containing a no
12de0 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20  n-terminal");.  
12df0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12e00 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
12e10 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
12e20 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
12e30 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
12e40 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12e50 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
12e60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12e70 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12e80 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12e90 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12ea0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
12eb0 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
12ec0 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
12ed0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
12ee0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12ef0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
12f00 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12f10 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
12f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
12f30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
12f40 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
12f50 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30   if( ISALPHA(x[0
12f60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
12f70 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
12f80 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
12f90 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12fa0 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
12fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12fc0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12fd0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12fe0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12ff0 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
13000 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
13010 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
13020 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
13030 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
13040 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
13050 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
13060 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13070 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
13080 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13090 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
130b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
130c0 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
130d0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
130e0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
130f0 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
13100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13110 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13120 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
13130 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
13140 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
13150 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
13160 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
13170 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
13180 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
13190 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
131a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
131b0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
131c0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
131d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
131e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
131f0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
13200 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
13210 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20  ( ISALPHA(x[0]) 
13220 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
13230 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
13240 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
13250 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
13260 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13270 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a  linenoslot = 0;.
13280 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13290 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
132a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
132b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
132c0 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
132d0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
132e0 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a  x,"name")==0 ){.
132f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13300 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
13310 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20  sp->gp->name);. 
13320 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
13330 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
13340 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
13350 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
13360 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
13370 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
13380 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
13390 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
133a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
133b0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
133c0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
133d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
133e0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
133f0 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20  ->extracode);.  
13400 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13410 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
13420 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
13430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13440 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13450 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
13460 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  est;.        }el
13470 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13480 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63  "default_destruc
13490 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
134a0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
134b0 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
134c0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20  p->vardest;.    
134d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
134e0 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
134f0 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
13500 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13510 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
13520 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
13530 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13540 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13560 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13570 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
13580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13590 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
135a0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
135b0 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ror);.        }e
135c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
135d0 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29  ,"parse_accept")
135e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
135f0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13600 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
13610 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20 20  ccept);.        
13620 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13630 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72  (x,"parse_failur
13640 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13650 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13660 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13670 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20  ->failure);.    
13680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13690 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76  rcmp(x,"stack_ov
136a0 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20  erflow")==0 ){. 
136b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
136c0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
136d0 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  p->gp->overflow)
136e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
136f0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78  if( strcmp(x,"ex
13700 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d  tra_argument")==
13710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13720 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13730 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67  = &(psp->gp->arg
13740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13750 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13760 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13770 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13780 78 2c 22 65 78 74 72 61 5f 63 6f 6e 74 65 78 74  x,"extra_context
13790 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
137a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
137b0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
137c0 3e 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  >ctx);.         
137d0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
137e0 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
137f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13800 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
13810 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13820 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13830 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13840 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
13850 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13860 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
13870 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13880 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
13890 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
138a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
138b0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
138c0 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
138d0 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
138e0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
138f0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13900 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13910 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
13920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13930 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13940 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
13950 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
13960 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
13970 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
13980 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13990 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
139a0 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
139b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
139c0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
139d0 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
139e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
139f0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13a10 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13a20 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
13a30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
13a40 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
13a50 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
13a60 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
13a70 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13a80 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13a90 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13aa0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13ab0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
13ac0 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
13ad0 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
13ae0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
13af0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
13b00 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
13b10 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13b20 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13b30 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13b40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13b50 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
13b60 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
13b70 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
13b80 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
13b90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13ba0 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
13bb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13bc0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13bd0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13be0 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13bf0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13c00 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
13c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13c20 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13c30 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
13c40 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
13c50 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13c60 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
13c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13c80 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13c90 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13ca0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13cb0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13cc0 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
13cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13ce0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
13cf0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13d00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13d10 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
13d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13d30 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
13d40 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
13d50 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13d60 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f  = WAITING_FOR_TO
13d70 4b 45 4e 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20  KEN_NAME;.      
13d80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13d90 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29  mp(x,"wildcard")
13da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13db0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13dc0 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
13dd0 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  RD_ID;.        }
13de0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13df0 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29  x,"token_class")
13e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13e10 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13e20 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
13e30 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
13e40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
13e50 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13e60 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
13e70 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13e80 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
13e90 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13ea0 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
13eb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13ec0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13ed0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13ee0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13f00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13f10 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13f20 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13f30 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13f40 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
13f50 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
13f60 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
13f70 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
13f80 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13f90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13fa0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13fb0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13fd0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
13fe0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
13ff0 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
14000 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b   if( !ISALPHA(x[
14010 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
14020 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
14030 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
14040 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14050 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
14060 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 64  issing after %%d
14070 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
14080 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
14090 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
140a0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
140b0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
140c0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
140d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
140e0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
140f0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
14100 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14110 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
14120 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
14130 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
14140 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73  llinenoslot = &s
14150 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20  p->destLineno;. 
14160 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
14170 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b  rtLineMacro = 1;
14180 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14190 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
141a0 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
141b0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
141c0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
141d0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
141e0 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
141f0 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
14200 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
14210 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14220 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
14230 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
14240 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
14250 6e 67 20 61 66 74 65 72 20 25 25 74 79 70 65 20  ng after %%type 
14260 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
14270 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14280 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
14290 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
142a0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
142b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
142c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
142d0 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
142e0 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 20 20 20  l_find(x);.     
142f0 20 20 20 69 66 28 28 73 70 29 20 26 26 20 28 73     if((sp) && (s
14300 70 2d 3e 64 61 74 61 74 79 70 65 29 29 7b 0a 20  p->datatype)){. 
14310 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
14320 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14330 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
14350 79 6d 62 6f 6c 20 25 25 74 79 70 65 20 5c 22 25  ymbol %%type \"%
14360 73 5c 22 20 61 6c 72 65 61 64 79 20 64 65 66 69  s\" already defi
14370 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ned", x);.      
14380 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14390 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
143a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
143b0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
143c0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
143d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
143e0 20 28 21 73 70 29 7b 0a 20 20 20 20 20 20 20 20   (!sp){.        
143f0 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
14400 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
14420 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
14430 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
14440 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
14450 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
14460 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
14470 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14480 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
14490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
144a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
144b0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
144c0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
144d0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
144e0 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
144f0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14500 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14510 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
14530 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  UPPER(x[0]) ){. 
14540 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
14550 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
14560 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
14570 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
14580 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
14590 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
145a0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
145b0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
145c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
145d0 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
145e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
145f0 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
14600 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
14610 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14630 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
14640 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
14650 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
14660 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
14670 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20  p->declassoc;.  
14680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
146a0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
146b0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
146c0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
146d0 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
146e0 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
146f0 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
14700 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14710 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14730 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
14740 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
14750 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78  ( x[0]=='{' || x
14760 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41  [0]=='\"' || ISA
14770 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LNUM(x[0]) ){.  
14780 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14790 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20   *zOld, *zNew;. 
147a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75         char *zBu
147b0 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  f, *z;.        i
147c0 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e  nt nOld, n, nLin
147d0 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61  e = 0, nNew, nBa
147e0 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
147f0 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
14800 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
14810 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
14820 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
14830 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
14840 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
14850 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
14860 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
14870 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
14880 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
14890 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
148a0 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
148b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
148c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
148d0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
148e0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
148f0 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
14900 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
14910 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
14920 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
14930 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
14940 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
14950 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
14960 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
14970 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
149a0 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
149b0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
149c0 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
149d0 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
149e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
149f0 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
14a00 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
14a10 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
14a20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
14a30 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
14a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14a50 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
14a60 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
14a70 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
14a80 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
14a90 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
14aa0 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
14ab0 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
14ac0 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
14ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
14ae0 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
14af0 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
14b00 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
14b10 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
14b20 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
14b30 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
14b40 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
14b50 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
14b60 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
14b70 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
14b80 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
14b90 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
14ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
14bb0 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
14bc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14bd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14be0 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
14bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
14c00 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
14c10 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14c20 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
14c30 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
14c40 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
14c50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
14c60 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
14c70 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
14c80 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
14c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ca0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14cb0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
14cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14cd0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
14ce0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14cf0 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
14d00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
14d10 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14d20 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
14d30 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
14d40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
14d50 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
14d60 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
14d70 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
14d80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14d90 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
14da0 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
14db0 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
14dc0 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
14dd0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14de0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14df0 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14e10 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14e20 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14e30 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14e40 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
14e50 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
14e60 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
14e70 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
14e80 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14e90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14ea0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14eb0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14ed0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
14ee0 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
14ef0 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
14f00 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14f10 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14f20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14f30 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14f40 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50   }else if( !ISUP
14f50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
14f60 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14f70 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14f80 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14f90 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
14fa0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
14fb0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14fc0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14fd0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14fe0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
14ff0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
15000 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
15010 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
15020 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
15030 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
15040 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
15050 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
15060 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
15070 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
15080 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
15090 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
150a0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
150b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
150c0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
150d0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
150e0 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
150f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
15100 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15120 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
15130 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
15140 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
15150 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
15160 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
15170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15180 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
15190 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
151a0 4e 5f 4e 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a  N_NAME:.      /*
151b0 20 54 6f 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68   Tokens do not h
151c0 61 76 65 20 74 6f 20 62 65 20 64 65 63 6c 61 72  ave to be declar
151d0 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
151e0 42 75 74 20 74 68 65 79 20 63 61 6e 20 62 65 0a  But they can be.
151f0 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
15200 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  r to control the
15210 69 72 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  ir assigned inte
15220 67 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ger number.  The
15230 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 20 20   number for.    
15240 20 20 2a 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20    ** each token 
15250 69 73 20 61 73 73 69 67 6e 65 64 20 77 68 65 6e  is assigned when
15260 20 69 74 20 69 73 20 66 69 72 73 74 20 73 65 65   it is first see
15270 6e 2e 20 20 53 6f 20 62 79 20 69 6e 63 6c 75 64  n.  So by includ
15280 69 6e 67 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ing.      **.   
15290 20 20 20 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e     **     %token
152a0 20 4f 4e 45 20 54 57 4f 20 54 48 52 45 45 0a 20   ONE TWO THREE. 
152b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
152c0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 67 72   early in the gr
152d0 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 61 74  ammar file, that
152e0 20 61 73 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63   assigns small c
152f0 6f 6e 73 65 63 75 74 69 76 65 20 76 61 6c 75 65  onsecutive value
15300 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 61  s.      ** to ea
15310 63 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73  ch of the tokens
15320 20 4f 4e 45 20 54 57 4f 20 61 6e 64 20 54 48 52   ONE TWO and THR
15330 45 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  EE..      */.   
15340 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
15350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
15360 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15370 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15380 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
15390 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
153a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
153b0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
153c0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
153d0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
153e0 20 22 25 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65   "%%token argume
153f0 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
15400 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
15410 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
15420 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
15430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15440 28 76 6f 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77  (void)Symbol_new
15450 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
15460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15470 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
15480 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
15490 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
154a0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
154b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
154c0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
154d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
154e0 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
15500 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
15510 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
15520 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
15530 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
15540 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
15550 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
15560 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15570 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15590 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
155a0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
155b0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
155c0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
155d0 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
155e0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
155f0 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
15600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15610 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
15620 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
15630 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
15640 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
15650 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
15660 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
15670 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
15680 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
15690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
156a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
156b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
156c0 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
156d0 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
156e0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
156f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
15700 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
15710 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
15720 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
15730 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
15740 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
15750 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
15760 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
15770 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
15780 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
15790 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
157a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
157b0 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
157c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
157d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
157e0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
157f0 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
15800 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
15810 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
15820 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
15830 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
15840 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
15850 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
15860 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
15870 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
15880 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
15890 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
158a0 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
158b0 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
158c0 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
158d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
158e0 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
158f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15900 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
15910 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
15920 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
15930 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
15940 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15950 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
15960 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
15970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
15980 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
15990 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
159a0 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
159b0 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
159c0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
159d0 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
159e0 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
159f0 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
15a00 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15a10 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
15a20 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
15a30 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
15a40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
15a50 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
15a60 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
15a70 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
15a80 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
15a90 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15aa0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
15ab0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
15ac0 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
15ad0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
15ae0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15af0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15b00 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
15b10 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
15b20 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
15b30 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
15b40 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
15b50 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15b60 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15b70 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
15b80 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
15b90 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15ba0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
15bb0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
15bc0 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
15bd0 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
15be0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15bf0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15c00 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
15c10 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
15c20 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
15c30 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
15c40 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
15c50 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
15c60 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
15c70 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
15c80 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
15c90 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15ca0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
15cb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15cc0 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
15cd0 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
15ce0 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
15cf0 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
15d00 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
15d10 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
15d20 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
15d30 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
15d40 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
15d50 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
15d60 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
15d70 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
15d80 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
15d90 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
15da0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
15db0 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
15dc0 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
15dd0 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
15de0 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
15df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15e00 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
15e10 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
15e20 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
15e30 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
15e40 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
15e50 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
15e60 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
15e70 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15e80 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
15e90 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
15ea0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15eb0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
15ec0 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
15ed0 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
15ee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15ef0 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
15f00 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
15f10 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
15f20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15f30 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
15f40 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
15f50 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
15f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15f70 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
15f80 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
15f90 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
15fa0 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
15fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15fc0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
15fd0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
15fe0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
15ff0 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
16000 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
16010 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
16020 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
16030 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
16040 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
16050 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
16060 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
16070 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
16080 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
16090 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
160a0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
160b0 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
160c0 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
160d0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
160e0 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
160f0 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
16100 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
16110 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
16120 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
16130 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
16140 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
16150 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
16160 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
16170 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
16180 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
16190 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
161a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
161b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
161c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161d0 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
161e0 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
161f0 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
16200 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
16210 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
16220 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
16230 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
16240 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
16250 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
16260 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
16270 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
16280 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
16290 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
162a0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
162b0 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
162c0 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
162d0 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
162e0 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
162f0 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
16300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
16310 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
16320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16330 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
16340 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
16350 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
16360 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
16370 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
16380 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
16390 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
163a0 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
163b0 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
163c0 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
163d0 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
163e0 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
163f0 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
16400 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
16410 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
16420 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
16430 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
16440 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
16450 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
16460 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
16470 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
16480 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
16490 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
164a0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
164b0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
164c0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
164d0 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
164e0 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
164f0 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
16500 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
16510 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
16520 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
16530 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
16540 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
16550 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
16560 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
16570 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
16580 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
165a0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
165b0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
165c0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
165d0 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
165e0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
165f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
16600 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
16610 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
16620 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
16630 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
16640 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
16650 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
16660 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
16670 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
16680 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
16690 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
166a0 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
166b0 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
166c0 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20  free(filebuf);. 
166d0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
166e0 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  +;.    fclose(fp
166f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16700 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66   }.  if( fread(f
16710 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a  ilebuf,1,filesiz
16720 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20  e,fp)!=filesize 
16730 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
16740 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
16750 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c  an't read in all
16760 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69   %d bytes of thi
16770 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
16780 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66  filesize);.    f
16790 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20  ree(filebuf);.  
167a0 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
167b0 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
167c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
167d0 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
167e0 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69    filebuf[filesi
167f0 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  ze] = 0;..  /* M
16800 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70  ake an initial p
16810 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
16820 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25  file to handle %
16830 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65  ifdef and %ifnde
16840 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73  f */.  preproces
16850 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29  s_input(filebuf)
16860 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e  ;..  /* Now scan
16870 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
16880 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
16890 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66   lineno = 1;.  f
168a0 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28  or(cp=filebuf; (
168b0 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20  c= *cp)!=0; ){. 
168c0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
168d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20   lineno++;      
168e0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20          /* Keep 
168f0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
16900 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
16910 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29  if( ISSPACE(c) )
16920 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65  { cp++; continue
16930 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c  ; }  /* Skip all
16940 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
16950 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
16960 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
16970 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
16980 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
16990 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
169a0 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
169b0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
169c0 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
169d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
169e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
169f0 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16a00 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  *' ){          /
16a10 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63  * Skip C style c
16a20 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16a30 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
16a40 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
16a50 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63   && (c!='/' || c
16a60 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20  p[-1]!='*') ){. 
16a70 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
16a80 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
16a90 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
16aa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
16ab0 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
16ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
16ad0 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74     ps.tokenstart
16ae0 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20   = cp;          
16af0 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
16b00 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
16b10 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
16b20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d  ps.tokenlineno =
16b30 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
16b40 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
16b50 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20   on which token 
16b60 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66  begins */.    if
16b70 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  ( c=='\"' ){    
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72   /* String liter
16ba0 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  als */.      cp+
16bb0 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
16bc0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
16bd0 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  !='\"' ){.      
16be0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16bf0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16c00 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
16c10 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
16c20 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
16c30 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73  sg(ps.filename,s
16c40 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e  tartline,."Strin
16c50 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  g starting on th
16c60 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
16c70 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
16c80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16c90 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
16ca0 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
16cb0 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
16cc0 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
16cd0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
16ce0 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
16cf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
16d00 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20  =='{' ){        
16d10 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63         /* A bloc
16d20 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20  k of C code */. 
16d30 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a       int level;.
16d40 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
16d50 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28    for(level=1; (
16d60 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c  c= *cp)!=0 && (l
16d70 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27  evel>1 || c!='}'
16d80 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
16d90 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16da0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16db0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b    else if( c=='{
16dc0 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20  ' ) level++;.   
16dd0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16de0 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a  ='}' ) level--;.
16df0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
16e00 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16e10 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='*' ){  /* Ski
16e20 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  p comments */.  
16e30 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76          int prev
16e40 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  c;.          cp 
16e50 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
16e60 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
16e70 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16e80 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
16e90 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21  c!='/' || prevc!
16ea0 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
16eb0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
16ec0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
16ed0 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
16ee0 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   c;.            
16ef0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
16f00 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
16f10 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
16f20 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
16f30 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
16f40 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
16f50 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
16f60 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
16f70 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
16f80 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
16f90 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
16fa0 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
16fb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
16fc0 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
16fd0 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
16fe0 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
16ff0 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
17000 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
17010 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
17020 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
17030 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
17040 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
17050 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
17060 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
17070 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
17080 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
17090 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
170a0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
170b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
170c0 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
170d0 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
170e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
170f0 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
17100 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
17110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17120 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17130 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
17140 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
17150 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65  filename,ps.toke
17160 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65  nlineno,."C code
17170 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
17180 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
17190 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
171a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
171b0 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
171c0 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
171d0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
171e0 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
171f0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
17200 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
17210 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
17220 41 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20  ALNUM(c) ){     
17230 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69       /* Identifi
17240 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ers */.      whi
17250 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
17260 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
17270 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
17280 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17290 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
172a0 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b  f( c==':' && cp[
172b0 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d  1]==':' && cp[2]
172c0 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20  =='=' ){ /* The 
172d0 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a  operator "::=" *
172e0 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b  /.      cp += 3;
172f0 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
17300 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
17310 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d  ( (c=='/' || c==
17320 27 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28  '|') && ISALPHA(
17330 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  cp[1]) ){.      
17340 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77  cp += 2;.      w
17350 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21  hile( (c = *cp)!
17360 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63  =0 && (ISALNUM(c
17370 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
17380 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
17390 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
173a0 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
173b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
173c0 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
173d0 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
173e0 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
173f0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17400 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
17410 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
17420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17440 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
17450 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
17460 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
17470 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
17480 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
17490 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28  n */.    *cp = (
174a0 63 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20  char)c;         
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
174c0 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
174d0 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
174e0 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
174f0 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
17500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17510 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
17520 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
17530 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
17540 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
17550 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
17560 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
17590 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
175a0 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
175b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
175c0 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
175d0 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
175e0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
175f0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
17600 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
17610 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
17620 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
17630 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
17640 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
17650 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
17660 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
17670 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
17680 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20  void){.  struct 
17690 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a  plink *newlink;.
176a0 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
176b0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
176c0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
176d0 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
176e0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
176f0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63  struct plink *)c
17700 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
17710 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
17720 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
17730 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
17740 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
17750 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
17760 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17770 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
17780 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
17790 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
177a0 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
177b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
177c0 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
177d0 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
177e0 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
177f0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
17800 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
17810 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
17820 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
17830 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  link = plink_fre
17840 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
17850 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
17860 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
17870 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b    return newlink
17880 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
17890 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
178a0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
178b0 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69  k_add(struct pli
178c0 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63  nk **plpp, struc
178d0 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
178e0 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
178f0 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c  *newlink;.  newl
17900 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28  ink = Plink_new(
17910 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65  );.  newlink->ne
17920 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70  xt = *plpp;.  *p
17930 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20  lpp = newlink;. 
17940 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20   newlink->cfp = 
17950 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73  cfp;.}../* Trans
17960 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  fer every plink 
17970 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f  on the list "fro
17980 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22  m" to the list "
17990 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  to" */.void Plin
179a0 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c  k_copy(struct pl
179b0 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74  ink **to, struct
179c0 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a   plink *from).{.
179d0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
179e0 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
179f0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
17a00 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
17a10 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
17a20 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
17a30 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
17a40 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
17a50 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
17a60 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
17a70 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
17a80 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20  k_delete(struct 
17a90 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20  plink *plp).{.  
17aa0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
17ab0 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
17ac0 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
17ad0 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
17ae0 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
17af0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
17b00 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
17b10 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
17b20 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
17b30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
17b50 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
17b60 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
17b80 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
17b90 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
17ba0 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
17bb0 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
17bc0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
17bd0 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
17be0 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
17bf0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
17c00 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
17c10 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
17c20 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
17c30 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
17c40 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
17c50 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
17c60 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
17c70 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73  *file_makename(s
17c80 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17c90 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  p, const char *s
17ca0 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20  uffix).{.  char 
17cb0 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  *name;.  char *c
17cc0 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e  p;.  char *filen
17cd0 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 66 69 6c 65  ame = lemp->file
17ce0 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 73 7a 3b 0a  name;.  int sz;.
17cf0 0a 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72  .  if( outputDir
17d00 20 29 7b 0a 20 20 20 20 63 70 20 3d 20 73 74 72   ){.    cp = str
17d10 72 63 68 72 28 66 69 6c 65 6e 61 6d 65 2c 20 27  rchr(filename, '
17d20 2f 27 29 3b 0a 20 20 20 20 69 66 28 20 63 70 20  /');.    if( cp 
17d30 29 20 66 69 6c 65 6e 61 6d 65 20 3d 20 63 70 20  ) filename = cp 
17d40 2b 20 31 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  + 1;.  }.  sz = 
17d50 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 66 69 6c 65  lemonStrlen(file
17d60 6e 61 6d 65 29 3b 0a 20 20 73 7a 20 2b 3d 20 6c  name);.  sz += l
17d70 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69  emonStrlen(suffi
17d80 78 29 3b 0a 20 20 69 66 28 20 6f 75 74 70 75 74  x);.  if( output
17d90 44 69 72 20 29 20 73 7a 20 2b 3d 20 6c 65 6d 6f  Dir ) sz += lemo
17da0 6e 53 74 72 6c 65 6e 28 6f 75 74 70 75 74 44 69  nStrlen(outputDi
17db0 72 29 20 2b 20 31 3b 0a 20 20 73 7a 20 2b 3d 20  r) + 1;.  sz += 
17dc0 35 3b 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61  5;.  name = (cha
17dd0 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 7a 20 29 3b  r*)malloc( sz );
17de0 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29  .  if( name==0 )
17df0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
17e00 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  derr,"Can't allo
17e10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
17e20 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a   filename.\n");.
17e30 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
17e40 0a 20 20 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  .  name[0] = 0;.
17e50 20 20 69 66 28 20 6f 75 74 70 75 74 44 69 72 20    if( outputDir 
17e60 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  ){.    lemon_str
17e70 63 70 79 28 6e 61 6d 65 2c 20 6f 75 74 70 75 74  cpy(name, output
17e80 44 69 72 29 3b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  Dir);.    lemon_
17e90 73 74 72 63 61 74 28 6e 61 6d 65 2c 20 22 2f 22  strcat(name, "/"
17ea0 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
17eb0 74 72 63 61 74 28 6e 61 6d 65 2c 66 69 6c 65 6e  trcat(name,filen
17ec0 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72  ame);.  cp = str
17ed0 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a  rchr(name,'.');.
17ee0 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d    if( cp ) *cp =
17ef0 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63   0;.  lemon_strc
17f00 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b  at(name,suffix);
17f10 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a  .  return name;.
17f20 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
17f30 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61  e with a name ba
17f40 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20  sed on the name 
17f50 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
17f60 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61  e,.** but with a
17f70 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63   different (spec
17f80 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61  ified) suffix, a
17f90 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
17fa0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ter.** to the st
17fb0 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20  ream */.PRIVATE 
17fc0 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28  FILE *file_open(
17fd0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
17fe0 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63  *lemp,.  const c
17ff0 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63  har *suffix,.  c
18000 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a  onst char *mode.
18010 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  ){.  FILE *fp;..
18020 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
18030 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
18040 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
18050 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
18060 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
18070 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
18080 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
18090 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
180a0 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
180b0 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
180c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
180d0 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
180e0 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
180f0 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
18100 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
18110 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18120 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
18130 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 74 65 78  /* Print the tex
18140 74 20 6f 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76  t of a rule.*/.v
18150 6f 69 64 20 72 75 6c 65 5f 70 72 69 6e 74 28 46  oid rule_print(F
18160 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
18170 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e   rule *rp){.  in
18180 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74  t i, j;.  fprint
18190 66 28 6f 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e  f(out, "%s",rp->
181a0 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a  lhs->name);.  /*
181b0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
181c0 6c 69 61 73 20 29 20 66 70 72 69 6e 74 66 28 6f  lias ) fprintf(o
181d0 75 74 2c 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  ut,"(%s)",rp->lh
181e0 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70  salias); */.  fp
181f0 72 69 6e 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22  rintf(out," ::="
18200 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18210 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
18220 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
18230 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
18240 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
18250 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
18260 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
18270 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
18280 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
18290 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
182a0 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73  j=1; j<sp->nsubs
182b0 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
182c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c    fprintf(out,"|
182d0 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
182e0 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
182f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
18300 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18310 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
18320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
18330 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
18340 69 5d 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  i] ) fprintf(out
18350 2c 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ,"(%s)",rp->rhsa
18360 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d  lias[i]); */.  }
18370 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65  .}../* Duplicate
18380 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
18390 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73  without comments
183a0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74   and without act
183b0 69 6f 6e 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73  ions.** on rules
183c0 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74   */.void Reprint
183d0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
183e0 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
183f0 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
18400 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
18410 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65   int i, j, maxle
18420 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73  n, len, ncolumns
18430 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66  , skip;.  printf
18440 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20  ("// Reprint of 
18450 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c  input file \"%s\
18460 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c  ".\n// Symbols:\
18470 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  n",lemp->filenam
18480 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31  e);.  maxlen = 1
18490 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
184a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
184b0 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  ++){.    sp = le
184c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
184d0 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
184e0 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
184f0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
18500 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
18510 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
18520 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
18530 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
18540 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
18550 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
18560 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
18570 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
18580 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
18590 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
185a0 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
185b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
185c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
185d0 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
185e0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
185f0 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
18600 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
18610 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
18620 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
18630 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
18640 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
18650 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
18660 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
18670 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
18680 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
18690 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 73 74 64    rule_print(std
186a0 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 70 72  out, rp);.    pr
186b0 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69  intf(".");.    i
186c0 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
186d0 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c   printf(" [%s]",
186e0 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d  rp->precsym->nam
186f0 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72  e);.    /* if( r
18700 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66  p->code ) printf
18710 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e  ("\n    %s",rp->
18720 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72  code); */.    pr
18730 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
18740 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69  }../* Print a si
18750 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f  ngle rule..*/.vo
18760 69 64 20 52 75 6c 65 50 72 69 6e 74 28 46 49 4c  id RulePrint(FIL
18770 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 72 75  E *fp, struct ru
18780 6c 65 20 2a 72 70 2c 20 69 6e 74 20 69 43 75 72  le *rp, int iCur
18790 73 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73  sor){.  struct s
187a0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
187b0 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66   i, j;.  fprintf
187c0 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d  (fp,"%s ::=",rp-
187d0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
187e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e  or(i=0; i<=rp->n
187f0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
18800 66 28 20 69 3d 3d 69 43 75 72 73 6f 72 20 29 20  f( i==iCursor ) 
18810 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29  fprintf(fp," *")
18820 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d  ;.    if( i==rp-
18830 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20  >nrhs ) break;. 
18840 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
18850 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
18860 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
18870 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
18880 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73  intf(fp," %s", s
18890 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
188a0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  me);.      for(j
188b0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
188c0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
188d0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73   fprintf(fp,"|%s
188e0 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ",sp->subsym[j]-
188f0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
18900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18910 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
18920 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
18930 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72    }.  }.}../* Pr
18940 69 6e 74 20 74 68 65 20 72 75 6c 65 20 66 6f 72  int the rule for
18950 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
18960 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  ..*/.void Config
18970 50 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20  Print(FILE *fp, 
18980 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
18990 66 70 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74  fp){.  RulePrint
189a0 28 66 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66  (fp, cfp->rp, cf
189b0 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23  p->dot);.}../* #
189c0 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23  define TEST */.#
189d0 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20  if 0./* Print a 
189e0 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  set */.PRIVATE v
189f0 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74  oid SetPrint(out
18a00 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20  ,set,lemp).FILE 
18a10 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b  *out;.char *set;
18a20 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
18a30 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
18a40 20 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a    char *spacer;.
18a50 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20    spacer = "";. 
18a60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
18a70 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28  2s[","");.  for(
18a80 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=0; i<lemp->nte
18a90 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
18aa0 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65    if( SetFind(se
18ab0 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70  t,i) ){.      fp
18ac0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22  rintf(out,"%s%s"
18ad0 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79  ,spacer,lemp->sy
18ae0 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b  mbols[i]->name);
18af0 0a 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20  .      spacer = 
18b00 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  " ";.    }.  }. 
18b10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c   fprintf(out,"]\
18b20 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  n");.}../* Print
18b30 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a   a plink chain *
18b40 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50  /.PRIVATE void P
18b50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c  linkPrint(out,pl
18b60 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74  p,tag).FILE *out
18b70 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  ;.struct plink *
18b80 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a  plp;.char *tag;.
18b90 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29  {.  while( plp )
18ba0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
18bb0 74 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65  t,"%12s%s (state
18bc0 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70   %2d) ","",tag,p
18bd0 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74  lp->cfp->stp->st
18be0 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e  atenum);.    Con
18bf0 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  figPrint(out,plp
18c00 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69  ->cfp);.    fpri
18c10 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  ntf(out,"\n");. 
18c20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65     plp = plp->ne
18c30 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  xt;.  }.}.#endif
18c40 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63  ../* Print an ac
18c50 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65  tion to the give
18c60 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
18c70 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
18c80 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77   if.** nothing w
18c90 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e  as actually prin
18ca0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e  ted..*/.int Prin
18cb0 74 41 63 74 69 6f 6e 28 0a 20 20 73 74 72 75 63  tAction(.  struc
18cc0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20  t action *ap,   
18cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 63         /* The ac
18ce0 74 69 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f  tion to print */
18cf0 0a 20 20 46 49 4c 45 20 2a 66 70 2c 20 20 20 20  .  FILE *fp,    
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d10 2a 20 50 72 69 6e 74 20 74 68 65 20 61 63 74 69  * Print the acti
18d20 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  on here */.  int
18d30 20 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20   indent         
18d40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18d50 6e 74 20 62 79 20 74 68 69 73 20 61 6d 6f 75 6e  nt by this amoun
18d60 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
18d70 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74  sult = 1;.  swit
18d80 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
18d90 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
18da0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
18db0 74 61 74 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e  tate *stp = ap->
18dc0 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 66 70 72  x.stp;.      fpr
18dd0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
18de0 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 22 2c  ft        %-7d",
18df0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
18e00 61 6d 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  ame,stp->statenu
18e10 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
18e20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18e30 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20  REDUCE: {.      
18e40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20  struct rule *rp 
18e50 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
18e60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18e70 73 20 72 65 64 75 63 65 20 20 20 20 20 20 20 25  s reduce       %
18e80 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
18e90 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75  sp->name,rp->iRu
18ea0 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50  le);.      RuleP
18eb0 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29  rint(fp, rp, -1)
18ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18ed0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 48     }.    case SH
18ee0 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20  IFTREDUCE: {.   
18ef0 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
18f00 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
18f10 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18f20 22 25 2a 73 20 73 68 69 66 74 2d 72 65 64 75 63  "%*s shift-reduc
18f30 65 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61  e %-7d",indent,a
18f40 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  p->sp->name,rp->
18f50 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75  iRule);.      Ru
18f60 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20  lePrint(fp, rp, 
18f70 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
18f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18f90 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66   ACCEPT:.      f
18fa0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61  printf(fp,"%*s a
18fb0 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70  ccept",indent,ap
18fc0 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
18fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18fe0 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  se ERROR:.      
18ff0 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
19000 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70  error",indent,ap
19010 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
19020 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19030 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se SRCONFLICT:. 
19040 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49     case RRCONFLI
19050 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  CT:.      fprint
19060 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65  f(fp,"%*s reduce
19070 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50         %-7d ** P
19080 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  arsing conflict 
19090 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64  **",.        ind
190a0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
190b0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65  ,ap->x.rp->iRule
190c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
190d0 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c      case SSCONFL
190e0 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ICT:.      fprin
190f0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
19100 20 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20          %-7d ** 
19110 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
19120 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
19130 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
19140 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  e,ap->x.stp->sta
19150 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
19160 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48  eak;.    case SH
19170 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20  _RESOLVED:.     
19180 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65   if( showPrecede
19190 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  nceConflict ){. 
191a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
191b0 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20 20  p,"%*s shift    
191c0 20 20 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70      %-7d -- drop
191d0 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ped by precedenc
191e0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
191f0 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
19200 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74  p->name,ap->x.st
19210 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
19220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19230 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20     result = 0;. 
19240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19250 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 44 5f  ak;.    case RD_
19260 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20  RESOLVED:.      
19270 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e  if( showPreceden
19280 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  ceConflict ){.  
19290 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
192a0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 37  ,"%*s reduce %-7
192b0 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20  d -- dropped by 
192c0 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20  precedence",.   
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
192e0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
192f0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65  ,ap->x.rp->iRule
19300 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19310 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
19320 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19340 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20  e NOT_USED:.    
19350 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20    result = 0;.  
19360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
19370 20 69 66 28 20 72 65 73 75 6c 74 20 26 26 20 61   if( result && a
19380 70 2d 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20 20  p->spOpt ){.    
19390 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a  fprintf(fp,"  /*
193a0 20 62 65 63 61 75 73 65 20 25 73 3d 3d 25 73 20   because %s==%s 
193b0 2a 2f 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d  */", ap->sp->nam
193c0 65 2c 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61  e, ap->spOpt->na
193d0 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
193e0 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20  n result;.}../* 
193f0 47 65 6e 65 72 61 74 65 20 74 68 65 20 22 2a 2e  Generate the "*.
19400 6f 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  out" log file */
19410 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
19420 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ut(struct lemon 
19430 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
19440 2c 20 6e 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , n;.  struct st
19450 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
19460 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
19470 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
19480 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *ap;.  struct ru
19490 6c 65 20 2a 72 70 3b 0a 20 20 46 49 4c 45 20 2a  le *rp;.  FILE *
194a0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
194b0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
194c0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66  ","wb");.  if( f
194d0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
194e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
194f0 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b  ->nxstate; i++){
19500 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
19510 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
19520 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74  fprintf(fp,"Stat
19530 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74  e %d:\n",stp->st
19540 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28  atenum);.    if(
19550 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
19560 20 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a   ) cfp=stp->bp;.
19570 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
19580 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74            cfp=st
19590 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c  p->cfp;.    whil
195a0 65 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20  e( cfp ){.      
195b0 63 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20  char buf[20];.  
195c0 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
195d0 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  ==cfp->rp->nrhs 
195e0 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e  ){.        lemon
195f0 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25  _sprintf(buf,"(%
19600 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75  d)",cfp->rp->iRu
19610 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  le);.        fpr
19620 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73  intf(fp,"    %5s
19630 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d   ",buf);.      }
19640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70  else{.        fp
19650 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20  rintf(fp,"      
19660 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a      ");.      }.
19670 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e        ConfigPrin
19680 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  t(fp,cfp);.     
19690 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
196a0 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53  );.#if 0.      S
196b0 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  etPrint(fp,cfp->
196c0 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20  fws,lemp);.     
196d0 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
196e0 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29  fp->fplp,"To  ")
196f0 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
19700 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c  nt(fp,cfp->bplp,
19710 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a  "From");.#endif.
19720 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e        if( lemp->
19730 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
19740 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65  cfp->bp;.      e
19750 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
19760 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65       cfp=cfp->ne
19770 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  xt;.    }.    fp
19780 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
19790 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
197a0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
197b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
197c0 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66  PrintAction(ap,f
197d0 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28  p,30) ) fprintf(
197e0 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  fp,"\n");.    }.
197f0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
19800 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69  \n");.  }.  fpri
19810 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d  ntf(fp, "-------
19820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
19850 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  );.  fprintf(fp,
19860 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a   "Symbols:\n");.
19870 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54    fprintf(fp, "T
19880 68 65 20 66 69 72 73 74 2d 73 65 74 20 6f 66 20  he first-set of 
19890 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 69 73  non-terminals is
198a0 20 73 68 6f 77 6e 20 61 66 74 65 72 20 74 68 65   shown after the
198b0 20 6e 61 6d 65 2e 5c 6e 5c 6e 22 29 3b 0a 20 20   name.\n\n");.  
198c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
198d0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
198e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73      int j;.    s
198f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19900 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  ;..    sp = lemp
19910 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
19920 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20    fprintf(fp, " 
19930 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73 70   %3d: %s", i, sp
19940 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
19950 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
19960 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
19970 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22 29  fprintf(fp, ":")
19980 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
19990 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20 20  lambda ){.      
199a0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20    fprintf(fp, " 
199b0 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20  <lambda>");.    
199c0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
199d0 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; j<lemp->nterm
199e0 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  inal; j++){.    
199f0 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72 73      if( sp->firs
19a00 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64 28  tset && SetFind(
19a10 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a 29  sp->firstset, j)
19a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
19a30 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22 2c  rintf(fp, " %s",
19a40 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
19a50 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
19a60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19a70 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72  }.    if( sp->pr
19a80 65 63 3e 3d 30 20 29 20 66 70 72 69 6e 74 66 28  ec>=0 ) fprintf(
19a90 66 70 2c 22 20 28 70 72 65 63 65 64 65 6e 63 65  fp," (precedence
19aa0 3d 25 64 29 22 2c 20 73 70 2d 3e 70 72 65 63 29  =%d)", sp->prec)
19ab0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
19ac0 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  , "\n");.  }.  f
19ad0 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d  printf(fp, "----
19ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b10 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  \n");.  fprintf(
19b20 66 70 2c 20 22 53 79 6e 74 61 78 2d 6f 6e 6c 79  fp, "Syntax-only
19b30 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20   Symbols:\n");. 
19b40 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54 68   fprintf(fp, "Th
19b50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 6d 62  e following symb
19b60 6f 6c 73 20 6e 65 76 65 72 20 63 61 72 72 79 20  ols never carry 
19b70 73 65 6d 61 6e 74 69 63 20 63 6f 6e 74 65 6e 74  semantic content
19b80 2e 5c 6e 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  .\n\n");.  for(i
19b90 3d 6e 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  =n=0; i<lemp->ns
19ba0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
19bb0 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74 72 75   int w;.    stru
19bc0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
19bd0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19be0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 62 43  ;.    if( sp->bC
19bf0 6f 6e 74 65 6e 74 20 29 20 63 6f 6e 74 69 6e 75  ontent ) continu
19c00 65 3b 0a 20 20 20 20 77 20 3d 20 28 69 6e 74 29  e;.    w = (int)
19c10 73 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  strlen(sp->name)
19c20 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
19c30 20 6e 2b 77 3e 37 35 20 29 7b 0a 20 20 20 20 20   n+w>75 ){.     
19c40 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
19c50 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a  );.      n = 0;.
19c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
19c70 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
19c80 74 66 28 66 70 2c 20 22 20 22 29 3b 0a 20 20 20  tf(fp, " ");.   
19c90 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
19ca0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25    fprintf(fp, "%
19cb0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
19cc0 20 20 20 6e 20 2b 3d 20 77 3b 0a 20 20 7d 0a 20     n += w;.  }. 
19cd0 20 69 66 28 20 6e 3e 30 20 29 20 66 70 72 69 6e   if( n>0 ) fprin
19ce0 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20  tf(fp, "\n");.  
19cf0 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d  fprintf(fp, "---
19d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d30 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66  -\n");.  fprintf
19d40 28 66 70 2c 20 22 52 75 6c 65 73 3a 5c 6e 22 29  (fp, "Rules:\n")
19d50 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
19d60 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
19d70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72  ->next){.    fpr
19d80 69 6e 74 66 28 66 70 2c 20 22 25 34 64 3a 20 22  intf(fp, "%4d: "
19d90 2c 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20  , rp->iRule);.  
19da0 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 66 70 2c    rule_print(fp,
19db0 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
19dc0 66 28 66 70 2c 22 2e 22 29 3b 0a 20 20 20 20 69  f(fp,".");.    i
19dd0 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
19de0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
19df0 66 70 2c 22 20 5b 25 73 20 70 72 65 63 65 64 65  fp," [%s precede
19e00 6e 63 65 3d 25 64 5d 22 2c 0a 20 20 20 20 20 20  nce=%d]",.      
19e10 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
19e20 73 79 6d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 70  sym->name, rp->p
19e30 72 65 63 73 79 6d 2d 3e 70 72 65 63 29 3b 0a 20  recsym->prec);. 
19e40 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
19e50 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
19e60 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72   fclose(fp);.  r
19e70 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61  eturn;.}../* Sea
19e80 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rch for the file
19e90 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73   "name" which is
19ea0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
19eb0 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
19ec0 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50   exacutable */.P
19ed0 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74  RIVATE char *pat
19ee0 68 73 65 61 72 63 68 28 63 68 61 72 20 2a 61 72  hsearch(char *ar
19ef0 67 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c  gv0, char *name,
19f00 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b   int modemask).{
19f10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
19f20 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  athlist;.  char 
19f30 2a 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63  *pathbufptr;.  c
19f40 68 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20  har *pathbuf;.  
19f50 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a  char *path,*cp;.
19f60 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65    char c;..#ifde
19f70 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70  f __WIN32__.  cp
19f80 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30   = strrchr(argv0
19f90 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20  ,'\\');.#else.  
19fa0 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
19fb0 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a  v0,'/');.#endif.
19fc0 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
19fd0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
19fe0 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d   = 0;.    path =
19ff0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
1a000 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67   lemonStrlen(arg
1a010 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  v0) + lemonStrle
1a020 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20  n(name) + 2 );. 
1a030 20 20 20 69 66 28 20 70 61 74 68 20 29 20 6c 65     if( path ) le
1a040 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68  mon_sprintf(path
1a050 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e  ,"%s/%s",argv0,n
1a060 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20  ame);.    *cp = 
1a070 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
1a080 70 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e  pathlist = geten
1a090 76 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69  v("PATH");.    i
1a0a0 66 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29  f( pathlist==0 )
1a0b0 20 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f   pathlist = ".:/
1a0c0 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
1a0d0 20 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68     pathbuf = (ch
1a0e0 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
1a0f0 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69  monStrlen(pathli
1a100 73 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70  st) + 1 );.    p
1a110 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
1a120 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
1a130 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f  n(pathlist)+lemo
1a140 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20  nStrlen(name)+2 
1a150 29 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68  );.    if( (path
1a160 62 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61  buf != 0) && (pa
1a170 74 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  th!=0) ){.      
1a180 70 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74  pathbufptr = pat
1a190 68 62 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f  hbuf;.      lemo
1a1a0 6e 5f 73 74 72 63 70 79 28 70 61 74 68 62 75 66  n_strcpy(pathbuf
1a1b0 2c 20 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20  , pathlist);.   
1a1c0 20 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62     while( *pathb
1a1d0 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  uf ){.        cp
1a1e0 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 62 75   = strchr(pathbu
1a1f0 66 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20  f,':');.        
1a200 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
1a210 20 26 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53   &pathbuf[lemonS
1a220 74 72 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b  trlen(pathbuf)];
1a230 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70  .        c = *cp
1a240 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20  ;.        *cp = 
1a250 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e  0;.        lemon
1a260 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25  _sprintf(path,"%
1a270 73 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61  s/%s",pathbuf,na
1a280 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70  me);.        *cp
1a290 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66   = c;.        if
1a2a0 28 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66  ( c==0 ) pathbuf
1a2b0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
1a2c0 20 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20   else pathbuf = 
1a2d0 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[1];.        
1a2e0 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c  if( access(path,
1a2f0 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62  modemask)==0 ) b
1a300 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a310 20 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66      free(pathbuf
1a320 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ptr);.    }.  }.
1a330 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d    return path;.}
1a340 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63  ../* Given an ac
1a350 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68  tion, compute th
1a360 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
1a370 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a  for that action.
1a380 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62  ** which is to b
1a390 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74  e put in the act
1a3a0 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
1a3b0 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69   generated machi
1a3c0 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65  ne..** Return ne
1a3d0 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74  gative if no act
1a3e0 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65  ion should be ge
1a3f0 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56  nerated..*/.PRIV
1a400 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f  ATE int compute_
1a410 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65  action(struct le
1a420 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63  mon *lemp, struc
1a430 74 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a  t action *ap).{.
1a440 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69    int act;.  swi
1a450 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b  tch( ap->type ){
1a460 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a  .    case SHIFT:
1a470 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74    act = ap->x.st
1a480 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  p->statenum;    
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a4b0 61 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a  ase SHIFTREDUCE:
1a4c0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 63   {.      /* Sinc
1a4d0 65 20 61 20 53 48 49 46 54 20 69 73 20 69 6e 68  e a SHIFT is inh
1a4e0 65 72 69 65 6e 74 20 61 66 74 65 72 20 61 20 70  erient after a p
1a4f0 72 69 6f 72 20 52 45 44 55 43 45 2c 20 63 6f 6e  rior REDUCE, con
1a500 76 65 72 74 20 61 6e 79 0a 20 20 20 20 20 20 2a  vert any.      *
1a510 2a 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63  * SHIFTREDUCE ac
1a520 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 6f 6e 74  tion with a nont
1a530 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68 65 20 4c  erminal on the L
1a540 48 53 20 69 6e 74 6f 20 61 20 73 69 6d 70 6c 65  HS into a simple
1a550 0a 20 20 20 20 20 20 2a 2a 20 52 45 44 55 43 45  .      ** REDUCE
1a560 20 61 63 74 69 6f 6e 3a 20 2a 2f 0a 20 20 20 20   action: */.    
1a570 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1a580 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  dex>=lemp->nterm
1a590 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
1a5a0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52  act = lemp->minR
1a5b0 65 64 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70  educe + ap->x.rp
1a5c0 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d  ->iRule;.      }
1a5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 63  else{.        ac
1a5e0 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69  t = lemp->minShi
1a5f0 66 74 52 65 64 75 63 65 20 2b 20 61 70 2d 3e 78  ftReduce + ap->x
1a600 2e 72 70 2d 3e 69 52 75 6c 65 3b 0a 20 20 20 20  .rp->iRule;.    
1a610 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1a620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a630 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 6c 65  REDUCE: act = le
1a640 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20  mp->minReduce + 
1a650 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b  ap->x.rp->iRule;
1a660 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a670 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
1a680 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 65 72    act = lemp->er
1a690 72 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rAction;        
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a6c0 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20  ase ACCEPT: act 
1a6d0 3d 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f  = lemp->accActio
1a6e0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1a700 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1a710 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20  :     act = -1; 
1a720 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1a730 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66  urn act;.}..#def
1a740 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30  ine LINESIZE 100
1a750 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c  0./* The next cl
1a760 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65  uster of routine
1a770 73 20 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e  s are for readin
1a780 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  g the template f
1a790 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69  ile.** and writi
1a7a0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ng the results t
1a7b0 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  o the generated 
1a7c0 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65  parser */./* The
1a7d0 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   first function 
1a7e0 74 72 61 6e 73 66 65 72 73 20 64 61 74 61 20 66  transfers data f
1a7f0 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74  rom "in" to "out
1a800 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e  " until.** a lin
1a810 65 20 69 73 20 73 65 65 6e 20 77 68 69 63 68 20  e is seen which 
1a820 62 65 67 69 6e 73 20 77 69 74 68 20 22 25 25 22  begins with "%%"
1a830 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62  .  The line numb
1a840 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64  er is.** tracked
1a850 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21  ..**.** if name!
1a860 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72  =0, then any wor
1a870 64 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  d that begin wit
1a880 68 20 22 50 61 72 73 65 22 20 69 73 20 63 68 61  h "Parse" is cha
1a890 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e  nged to.** begin
1a8a0 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74   with *name inst
1a8b0 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ead..*/.PRIVATE 
1a8c0 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28 63  void tplt_xfer(c
1a8d0 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20  har *name, FILE 
1a8e0 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20  *in, FILE *out, 
1a8f0 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20  int *lineno).{. 
1a900 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
1a910 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
1a920 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20  SIZE];.  while( 
1a930 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
1a940 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65  IZE,in) && (line
1a950 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65  [0]!='%' || line
1a960 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20  [1]!='%') ){.   
1a970 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1a980 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20    iStart = 0;.  
1a990 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20    if( name ){.  
1a9a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e      for(i=0; lin
1a9b0 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e[i]; i++){.    
1a9c0 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d      if( line[i]=
1a9d0 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='P' && strncmp(
1a9e0 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22  &line[i],"Parse"
1a9f0 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,5)==0.         
1aa00 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53   && (i==0 || !IS
1aa10 41 4c 50 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29  ALPHA(line[i-1])
1aa20 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1aa30 20 20 20 20 20 20 20 69 66 28 20 69 3e 69 53 74         if( i>iSt
1aa40 61 72 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75  art ) fprintf(ou
1aa50 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72  t,"%.*s",i-iStar
1aa60 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  t,&line[iStart])
1aa70 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
1aa80 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d  ntf(out,"%s",nam
1aa90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
1aaa0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
1aab0 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
1aac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1aad0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1aae0 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65  f(out,"%s",&line
1aaf0 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d  [iStart]);.  }.}
1ab00 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75  ../* The next fu
1ab10 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1ab20 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61   template file a
1ab30 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74  nd opens it, ret
1ab40 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e  urning.** a poin
1ab50 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  ter to the opene
1ab60 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41  d file. */.PRIVA
1ab70 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70  TE FILE *tplt_op
1ab80 65 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  en(struct lemon 
1ab90 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69  *lemp).{.  stati
1aba0 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
1abb0 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
1abc0 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
1abd0 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
1abe0 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
1abf0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
1ac00 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 65  .  /* first, see
1ac10 20 69 66 20 75 73 65 72 20 73 70 65 63 69 66 69   if user specifi
1ac20 65 64 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69  ed a template fi
1ac30 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f  lename on the co
1ac40 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20  mmand line. */. 
1ac50 20 69 66 20 28 75 73 65 72 5f 74 65 6d 70 6c 61   if (user_templa
1ac60 74 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20  tename != 0) {. 
1ac70 20 20 20 69 66 28 20 61 63 63 65 73 73 28 75 73     if( access(us
1ac80 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
1ac90 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  004)==-1 ){.    
1aca0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1acb0 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
1acc0 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
1acd0 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
1ace0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s\".\n",.       
1acf0 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
1ad00 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
1ad10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1ad20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ad30 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65   }.    in = fope
1ad40 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e  n(user_templaten
1ad50 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20 20 69  ame,"rb");.    i
1ad60 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1ad70 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1ad80 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
1ad90 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
1ada0 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20  "%s\".\n",.     
1adb0 20 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65           user_te
1adc0 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
1add0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1ade0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
1adf0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
1ae00 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20  eturn in;.  }.. 
1ae10 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65   cp = strrchr(le
1ae20 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27  mp->filename,'.'
1ae30 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  );.  if( cp ){. 
1ae40 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
1ae50 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
1ae60 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69  int)(cp-lemp->fi
1ae70 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69  lename),lemp->fi
1ae80 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
1ae90 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
1aea0 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
1aeb0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1aec0 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
1aed0 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
1aee0 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
1aef0 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
1af00 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
1af10 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
1af20 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
1af30 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
1af40 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
1af50 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
1af60 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
1af70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
1af80 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
1af90 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1afa0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
1afb0 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
1afc0 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
1afd0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
1afe0 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
1aff0 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
1b000 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
1b010 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
1b020 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
1b030 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
1b040 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
1b050 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
1b060 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
1b070 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
1b080 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
1b090 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
1b0a0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
1b0b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1b0c0 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
1b0d0 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
1b0e0 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
1b0f0 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
1b100 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
1b110 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
1b120 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
1b130 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
1b140 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
1b150 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
1b160 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
1b170 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
1b180 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
1b190 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
1b1a0 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
1b1b0 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
1b1c0 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
1b1d0 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
1b1e0 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
1b1f0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
1b200 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
1b210 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
1b220 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
1b230 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
1b240 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
1b250 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
1b260 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
1b270 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
1b280 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
1b290 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
1b2a0 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
1b2b0 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
1b2c0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
1b2d0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1b2e0 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
1b2f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
1b300 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
1b310 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
1b320 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
1b330 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
1b340 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
1b350 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
1b360 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
1b370 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1b380 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 7d  p->outname);.  }
1b390 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
1b3a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1b3b0 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20  g routine emits 
1b3c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73  code for the des
1b3d0 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a  tructor for the.
1b3e0 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a  ** symbol sp.*/.
1b3f0 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75  void emit_destru
1b400 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c  ctor_code(.  FIL
1b410 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74  E *out,.  struct
1b420 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73   symbol *sp,.  s
1b430 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1b440 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  p,.  int *lineno
1b450 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20  .){. char *cp = 
1b460 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70  0;.. if( sp->typ
1b470 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
1b480 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b    cp = lemp->tok
1b490 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63  endest;.   if( c
1b4a0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1b4b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
1b4c0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1b4d0 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70  +;. }else if( sp
1b4e0 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  ->destructor ){.
1b4f0 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74     cp = sp->dest
1b500 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e  ructor;.   fprin
1b510 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
1b520 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69  *lineno)++;.   i
1b530 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1b540 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1b550 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1b560 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1b570 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e  ut,sp->destLinen
1b580 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  o,lemp->filename
1b590 29 3b 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69  );.   }. }else i
1b5a0 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
1b5b0 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
1b5c0 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66  ->vardest;.   if
1b5d0 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
1b5e0 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
1b5f0 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"{\n"); (*linen
1b600 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20  o)++;. }else{.  
1b610 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
1b620 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
1b630 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70  */. }. for(; *cp
1b640 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20  ; cp++){.   if( 
1b650 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31  *cp=='$' && cp[1
1b660 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66  ]=='$' ){.     f
1b670 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70  printf(out,"(yyp
1b680 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70  minor->yy%d)",sp
1b690 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63  ->dtnum);.     c
1b6a0 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e  p++;.     contin
1b6b0 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20  ue;.   }.   if( 
1b6c0 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1b6d0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74  neno)++;.   fput
1b6e0 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
1b6f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
1b700 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
1b710 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
1b720 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20  nenosflag) {.   
1b730 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c  (*lineno)++; tpl
1b740 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c  t_linedir(out,*l
1b750 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
1b760 61 6d 65 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74  ame);. }. fprint
1b770 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
1b780 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75  lineno)++;. retu
1b790 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
1b7a0 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
1b7b0 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
1b7c0 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
1b7d0 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
1b7e0 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1b7f0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1b800 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p, struct lemon 
1b810 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72  *lemp).{.  int r
1b820 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
1b830 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
1b840 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
1b850 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
1b860 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
1b870 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
1b880 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1b890 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
1b8a0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
1b8b0 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
1b8c0 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
1b8d0 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
1b8e0 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
1b8f0 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
1b900 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
1b910 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
1b920 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
1b930 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
1b940 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
1b950 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
1b960 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
1b970 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
1b980 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
1b990 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
1b9a0 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
1b9b0 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
1b9c0 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
1b9d0 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
1b9e0 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
1b9f0 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
1ba00 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
1ba10 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
1ba20 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
1ba30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ba40 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
1ba50 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
1ba60 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
1ba70 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
1ba80 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
1ba90 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
1baa0 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
1bab0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
1bac0 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
1bad0 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
1bae0 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b  atic char empty[
1baf0 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74  1] = { 0 };.  st
1bb00 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
1bb10 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
1bb20 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
1bb30 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
1bb40 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
1bb50 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69  ar zInt[40];.  i
1bb60 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
1bb70 20 20 20 69 66 28 20 75 73 65 64 3d 3d 30 20 26     if( used==0 &
1bb80 26 20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20  & z!=0 ) z[0] = 
1bb90 30 3b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  0;.    used = 0;
1bba0 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
1bbb0 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
1bbc0 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
1bbd0 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
1bbe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
1bbf0 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
1bc00 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
1bc10 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
1bc20 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
1bc30 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
1bc40 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
1bc50 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
1bc60 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
1bc70 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
1bc80 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
1bc90 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
1bca0 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
1bcb0 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1bcc0 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
1bcd0 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
1bce0 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
1bcf0 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
1bd00 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
1bd10 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c  =='d' ){.      l
1bd20 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e  emon_sprintf(zIn
1bd30 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
1bd40 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
1bd50 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
1bd60 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
1bd70 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
1bd80 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
1bd90 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
1bda0 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
1bdb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bdc0 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68   z[used++] = (ch
1bdd0 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ar)c;.    }.  }.
1bde0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
1bdf0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1be00 0a 2a 2a 20 57 72 69 74 65 20 61 6e 64 20 74 72  .** Write and tr
1be10 61 6e 73 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e  ansform the rp->
1be20 63 6f 64 65 20 73 74 72 69 6e 67 20 73 6f 20 74  code string so t
1be30 68 61 74 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  hat symbols are 
1be40 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70  expanded..** Pop
1be50 75 6c 61 74 65 20 74 68 65 20 72 70 2d 3e 63 6f  ulate the rp->co
1be60 64 65 50 72 65 66 69 78 20 61 6e 64 20 72 70 2d  dePrefix and rp-
1be70 3e 63 6f 64 65 53 75 66 66 69 78 20 73 74 72 69  >codeSuffix stri
1be80 6e 67 73 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ngs, as appropri
1be90 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
1bea0 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 61 6e  n 1 if the expan
1beb0 64 65 64 20 63 6f 64 65 20 72 65 71 75 69 72 65  ded code require
1bec0 73 20 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e  s that "yylhsmin
1bed0 6f 72 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  or" local variab
1bee0 6c 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69  le.** to be defi
1bef0 6e 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ned..*/.PRIVATE 
1bf00 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  int translate_co
1bf10 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
1bf20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
1bf30 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
1bf40 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
1bf50 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  i;.  int rc = 0;
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bf70 72 75 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f  rue if yylhsmino
1bf80 72 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69  r is used */.  i
1bf90 6e 74 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d  nt dontUseRhs0 =
1bfa0 20 30 3b 20 20 20 2f 2a 20 49 66 20 74 72 75 65   0;   /* If true
1bfb0 2c 20 75 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f  , use of left-mo
1bfc0 73 74 20 52 48 53 20 6c 61 62 65 6c 20 69 73 20  st RHS label is 
1bfd0 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e  illegal */.  con
1bfe0 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d  st char *zSkip =
1bff0 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72   0; /* The zOvwr
1c000 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e  t comment within
1c010 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55   rp->code, or NU
1c020 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  LL */.  char lhs
1c030 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 2f  used = 0;      /
1c040 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48  * True if the LH
1c050 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65  S element has be
1c060 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  en used */.  cha
1c070 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20 20 20  r lhsdirect;    
1c080 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4c      /* True if L
1c090 48 53 20 77 72 69 74 65 73 20 64 69 72 65 63 74  HS writes direct
1c0a0 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f  ly into stack */
1c0b0 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  .  char used[MAX
1c0c0 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75  RHS];     /* Tru
1c0d0 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
1c0e0 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
1c0f0 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a  used */.  char z
1c100 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20 20 20  Lhs[50];        
1c110 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
1c120 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20  LHS symbol into 
1c130 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  this string */. 
1c140 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39 30 30   char zOvwrt[900
1c150 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65  ];      /* Comme
1c160 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77  nt that to allow
1c170 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72 69 74   LHS to overwrit
1c180 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28  e RHS */..  for(
1c190 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1c1a0 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20   i++) used[i] = 
1c1b0 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30  0;.  lhsused = 0
1c1c0 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  ;..  if( rp->cod
1c1d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
1c1e0 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73  ic char newlines
1c1f0 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20  tr[2] = { '\n', 
1c200 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e  '\0' };.    rp->
1c210 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74  code = newlinest
1c220 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20  r;.    rp->line 
1c230 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a  = rp->ruleline;.
1c240 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1c250 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1c260 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1c270 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d  .  }...  if( rp-
1c280 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20  >nrhs==0 ){.    
1c290 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1c2a0 6e 6f 20 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20  no RHS symbols, 
1c2b0 74 68 65 6e 20 77 72 69 74 69 6e 67 20 64 69 72  then writing dir
1c2c0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 4c 48 53  ectly to the LHS
1c2d0 20 69 73 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68   is ok */.    lh
1c2e0 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d  sdirect = 1;.  }
1c2f0 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
1c300 61 6c 69 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20  alias[0]==0 ){. 
1c310 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d     /* The left-m
1c320 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 68  ost RHS symbol h
1c330 61 73 20 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48  as no value.  LH
1c340 53 20 64 69 72 65 63 74 20 69 73 20 6f 6b 2e 20  S direct is ok. 
1c350 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 65 20 68   But.    ** we h
1c360 61 76 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ave to call the 
1c370 64 69 73 74 72 75 63 74 6f 72 20 6f 6e 20 74 68  distructor on th
1c380 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 66 69 72  e RHS symbol fir
1c390 73 74 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69  st. */.    lhsdi
1c3a0 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  rect = 1;.    if
1c3b0 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
1c3c0 28 72 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70  (rp->rhs[0],lemp
1c3d0 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ) ){.      appen
1c3e0 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1c3f0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c400 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1c410 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1c420 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1c430 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1c440 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1c450 73 5b 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70  s[0]->index,1-rp
1c460 2d 3e 6e 72 68 73 29 3b 0a 20 20 20 20 20 20 72  ->nrhs);.      r
1c470 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 3d 20  p->codePrefix = 
1c480 53 74 72 73 61 66 65 28 61 70 70 65 6e 64 5f 73  Strsafe(append_s
1c490 74 72 28 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20  tr(0,0,0,0));.  
1c4a0 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1c4b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1c4c0 65 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69  e if( rp->lhsali
1c4d0 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  as==0 ){.    /* 
1c4e0 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48 53 20  There is no LHS 
1c4f0 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f  value symbol. */
1c500 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1c510 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1c520 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c  strcmp(rp->lhsal
1c530 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ias,rp->rhsalias
1c540 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  [0])==0 ){.    /
1c550 2a 20 54 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  * The LHS symbol
1c560 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f   and the left-mo
1c570 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 61 72  st RHS symbol ar
1c580 65 20 74 68 65 20 73 61 6d 65 2c 20 73 6f 0a 20  e the same, so. 
1c590 20 20 20 2a 2a 20 64 69 72 65 63 74 20 77 72 69     ** direct wri
1c5a0 74 69 6e 67 20 69 73 20 61 6c 6c 6f 77 65 64 20  ting is allowed 
1c5b0 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74  */.    lhsdirect
1c5c0 20 3d 20 31 3b 0a 20 20 20 20 6c 68 73 75 73 65   = 1;.    lhsuse
1c5d0 64 20 3d 20 31 3b 0a 20 20 20 20 75 73 65 64 5b  d = 1;.    used[
1c5e0 30 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  0] = 1;.    if( 
1c5f0 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21 3d  rp->lhs->dtnum!=
1c600 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e 75  rp->rhs[0]->dtnu
1c610 6d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72  m ){.      Error
1c620 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1c630 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1c640 0a 20 20 20 20 20 20 20 20 22 25 73 28 25 73 29  .        "%s(%s)
1c650 20 61 6e 64 20 25 73 28 25 73 29 20 73 68 61 72   and %s(%s) shar
1c660 65 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c  e the same label
1c670 20 62 75 74 20 68 61 76 65 20 22 0a 20 20 20 20   but have ".    
1c680 20 20 20 20 22 64 69 66 66 65 72 65 6e 74 20 64      "different d
1c690 61 74 61 74 79 70 65 73 2e 22 2c 0a 20 20 20 20  atatypes.",.    
1c6a0 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d      rp->lhs->nam
1c6b0 65 2c 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c  e, rp->lhsalias,
1c6c0 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61 6d   rp->rhs[0]->nam
1c6d0 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  e, rp->rhsalias[
1c6e0 30 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  0]);.      lemp-
1c6f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1c700 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c710 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f  lemon_sprintf(zO
1c720 76 77 72 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72  vwrt, "/*%s-over
1c730 77 72 69 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20  writes-%s*/",.  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70  rp->lhsalias, rp
1c760 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a  ->rhsalias[0]);.
1c770 20 20 20 20 7a 53 6b 69 70 20 3d 20 73 74 72 73      zSkip = strs
1c780 74 72 28 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76  tr(rp->code, zOv
1c790 77 72 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  wrt);.    if( zS
1c7a0 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  kip!=0 ){.      
1c7b0 2f 2a 20 54 68 65 20 63 6f 64 65 20 63 6f 6e 74  /* The code cont
1c7c0 61 69 6e 73 20 61 20 73 70 65 63 69 61 6c 20 63  ains a special c
1c7d0 6f 6d 6d 65 6e 74 20 74 68 61 74 20 69 6e 64 69  omment that indi
1c7e0 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69 73  cates that it is
1c7f0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 66   safe.      ** f
1c800 6f 72 20 74 68 65 20 4c 48 53 20 6c 61 62 65 6c  or the LHS label
1c810 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 6c 65   to overwrite le
1c820 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61 62 65  ft-most RHS labe
1c830 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64  l. */.      lhsd
1c840 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d  irect = 1;.    }
1c850 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 68 73 64  else{.      lhsd
1c860 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d  irect = 0;.    }
1c870 0a 20 20 7d 0a 20 20 69 66 28 20 6c 68 73 64 69  .  }.  if( lhsdi
1c880 72 65 63 74 20 29 7b 0a 20 20 20 20 73 70 72 69  rect ){.    spri
1c890 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70  ntf(zLhs, "yymsp
1c8a0 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22  [%d].minor.yy%d"
1c8b0 2c 31 2d 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e  ,1-rp->nrhs,rp->
1c8c0 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d  lhs->dtnum);.  }
1c8d0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1c8e0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  ;.    sprintf(zL
1c8f0 68 73 2c 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e  hs, "yylhsminor.
1c900 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64  yy%d",rp->lhs->d
1c910 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70  tnum);.  }..  ap
1c920 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1c930 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1c940 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e  nst cast is wron
1c950 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20  g but harmless, 
1c960 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75 6c  if we're careful
1c970 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63  . */.  for(cp=(c
1c980 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20  har *)rp->code; 
1c990 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
1c9a0 69 66 28 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b  if( cp==zSkip ){
1c9b0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74  .      append_st
1c9c0 72 28 7a 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b  r(zOvwrt,0,0,0);
1c9d0 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d  .      cp += lem
1c9e0 6f 6e 53 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29  onStrlen(zOvwrt)
1c9f0 2d 31 3b 0a 20 20 20 20 20 20 64 6f 6e 74 55 73  -1;.      dontUs
1ca00 65 52 68 73 30 20 3d 20 31 3b 0a 20 20 20 20 20  eRhs0 = 1;.     
1ca10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1ca20 0a 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41  .    if( ISALPHA
1ca30 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70  (*cp) && (cp==rp
1ca40 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c  ->code || (!ISAL
1ca50 4e 55 4d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63  NUM(cp[-1]) && c
1ca60 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a  p[-1]!='_')) ){.
1ca70 20 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64        char saved
1ca80 3b 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20  ;.      for(xp= 
1ca90 26 63 70 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28  &cp[1]; ISALNUM(
1caa0 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27  *xp) || *xp=='_'
1cab0 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73  ; xp++);.      s
1cac0 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20  aved = *xp;.    
1cad0 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20    *xp = 0;.     
1cae0 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
1caf0 73 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  s && strcmp(cp,r
1cb00 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20  p->lhsalias)==0 
1cb10 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
1cb20 64 5f 73 74 72 28 7a 4c 68 73 2c 30 2c 30 2c 30  d_str(zLhs,0,0,0
1cb30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  );.        cp = 
1cb40 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75  xp;.        lhsu
1cb50 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  sed = 1;.      }
1cb60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
1cb70 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
1cb80 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
1cb90 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
1cba0 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  ias[i] && strcmp
1cbb0 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  (cp,rp->rhsalias
1cbc0 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1cbd0 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
1cbe0 26 26 20 64 6f 6e 74 55 73 65 52 68 73 30 20 29  && dontUseRhs0 )
1cbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cc00 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
1cc10 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
1cc20 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  line,.          
1cc30 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
1cc40 20 75 73 65 64 20 61 66 74 65 72 20 27 25 73 27   used after '%s'
1cc50 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
1cc60 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
1cc70 73 5b 30 5d 2c 20 7a 4f 76 77 72 74 29 3b 0a 20  s[0], zOvwrt);. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d               lem
1cc90 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1cca0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1ccb0 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
1ccc0 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
1ccd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cce0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
1ccf0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
1cd00 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
1cd10 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
1cd20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
1cd30 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
1cd40 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
1cd50 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
1cd60 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1cd70 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
1cd80 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
1cd90 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
1cda0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cdb0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
1cdc0 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
1cdd0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
1cde0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ce00 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
1ce10 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1ce30 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
1ce40 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
1ce50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1ce70 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
1ce80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ce90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1cea0 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
1ceb0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
1cec0 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
1ced0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
1cee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cef0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
1cf00 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
1cf10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1cf20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cf30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1cf40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
1cf50 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
1cf60 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
1cf70 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
1cf80 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
1cf90 0a 20 20 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20  .  /* Main code 
1cfa0 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c  generation compl
1cfb0 65 74 65 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61  eted */.  cp = a
1cfc0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1cfd0 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20  0);.  if( cp && 
1cfe0 63 70 5b 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65  cp[0] ) rp->code
1cff0 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a   = Strsafe(cp);.
1d000 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1d010 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ,0,0);..  /* Che
1d020 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1d030 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e  the LHS has been
1d040 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72   used */.  if( r
1d050 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
1d060 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45  lhsused ){.    E
1d070 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
1d080 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
1d090 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65  ine,.      "Labe
1d0a0 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
1d0b0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
1d0c0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
1d0d0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70   rp->lhsalias,rp
1d0e0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  ->lhs->name,rp->
1d0f0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c  lhsalias);.    l
1d100 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1d110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1d120 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  ate destructor c
1d130 6f 64 65 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f  ode for RHS mino
1d140 72 20 76 61 6c 75 65 73 20 77 68 69 63 68 20 61  r values which a
1d150 72 65 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  re not reference
1d160 64 2e 0a 20 20 2a 2a 20 47 65 6e 65 72 61 74 65  d..  ** Generate
1d170 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1d180 66 6f 72 20 75 6e 75 73 65 64 20 6c 61 62 65 6c  for unused label
1d190 73 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  s and duplicate 
1d1a0 6c 61 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  labels..  */.  f
1d1b0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
1d1c0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  hs; i++){.    if
1d1d0 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1d1e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ] ){.      if( i
1d1f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
1d200 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t j;.        if(
1d210 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
1d220 20 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61   strcmp(rp->lhsa
1d230 6c 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61  lias,rp->rhsalia
1d240 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
1d250 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1d260 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1d270 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1d280 20 20 20 20 20 20 20 20 22 25 73 28 25 73 29 20          "%s(%s) 
1d290 68 61 73 20 74 68 65 20 73 61 6d 65 20 6c 61 62  has the same lab
1d2a0 65 6c 20 61 73 20 74 68 65 20 4c 48 53 20 62 75  el as the LHS bu
1d2b0 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
1d2c0 74 2d 6d 6f 73 74 20 22 0a 20 20 20 20 20 20 20  t-most ".       
1d2d0 20 20 20 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20       "symbol on 
1d2e0 74 68 65 20 52 48 53 2e 22 2c 0a 20 20 20 20 20  the RHS.",.     
1d2f0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
1d300 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73  ]->name, rp->rhs
1d310 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20  alias[i]);.     
1d320 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
1d330 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
1d340 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
1d350 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
1d360 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72         if( rp->r
1d370 68 73 61 6c 69 61 73 5b 6a 5d 20 26 26 20 73 74  hsalias[j] && st
1d380 72 63 6d 70 28 72 70 2d 3e 72 68 73 61 6c 69 61  rcmp(rp->rhsalia
1d390 73 5b 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c 69 61  s[j],rp->rhsalia
1d3a0 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
1d3b0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
1d3c0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1d3d0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 61 62              "Lab
1d3f0 65 6c 20 25 73 20 75 73 65 64 20 66 6f 72 20 6d  el %s used for m
1d400 75 6c 74 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20  ultiple symbols 
1d410 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61 20  on the RHS of a 
1d420 72 75 6c 65 2e 22 2c 0a 20 20 20 20 20 20 20 20  rule.",.        
1d430 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
1d440 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  as[i]);.        
1d450 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1d460 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
1d470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d4a0 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
1d4b0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1d4c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1d4d0 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1d4e0 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66       "Label %s f
1d4f0 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73  or \"%s(%s)\" is
1d500 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20   never used.",. 
1d510 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
1d520 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73  alias[i],rp->rhs
1d530 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68  [i]->name,rp->rh
1d540 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20  salias[i]);.    
1d550 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1d560 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
1d570 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3e 30 20    }else if( i>0 
1d580 26 26 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  && has_destructo
1d590 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d  r(rp->rhs[i],lem
1d5a0 70 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65  p) ){.      appe
1d5b0 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73  nd_str("  yy_des
1d5c0 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73 65  tructor(yypParse
1d5d0 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e  r,%d,&yymsp[%d].
1d5e0 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20  minor);\n", 0,. 
1d5f0 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
1d600 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e  i]->index,i-rp->
1d610 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nrhs+1);.    }. 
1d620 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62   }..  /* If unab
1d630 6c 65 20 74 6f 20 77 72 69 74 65 20 4c 48 53 20  le to write LHS 
1d640 76 61 6c 75 65 73 20 64 69 72 65 63 74 6c 79 20  values directly 
1d650 69 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2c 20  into the stack, 
1d660 77 72 69 74 65 20 74 68 65 0a 20 20 2a 2a 20 73  write the.  ** s
1d670 61 76 65 64 20 4c 48 53 20 76 61 6c 75 65 20 6e  aved LHS value n
1d680 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 6c 68 73  ow. */.  if( lhs
1d690 64 69 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  direct==0 ){.   
1d6a0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
1d6b0 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79  ymsp[%d].minor.y
1d6c0 79 25 64 20 3d 20 22 2c 20 30 2c 20 31 2d 72 70  y%d = ", 0, 1-rp
1d6d0 2d 3e 6e 72 68 73 2c 20 72 70 2d 3e 6c 68 73 2d  ->nrhs, rp->lhs-
1d6e0 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 61 70 70  >dtnum);.    app
1d6f0 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c 20 30 2c  end_str(zLhs, 0,
1d700 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   0, 0);.    appe
1d710 6e 64 5f 73 74 72 28 22 3b 5c 6e 22 2c 20 30 2c  nd_str(";\n", 0,
1d720 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
1d730 2a 20 53 75 66 66 69 78 20 63 6f 64 65 20 67 65  * Suffix code ge
1d740 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74  neration complet
1d750 65 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65  e */.  cp = appe
1d760 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
1d770 0a 20 20 69 66 28 20 63 70 20 26 26 20 63 70 5b  .  if( cp && cp[
1d780 30 5d 20 29 7b 0a 20 20 20 20 72 70 2d 3e 63 6f  0] ){.    rp->co
1d790 64 65 53 75 66 66 69 78 20 3d 20 53 74 72 73 61  deSuffix = Strsa
1d7a0 66 65 28 63 70 29 3b 0a 20 20 20 20 72 70 2d 3e  fe(cp);.    rp->
1d7b0 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a  noCode = 0;.  }.
1d7c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d7d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d7e0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1d7f0 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
1d800 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
1d810 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
1d820 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
1d830 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
1d840 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
1d850 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
1d860 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20  oid emit_code(. 
1d870 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74   FILE *out,.  st
1d880 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20  ruct rule *rp,. 
1d890 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1d8a0 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65  emp,.  int *line
1d8b0 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61  no.){. const cha
1d8c0 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 53 65 74 75  r *cp;.. /* Setu
1d8d0 70 20 63 6f 64 65 20 70 72 69 6f 72 20 74 6f 20  p code prior to 
1d8e0 74 68 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74  the #line direct
1d8f0 69 76 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ive */. if( rp->
1d900 63 6f 64 65 50 72 65 66 69 78 20 26 26 20 72 70  codePrefix && rp
1d910 2d 3e 63 6f 64 65 50 72 65 66 69 78 5b 30 5d 20  ->codePrefix[0] 
1d920 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ){.   fprintf(ou
1d930 74 2c 20 22 7b 25 73 22 2c 20 72 70 2d 3e 63 6f  t, "{%s", rp->co
1d940 64 65 50 72 65 66 69 78 29 3b 0a 20 20 20 66 6f  dePrefix);.   fo
1d950 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 50 72 65  r(cp=rp->codePre
1d960 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  fix; *cp; cp++){
1d970 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
1d980 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a   (*lineno)++; }.
1d990 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65   }.. /* Generate
1d9a0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
1d9b0 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f  reduce action */
1d9c0 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  . if( rp->code )
1d9d0 7b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e  {.   if( !lemp->
1d9e0 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b  nolinenosflag ){
1d9f0 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  .     (*lineno)+
1da00 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e  +;.     tplt_lin
1da10 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e  edir(out,rp->lin
1da20 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
1da30 29 3b 0a 20 20 20 7d 0a 20 20 20 66 70 72 69 6e  );.   }.   fprin
1da40 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d  tf(out,"{%s",rp-
1da50 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28 63  >code);.   for(c
1da60 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b  p=rp->code; *cp;
1da70 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d   cp++){ if( *cp=
1da80 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
1da90 29 2b 2b 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74  )++; }.   fprint
1daa0 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
1dab0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
1dac0 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e  ( !lemp->nolinen
1dad0 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28  osflag ){.     (
1dae0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
1daf0 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
1db00 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
1db10 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20  outname);.   }. 
1db20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.. /* Generate 
1db30 62 72 65 61 6b 64 6f 77 6e 20 63 6f 64 65 20 74  breakdown code t
1db40 68 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  hat occurs after
1db50 20 74 68 65 20 23 6c 69 6e 65 20 64 69 72 65 63   the #line direc
1db60 74 69 76 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d  tive */. if( rp-
1db70 3e 63 6f 64 65 53 75 66 66 69 78 20 26 26 20 72  >codeSuffix && r
1db80 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 5b 30 5d  p->codeSuffix[0]
1db90 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f   ){.   fprintf(o
1dba0 75 74 2c 20 22 25 73 22 2c 20 72 70 2d 3e 63 6f  ut, "%s", rp->co
1dbb0 64 65 53 75 66 66 69 78 29 3b 0a 20 20 20 66 6f  deSuffix);.   fo
1dbc0 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 53 75 66  r(cp=rp->codeSuf
1dbd0 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  fix; *cp; cp++){
1dbe0 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
1dbf0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a   (*lineno)++; }.
1dc00 20 7d 0a 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   }.. if( rp->cod
1dc10 65 50 72 65 66 69 78 20 29 7b 0a 20 20 20 66 70  ePrefix ){.   fp
1dc20 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 5c 6e 22  rintf(out, "}\n"
1dc30 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
1dc40 20 7d 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.. return;.}..
1dc50 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1dc60 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
1dc70 65 20 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72  e union used for
1dc80 20 74 68 65 20 70 61 72 73 65 72 27 73 20 64 61   the parser's da
1dc90 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69  ta stack..** Thi
1dca0 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  s union contains
1dcb0 20 66 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72   fields for ever
1dcc0 79 20 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20  y possible data 
1dcd0 74 79 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a  type for tokens.
1dce0 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ** and nontermin
1dcf0 61 6c 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f  als.  In the pro
1dd00 63 65 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e  cess of computin
1dd10 67 20 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74  g and printing t
1dd20 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c  his.** union, al
1dd30 73 6f 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e  so set the ".dtn
1dd40 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65  um" field of eve
1dd50 72 79 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20  ry terminal and 
1dd60 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73  nonterminal.** s
1dd70 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70  ymbol..*/.void p
1dd80 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e  rint_stack_union
1dd90 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20  (.  FILE *out,  
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74  /* The output st
1ddc0 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74  ream */.  struct
1ddd0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20   lemon *lemp,   
1dde0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
1ddf0 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  n info structure
1de00 20 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72   for this parser
1de10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65   */.  int *pline
1de20 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
1de30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1de40 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
1de50 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20  */.  int mhflag 
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 2f 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65   /* True if gene
1de80 72 61 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65  rating makeheade
1de90 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a  rs output */.){.
1dea0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a    int lineno = *
1deb0 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54  plineno;    /* T
1dec0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f  he line number o
1ded0 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  f the output */.
1dee0 20 20 63 68 61 72 20 2a 2a 74 79 70 65 73 3b 20    char **types; 
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1df00 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64   hash table of d
1df10 61 74 61 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e  atatypes */.  in
1df20 74 20 61 72 72 61 79 73 69 7a 65 3b 20 20 20 20  t arraysize;    
1df30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1df40 6f 66 20 74 68 65 20 22 74 79 70 65 73 22 20 61  of the "types" a
1df50 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  rray */.  int ma
1df60 78 64 74 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  xdtlength;      
1df70 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c      /* Maximum l
1df80 65 6e 67 74 68 20 6f 66 20 61 6e 79 20 22 2e 64  ength of any ".d
1df90 61 74 61 74 79 70 65 22 20 66 69 65 6c 64 2e 20  atatype" field. 
1dfa0 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 64 64 74  */.  char *stddt
1dfb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dfc0 2a 20 53 74 61 6e 64 61 72 64 69 7a 65 64 20 6e  * Standardized n
1dfd0 61 6d 65 20 66 6f 72 20 61 20 64 61 74 61 74 79  ame for a dataty
1dfe0 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b  pe */.  int i,j;
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e010 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  rs */.  unsigned
1e020 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20   hash;          
1e030 20 20 2f 2a 20 46 6f 72 20 68 61 73 68 69 6e 67    /* For hashing
1e040 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
1e050 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ype */.  const c
1e060 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
1e070 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1e080 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f  e parser */..  /
1e090 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
1e0a0 6e 69 74 69 61 6c 69 7a 65 20 74 79 70 65 73 5b  nitialize types[
1e0b0 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  ] and allocate s
1e0c0 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61  tddt[] */.  arra
1e0d0 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ysize = lemp->ns
1e0e0 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70  ymbol * 2;.  typ
1e0f0 65 73 20 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c  es = (char**)cal
1e100 6c 6f 63 28 20 61 72 72 61 79 73 69 7a 65 2c 20  loc( arraysize, 
1e110 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b  sizeof(char*) );
1e120 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20  .  if( types==0 
1e130 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1e140 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
1e150 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
1e160 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f  xit(1);.  }.  fo
1e170 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
1e180 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69  ze; i++) types[i
1e190 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65  ] = 0;.  maxdtle
1e1a0 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  ngth = 0;.  if( 
1e1b0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b  lemp->vartype ){
1e1c0 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68  .    maxdtlength
1e1d0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
1e1e0 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20  emp->vartype);. 
1e1f0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1e200 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1e210 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ++){.    int len
1e220 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  ;.    struct sym
1e230 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1e240 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1e250 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65  if( sp->datatype
1e260 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1e270 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
1e280 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79  trlen(sp->dataty
1e290 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  pe);.    if( len
1e2a0 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d  >maxdtlength ) m
1e2b0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  axdtlength = len
1e2c0 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20  ;.  }.  stddt = 
1e2d0 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d  (char*)malloc( m
1e2e0 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31  axdtlength*2 + 1
1e2f0 20 29 3b 0a 20 20 69 66 28 20 73 74 64 64 74 3d   );.  if( stddt=
1e300 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1e310 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
1e320 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
1e330 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
1e340 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73    /* Build a has
1e350 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
1e360 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75  ypes. The ".dtnu
1e370 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  m" field of each
1e380 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20   symbol.  ** is 
1e390 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74  filled in with t
1e3a0 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c  he hash index pl
1e3b0 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d  us 1.  A ".dtnum
1e3c0 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a  " value of 0 is.
1e3d0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65    ** used for te
1e3e0 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20  rminal symbols. 
1e3f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1e400 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65  %default_type de
1e410 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20  fined then.  ** 
1e420 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61  0 is also used a
1e430 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c  s the .dtnum val
1e440 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  ue for nontermin
1e450 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  als which do not
1e460 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20   specify.  ** a 
1e470 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74  datatype using t
1e480 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69  he %type directi
1e490 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
1e4a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1e4b0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1e4c0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1e4d0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1e4e0 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  [i];.    char *c
1e4f0 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c  p;.    if( sp==l
1e500 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
1e510 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
1e520 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20   arraysize+1;.  
1e530 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1e540 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e    }.    if( sp->
1e550 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type!=NONTERMINA
1e560 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79  L || (sp->dataty
1e570 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76  pe==0 && lemp->v
1e580 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20  artype==0) ){.  
1e590 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1e5a0 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
1e5b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
1e5c0 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
1e5d0 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20      if( cp==0 ) 
1e5e0 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79  cp = lemp->varty
1e5f0 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  pe;.    j = 0;. 
1e600 20 20 20 77 68 69 6c 65 28 20 49 53 53 50 41 43     while( ISSPAC
1e610 45 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20  E(*cp) ) cp++;. 
1e620 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20     while( *cp ) 
1e630 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70  stddt[j++] = *cp
1e640 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a  ++;.    while( j
1e650 3e 30 20 26 26 20 49 53 53 50 41 43 45 28 73 74  >0 && ISSPACE(st
1e660 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b  ddt[j-1]) ) j--;
1e670 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20  .    stddt[j] = 
1e680 30 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  0;.    if( lemp-
1e690 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74  >tokentype && st
1e6a0 72 63 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70  rcmp(stddt, lemp
1e6b0 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20  ->tokentype)==0 
1e6c0 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1e6d0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
1e6e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e6f0 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20    hash = 0;.    
1e700 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a  for(j=0; stddt[j
1e710 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68  ]; j++){.      h
1e720 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20  ash = hash*53 + 
1e730 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a  stddt[j];.    }.
1e740 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
1e750 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 61   & 0x7fffffff)%a
1e760 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68  rraysize;.    wh
1e770 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d  ile( types[hash]
1e780 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
1e790 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d  rcmp(types[hash]
1e7a0 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20  ,stddt)==0 ){.  
1e7b0 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
1e7c0 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20  = hash + 1;.    
1e7d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e7e0 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b   }.      hash++;
1e7f0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68 3e  .      if( hash>
1e800 3d 28 75 6e 73 69 67 6e 65 64 29 61 72 72 61 79  =(unsigned)array
1e810 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b  size ) hash = 0;
1e820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
1e830 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
1e840 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1e850 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
1e860 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d     types[hash] =
1e870 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
1e880 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64  lemonStrlen(stdd
1e890 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  t)+1 );.      if
1e8a0 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
1e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
1e8c0 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
1e8d0 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
1e8e0 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
1e8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
1e900 65 6d 6f 6e 5f 73 74 72 63 70 79 28 74 79 70 65  emon_strcpy(type
1e910 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a  s[hash],stddt);.
1e920 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e930 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65  Print out the de
1e940 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f  finition of YYTO
1e950 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49  KENTYPE and YYMI
1e960 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d  NORTYPE */.  nam
1e970 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
1e980 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
1e990 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20  arse";.  lineno 
1e9a0 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66  = *plineno;.  if
1e9b0 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
1e9c0 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1e9d0 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1e9e0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
1e9f0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1ea00 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22  sTOKENTYPE %s\n"
1ea10 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d  ,name,.    lemp-
1ea20 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d  >tokentype?lemp-
1ea30 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64  >tokentype:"void
1ea40 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  *");  lineno++;.
1ea50 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
1ea60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
1ea70 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1ea80 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
1ea90 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f  ut,"typedef unio
1eaa0 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  n {\n"); lineno+
1eab0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1eac0 2c 22 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c  ,"  int yyinit;\
1ead0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1eae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1eaf0 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b  %sTOKENTYPE yy0;
1eb00 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1eb10 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  o++;.  for(i=0; 
1eb20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
1eb30 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73  ){.    if( types
1eb40 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1eb50 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
1eb60 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e  ut,"  %s yy%d;\n
1eb70 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b  ",types[i],i+1);
1eb80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1eb90 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20  ree(types[i]);. 
1eba0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65   }.  if( lemp->e
1ebb0 72 72 73 79 6d 20 26 26 20 6c 65 6d 70 2d 3e 65  rrsym && lemp->e
1ebc0 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b  rrsym->useCnt ){
1ebd0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ebe0 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22  ,"  int yy%d;\n"
1ebf0 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
1ec00 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
1ec10 0a 20 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64  .  }.  free(stdd
1ec20 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73  t);.  free(types
1ec30 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
1ec40 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b  ,"} YYMINORTYPE;
1ec50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ec60 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e    *plineno = lin
1ec70 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eno;.}../*.** Re
1ec80 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
1ec90 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62   a C datatype ab
1eca0 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  le to represent 
1ecb0 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a  values between.*
1ecc0 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69  * lwr and upr, i
1ecd0 6e 63 6c 75 73 69 76 65 2e 20 20 49 66 20 70 6e  nclusive.  If pn
1ece0 42 79 74 65 21 3d 4e 55 4c 4c 20 74 68 65 6e 20  Byte!=NULL then 
1ecf0 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 73  also write the s
1ed00 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20 74 68 61  izeof.** for tha
1ed10 74 20 74 79 70 65 20 28 31 2c 20 32 2c 20 6f 72  t type (1, 2, or
1ed20 20 34 29 20 69 6e 74 6f 20 2a 70 6e 42 79 74 65   4) into *pnByte
1ed30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1ed40 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f  t char *minimum_
1ed50 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77  size_type(int lw
1ed60 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20  r, int upr, int 
1ed70 2a 70 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73  *pnByte){.  cons
1ed80 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
1ed90 22 69 6e 74 22 3b 0a 20 20 69 6e 74 20 6e 42 79  "int";.  int nBy
1eda0 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 6c 77  te = 4;.  if( lw
1edb0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r>=0 ){.    if( 
1edc0 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20  upr<=255 ){.    
1edd0 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67    zType = "unsig
1ede0 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 20  ned char";.     
1edf0 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20 20 20   nByte = 1;.    
1ee00 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35  }else if( upr<65
1ee10 35 33 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  535 ){.      zTy
1ee20 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 73  pe = "unsigned s
1ee30 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20 20  hort int";.     
1ee40 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20 20 20   nByte = 2;.    
1ee50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79  }else{.      zTy
1ee60 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 69  pe = "unsigned i
1ee70 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  nt";.      nByte
1ee80 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 4;.    }.  }e
1ee90 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32  lse if( lwr>=-12
1eea0 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b  7 && upr<=127 ){
1eeb0 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 73 69  .    zType = "si
1eec0 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20  gned char";.    
1eed0 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  nByte = 1;.  }el
1eee0 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37  se if( lwr>=-327
1eef0 36 37 20 26 26 20 75 70 72 3c 33 32 37 36 37 20  67 && upr<32767 
1ef00 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
1ef10 73 68 6f 72 74 22 3b 0a 20 20 20 20 6e 42 79 74  short";.    nByt
1ef20 65 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 2;.  }.  if(
1ef30 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74   pnByte ) *pnByt
1ef40 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74  e = nByte;.  ret
1ef50 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
1ef60 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63  .** Each state c
1ef70 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66  ontains a set of
1ef80 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69   token transacti
1ef90 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a  on and a set of.
1efa0 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74  ** nonterminal t
1efb0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61  ransactions.  Ea
1efc0 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73  ch of these sets
1efd0 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e   makes an instan
1efe0 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
1eff0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1f000 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74  .  An array of t
1f010 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
1f020 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72  is used.** to or
1f030 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  der the creation
1f040 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
1f050 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
1f060 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
1f070 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74  axset {.  struct
1f080 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f   state *stp;   /
1f090 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
1f0a0 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
1f0b0 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20  isTkn;          
1f0c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
1f0d0 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66  tokens.  False f
1f0e0 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
1f0f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
1f100 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1f110 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
1f120 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b  */.  int iOrder;
1f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
1f140 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61  ginal order of a
1f150 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b  ction sets */.};
1f160 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1f170 74 6f 20 61 78 73 65 74 20 73 74 72 75 63 74 75  to axset structu
1f180 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  res for sorting 
1f190 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74  purposes.*/.stat
1f1a0 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d  ic int axset_com
1f1b0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
1f1c0 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
1f1d0 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73  b){.  struct axs
1f1e0 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74  et *p1 = (struct
1f1f0 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72   axset*)a;.  str
1f200 75 63 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20  uct axset *p2 = 
1f210 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 62  (struct axset*)b
1f220 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d  ;.  int c;.  c =
1f230 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70   p2->nAction - p
1f240 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66  1->nAction;.  if
1f250 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20  ( c==0 ){.    c 
1f260 3d 20 70 31 2d 3e 69 4f 72 64 65 72 20 2d 20 70  = p1->iOrder - p
1f270 32 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  2->iOrder;.  }. 
1f280 20 61 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c   assert( c!=0 ||
1f290 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74   p1==p2 );.  ret
1f2a0 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
1f2b0 57 72 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f  Write text on "o
1f2c0 75 74 22 20 74 68 61 74 20 64 65 73 63 72 69 62  ut" that describ
1f2d0 65 73 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  es the rule "rp"
1f2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f2f0 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 46   writeRuleText(F
1f300 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
1f310 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e   rule *rp){.  in
1f320 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  t j;.  fprintf(o
1f330 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d  ut,"%s ::=", rp-
1f340 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
1f350 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72  or(j=0; j<rp->nr
1f360 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  hs; j++){.    st
1f370 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1f380 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20  = rp->rhs[j];.  
1f390 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d    if( sp->type!=
1f3a0 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
1f3b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1f3c0 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  ut," %s", sp->na
1f3d0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
1f3e0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1f3f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f400 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d   %s", sp->subsym
1f410 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [0]->name);.    
1f420 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d    for(k=1; k<sp-
1f430 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
1f440 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1f450 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75  out,"|%s",sp->su
1f460 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[k]->name);.
1f470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f480 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  }.}.../* Generat
1f490 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20  e C source code 
1f4a0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1f4b0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  /.void ReportTab
1f4c0 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  le(.  struct lem
1f4d0 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20  on *lemp,.  int 
1f4e0 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f 75  mhflag     /* Ou
1f4f0 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64  tput in makehead
1f500 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72  ers format if tr
1f510 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45 20  ue */.){.  FILE 
1f520 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
1f530 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1f540 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b  ;.  int  lineno;
1f550 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1f560 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1f570 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72  ction *ap;.  str
1f580 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
1f590 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70  struct acttab *p
1f5a0 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c  Acttab;.  int i,
1f5b0 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20 69 6e 74   j, n, sz;.  int
1f5c0 20 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 20 20   szActionType;  
1f5d0 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 41     /* sizeof(YYA
1f5e0 43 54 49 4f 4e 54 59 50 45 29 20 2a 2f 0a 20 20  CTIONTYPE) */.  
1f5f0 69 6e 74 20 73 7a 43 6f 64 65 54 79 70 65 3b 20  int szCodeType; 
1f600 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28        /* sizeof(
1f610 59 59 43 4f 44 45 54 59 50 45 29 20 20 20 2a 2f  YYCODETYPE)   */
1f620 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1f630 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e  ame;.  int mnTkn
1f640 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b  Ofst, mxTknOfst;
1f650 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c  .  int mnNtOfst,
1f660 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72   mxNtOfst;.  str
1f670 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a  uct axset *ax;..
1f680 20 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74    lemp->minShift
1f690 52 65 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e  Reduce = lemp->n
1f6a0 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 65  state;.  lemp->e
1f6b0 72 72 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  rrAction = lemp-
1f6c0 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65 20  >minShiftReduce 
1f6d0 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20  + lemp->nrule;. 
1f6e0 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e   lemp->accAction
1f6f0 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69   = lemp->errActi
1f700 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e  on + 1;.  lemp->
1f710 6e 6f 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  noAction = lemp-
1f720 3e 61 63 63 41 63 74 69 6f 6e 20 2b 20 31 3b 0a  >accAction + 1;.
1f730 20 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63    lemp->minReduc
1f740 65 20 3d 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69  e = lemp->noActi
1f750 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e  on + 1;.  lemp->
1f760 6d 61 78 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70  maxAction = lemp
1f770 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20 6c 65  ->minReduce + le
1f780 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 0a 20 20 69 6e  mp->nrule;..  in
1f790 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d   = tplt_open(lem
1f7a0 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  p);.  if( in==0 
1f7b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20  ) return;.  out 
1f7c0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1f7d0 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".c","wb");.  i
1f7e0 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
1f7f0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
1f800 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c   return;.  }.  l
1f810 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c  ineno = 1;.  tpl
1f820 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1f830 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1f840 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1f850 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f  e the include co
1f860 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  de, if any */.  
1f870 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1f880 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64  emp,lemp->includ
1f890 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66  e,&lineno);.  if
1f8a0 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1f8b0 63 68 61 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20  char *incName = 
1f8c0 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65  file_makename(le
1f8d0 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66  mp, ".h");.    f
1f8e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63  printf(out,"#inc
1f8f0 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  lude \"%s\"\n", 
1f900 69 6e 63 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  incName); lineno
1f910 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 69 6e 63  ++;.    free(inc
1f920 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c  Name);.  }.  tpl
1f930 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1f940 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1f950 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1f960 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61  e #defines for a
1f970 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69  ll tokens */.  i
1f980 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1f990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
1f9a0 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fix;.    fprintf
1f9b0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1f9c0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1f9d0 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  +;.    if( lemp-
1f9e0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
1f9f0 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
1fa00 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65  kenprefix;.    e
1fa10 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
1fa20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
1fa30 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  "";.    for(i=1;
1fa40 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
1fa50 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
1fa60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1fa70 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1fa80 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1fa90 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1faa0 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  e,i);.      line
1fab0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
1fac0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
1fad0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1fae0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1faf0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1fb00 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1fb10 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1fb20 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66  e defines */.  f
1fb30 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fb40 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25  ine YYCODETYPE %
1fb50 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75  s\n",.    minimu
1fb60 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c  m_size_type(0, l
1fb70 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20 26 73  emp->nsymbol, &s
1fb80 7a 43 6f 64 65 54 79 70 65 29 29 3b 20 6c 69 6e  zCodeType)); lin
1fb90 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1fba0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fbb0 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d  NOCODE %d\n",lem
1fbc0 70 2d 3e 6e 73 79 6d 62 6f 6c 29 3b 20 20 6c 69  p->nsymbol);  li
1fbd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1fbe0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1fbf0 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e  YACTIONTYPE %s\n
1fc00 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73  ",.    minimum_s
1fc10 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65 6d 70 2d  ize_type(0,lemp-
1fc20 3e 6d 61 78 41 63 74 69 6f 6e 2c 26 73 7a 41 63  >maxAction,&szAc
1fc30 74 69 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65  tionType)); line
1fc40 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1fc50 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1fc60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fc70 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52  define YYWILDCAR
1fc80 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  D %d\n",.       
1fc90 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e  lemp->wildcard->
1fca0 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1fcb0 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74  ;.  }.  print_st
1fcc0 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
1fcd0 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,&lineno,mhfla
1fce0 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  g);.  fprintf(ou
1fcf0 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54  t, "#ifndef YYST
1fd00 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69  ACKDEPTH\n"); li
1fd10 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1fd20 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
1fd30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1fd40 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1fd50 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
1fd60 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
1fd70 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1fd80 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1fd90 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
1fda0 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
1fdb0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1fdc0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1fdd0 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1fde0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1fdf0 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  lag ){.    fprin
1fe00 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1fe10 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1fe20 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20  o++;.  }.  name 
1fe30 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1fe40 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1fe50 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  se";.  if( lemp-
1fe60 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72  >arg && lemp->ar
1fe70 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20  g[0] ){.    i = 
1fe80 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
1fe90 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c  ->arg);.    whil
1fea0 65 28 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41  e( i>=1 && ISSPA
1feb0 43 45 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  CE(lemp->arg[i-1
1fec0 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68  ]) ) i--;.    wh
1fed0 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53  ile( i>=1 && (IS
1fee0 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b  ALNUM(lemp->arg[
1fef0 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61  i-1]) || lemp->a
1ff00 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20  rg[i-1]=='_') ) 
1ff10 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  i--;.    fprintf
1ff20 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1ff30 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22  ARG_SDECL %s;\n"
1ff40 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1ff50 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ff60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ff70 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1ff80 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L ,%s\n",name,le
1ff90 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1ffa0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1ffb0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1ffc0 41 52 47 5f 50 41 52 41 4d 20 2c 25 73 5c 6e 22  ARG_PARAM ,%s\n"
1ffd0 2c 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67  ,name,&lemp->arg
1ffe0 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
1fff0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20000 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
20010 46 45 54 43 48 20 25 73 3d 79 79 70 50 61 72 73  FETCH %s=yypPars
20020 65 72 2d 3e 25 73 3b 5c 6e 22 2c 0a 20 20 20 20  er->%s;\n",.    
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
20040 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d  e,lemp->arg,&lem
20050 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
20060 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
20070 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20080 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50  %sARG_STORE yypP
20090 61 72 73 65 72 2d 3e 25 73 3d 25 73 3b 5c 6e 22  arser->%s=%s;\n"
200a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
200b0 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61     name,&lemp->a
200c0 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67  rg[i],&lemp->arg
200d0 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
200e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
200f0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
20100 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e  ne %sARG_SDECL\n
20110 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
20120 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
20130 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
20140 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
20150 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
20160 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
20170 66 69 6e 65 20 25 73 41 52 47 5f 50 41 52 41 4d  fine %sARG_PARAM
20180 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
20190 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
201a0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
201b0 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d  ARG_FETCH\n",nam
201c0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
201d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
201e0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
201f0 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  RE\n",name); lin
20200 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
20210 20 6c 65 6d 70 2d 3e 63 74 78 20 26 26 20 6c 65   lemp->ctx && le
20220 6d 70 2d 3e 63 74 78 5b 30 5d 20 29 7b 0a 20 20  mp->ctx[0] ){.  
20230 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65    i = lemonStrle
20240 6e 28 6c 65 6d 70 2d 3e 63 74 78 29 3b 0a 20 20  n(lemp->ctx);.  
20250 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26    while( i>=1 &&
20260 20 49 53 53 50 41 43 45 28 6c 65 6d 70 2d 3e 63   ISSPACE(lemp->c
20270 74 78 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a  tx[i-1]) ) i--;.
20280 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
20290 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c 65 6d 70  && (ISALNUM(lemp
202a0 2d 3e 63 74 78 5b 69 2d 31 5d 29 20 7c 7c 20 6c  ->ctx[i-1]) || l
202b0 65 6d 70 2d 3e 63 74 78 5b 69 2d 31 5d 3d 3d 27  emp->ctx[i-1]=='
202c0 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66  _') ) i--;.    f
202d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
202e0 69 6e 65 20 25 73 43 54 58 5f 53 44 45 43 4c 20  ine %sCTX_SDECL 
202f0 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  %s;\n",name,lemp
20300 2d 3e 63 74 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->ctx);  lineno+
20310 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
20320 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54  ut,"#define %sCT
20330 58 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e  X_PDECL ,%s\n",n
20340 61 6d 65 2c 6c 65 6d 70 2d 3e 63 74 78 29 3b 20  ame,lemp->ctx); 
20350 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
20360 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20370 69 6e 65 20 25 73 43 54 58 5f 50 41 52 41 4d 20  ine %sCTX_PARAM 
20380 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 26 6c 65 6d  ,%s\n",name,&lem
20390 70 2d 3e 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e  p->ctx[i]);  lin
203a0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
203b0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
203c0 25 73 43 54 58 5f 46 45 54 43 48 20 25 73 3d 79  %sCTX_FETCH %s=y
203d0 79 70 50 61 72 73 65 72 2d 3e 25 73 3b 5c 6e 22  ypParser->%s;\n"
203e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
203f0 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 63 74     name,lemp->ct
20400 78 2c 26 6c 65 6d 70 2d 3e 63 74 78 5b 69 5d 29  x,&lemp->ctx[i])
20410 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
20420 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
20430 65 66 69 6e 65 20 25 73 43 54 58 5f 53 54 4f 52  efine %sCTX_STOR
20440 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 3d  E yypParser->%s=
20450 25 73 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s;\n",.        
20460 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c           name,&l
20470 65 6d 70 2d 3e 63 74 78 5b 69 5d 2c 26 6c 65 6d  emp->ctx[i],&lem
20480 70 2d 3e 63 74 78 5b 69 5d 29 3b 20 20 6c 69 6e  p->ctx[i]);  lin
20490 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
204a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
204b0 22 23 64 65 66 69 6e 65 20 25 73 43 54 58 5f 53  "#define %sCTX_S
204c0 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  DECL\n",name); l
204d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
204e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
204f0 65 20 25 73 43 54 58 5f 50 44 45 43 4c 5c 6e 22  e %sCTX_PDECL\n"
20500 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
20510 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20520 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43 54 58  t,"#define %sCTX
20530 5f 50 41 52 41 4d 5c 6e 22 2c 6e 61 6d 65 29 3b  _PARAM\n",name);
20540 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
20550 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20560 69 6e 65 20 25 73 43 54 58 5f 46 45 54 43 48 5c  ine %sCTX_FETCH\
20570 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
20580 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
20590 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 43  out,"#define %sC
205a0 54 58 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65  TX_STORE\n",name
205b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
205c0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
205d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
205e0 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
205f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
20600 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 26  ( lemp->errsym &
20610 26 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  & lemp->errsym->
20620 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
20630 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
20640 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
20650 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
20660 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e  sym->index); lin
20670 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
20680 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20690 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c  YYERRSYMDT yy%d\
206a0 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
206b0 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b  >dtnum); lineno+
206c0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
206d0 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
206e0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
206f0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41  ut,"#define YYFA
20700 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c  LLBACK 1\n");  l
20710 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ineno++;.  }..  
20720 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
20730 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62 75 74  ction table, but
20740 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20 69   do not output i
20750 74 20 79 65 74 2e 20 20 54 68 65 20 61 63 74 69  t yet.  The acti
20760 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6d 75  on.  ** table mu
20770 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  st be computed b
20780 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69 6e 67  efore generating
20790 20 74 68 65 20 59 59 4e 53 54 41 54 45 20 6d 61   the YYNSTATE ma
207a0 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  cro because.  **
207b0 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
207c0 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74 65 73   how many states
207d0 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e 61 74   can be eliminat
207e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20 3d 20  ed..  */.  ax = 
207f0 28 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 29  (struct axset *)
20800 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 78   calloc(lemp->nx
20810 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
20820 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 61  ax[0]));.  if( a
20830 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  x==0 ){.    fpri
20840 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
20850 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
20860 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
20870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
20880 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29  p->nxstate; i++)
20890 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
208a0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
208b0 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73   ax[i*2].stp = s
208c0 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e  tp;.    ax[i*2].
208d0 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61  isTkn = 1;.    a
208e0 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d  x[i*2].nAction =
208f0 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20   stp->nTknAct;. 
20900 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70     ax[i*2+1].stp
20910 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69   = stp;.    ax[i
20920 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b  *2+1].isTkn = 0;
20930 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e  .    ax[i*2+1].n
20940 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e  Action = stp->nN
20950 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b  tAct;.  }.  mxTk
20960 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73  nOfst = mnTknOfs
20970 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73  t = 0;.  mxNtOfs
20980 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30  t = mnNtOfst = 0
20990 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65 66 66  ;.  /* In an eff
209a0 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ort to minimize 
209b0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
209c0 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65 20 68   size, use the h
209d0 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20 6f 66  euristic.  ** of
209e0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72   placing the lar
209f0 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65 74 73  gest action sets
20a00 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f 72 28   first */.  for(
20a10 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
20a20 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b  tate*2; i++) ax[
20a30 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20  i].iOrder = i;. 
20a40 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d   qsort(ax, lemp-
20a50 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65  >nxstate*2, size
20a60 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74  of(ax[0]), axset
20a70 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63  _compare);.  pAc
20a80 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c  ttab = acttab_al
20a90 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  loc(lemp->nsymbo
20aa0 6c 2c 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  l, lemp->ntermin
20ab0 61 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  al);.  for(i=0; 
20ac0 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a  i<lemp->nxstate*
20ad0 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69  2 && ax[i].nActi
20ae0 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  on>0; i++){.    
20af0 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b  stp = ax[i].stp;
20b00 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69  .    if( ax[i].i
20b10 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  sTkn ){.      fo
20b20 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
20b30 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
20b40 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
20b50 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
20b60 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c  ap->sp->index>=l
20b70 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
20b80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20b90 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
20ba0 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
20bb0 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
20bc0 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
20bd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
20be0 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
20bf0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
20c00 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
20c10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
20c20 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74  >iTknOfst = actt
20c30 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
20c40 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  b, 1);.      if(
20c50 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
20c60 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
20c70 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
20c80 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
20c90 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
20ca0 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
20cb0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
20cc0 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
20cd0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
20ce0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
20cf0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
20d00 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
20d10 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
20d20 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
20d30 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
20d40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
20d50 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
20d60 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
20d70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
20d80 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
20d90 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
20da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
20db0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
20dc0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
20dd0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
20de0 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
20df0 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
20e00 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
20e10 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
20e20 73 65 72 74 28 70 41 63 74 74 61 62 2c 20 30 29  sert(pActtab, 0)
20e30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
20e40 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73  >iNtOfst<mnNtOfs
20e50 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73  t ) mnNtOfst = s
20e60 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
20e70 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f     if( stp->iNtO
20e80 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d  fst>mxNtOfst ) m
20e90 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  xNtOfst = stp->i
20ea0 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69  NtOfst;.    }.#i
20eb0 66 20 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e  f 0  /* Uncommen
20ec0 74 20 66 6f 72 20 61 20 74 72 61 63 65 20 6f 66  t for a trace of
20ed0 20 68 6f 77 20 74 68 65 20 79 79 5f 61 63 74 69   how the yy_acti
20ee0 6f 6e 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73  on[] table fills
20ef0 20 6f 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e   out */.    { in
20f00 74 20 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20  t jj, nn;.      
20f10 66 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c  for(jj=nn=0; jj<
20f20 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e  pActtab->nAction
20f30 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
20f40 20 69 66 28 20 70 41 63 74 74 61 62 2d 3e 61 41   if( pActtab->aA
20f50 63 74 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e  ction[jj].action
20f60 3c 30 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20  <0 ) nn++;.     
20f70 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
20f80 22 25 34 64 3a 20 53 74 61 74 65 20 25 33 64 20  "%4d: State %3d 
20f90 25 73 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20  %s n: %2d size: 
20fa0 25 35 64 20 66 72 65 65 73 70 61 63 65 3a 20 25  %5d freespace: %
20fb0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
20fc0 20 20 20 69 2c 20 73 74 70 2d 3e 73 74 61 74 65     i, stp->state
20fd0 6e 75 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e  num, ax[i].isTkn
20fe0 20 3f 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61   ? "Token" : "Va
20ff0 72 20 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r  ",.          
21000 20 20 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e     ax[i].nAction
21010 2c 20 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69  , pActtab->nActi
21020 6f 6e 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23  on, nn);.    }.#
21030 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
21040 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  (ax);..  /* Mark
21050 20 72 75 6c 65 73 20 74 68 61 74 20 61 72 65 20   rules that are 
21060 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 66 6f  actually used fo
21070 72 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73  r reduce actions
21080 20 61 66 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20   after all.  ** 
21090 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61  optimizations ha
210a0 76 65 20 62 65 65 6e 20 61 70 70 6c 69 65 64 0a  ve been applied.
210b0 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65    */.  for(rp=le
210c0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
210d0 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64  =rp->next) rp->d
210e0 6f 65 73 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f  oesReduce = LEMO
210f0 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69  N_FALSE;.  for(i
21100 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74  =0; i<lemp->nxst
21110 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ate; i++){.    f
21120 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  or(ap=lemp->sort
21130 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61  ed[i]->ap; ap; a
21140 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
21150 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
21160 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 2d 3e 74  =REDUCE || ap->t
21170 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43 45  ype==SHIFTREDUCE
21180 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e   ){.        ap->
21190 78 2e 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65  x.rp->doesReduce
211a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
211b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
211c0 6e 69 73 68 20 72 65 6e 64 65 72 69 6e 67 20 74  nish rendering t
211d0 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77  he constants now
211e0 20 74 68 61 74 20 74 68 65 20 61 63 74 69 6f 6e   that the action
211f0 20 74 61 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20   table has.  ** 
21200 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f  been computed */
21210 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
21220 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45  #define YYNSTATE
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
21240 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  n",lemp->nxstate
21250 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
21260 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
21270 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 20 20 20  fine YYNRULE    
21280 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
21290 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c  lemp->nrule);  l
212a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
212b0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
212c0 59 59 4e 54 4f 4b 45 4e 20 20 20 20 20 20 20 20  YYNTOKEN        
212d0 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d       %d\n",lemp-
212e0 3e 6e 74 65 72 6d 69 6e 61 6c 29 3b 20 6c 69 6e  >nterminal); lin
212f0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
21300 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
21310 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20 20  _MAX_SHIFT      
21320 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e     %d\n",lemp->n
21330 78 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65 6e  xstate-1); linen
21340 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d  o++;.  i = lemp-
21350 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65 3b  >minShiftReduce;
21360 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
21370 23 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 53  #define YY_MIN_S
21380 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c  HIFTREDUCE   %d\
21390 6e 22 2c 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  n",i); lineno++;
213a0 0a 20 20 69 20 2b 3d 20 6c 65 6d 70 2d 3e 6e 72  .  i += lemp->nr
213b0 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  ule;.  fprintf(o
213c0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
213d0 41 58 5f 53 48 49 46 54 52 45 44 55 43 45 20 20  AX_SHIFTREDUCE  
213e0 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69   %d\n", i-1); li
213f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
21400 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
21410 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20  Y_ERROR_ACTION  
21420 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d      %d\n", lemp-
21430 3e 65 72 72 41 63 74 69 6f 6e 29 3b 20 6c 69 6e  >errAction); lin
21440 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
21450 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
21460 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e 20 20  _ACCEPT_ACTION  
21470 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e     %d\n", lemp->
21480 61 63 63 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65  accAction); line
21490 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
214a0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
214b0 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20  NO_ACTION       
214c0 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6e    %d\n", lemp->n
214d0 6f 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f  oAction); lineno
214e0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
214f0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49  t,"#define YY_MI
21500 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  N_REDUCE        
21510 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6d 69 6e  %d\n", lemp->min
21520 52 65 64 75 63 65 29 3b 20 6c 69 6e 65 6e 6f 2b  Reduce); lineno+
21530 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d  +;.  i = lemp->m
21540 69 6e 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d  inReduce + lemp-
21550 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74  >nrule;.  fprint
21560 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
21570 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20 20 20  Y_MAX_REDUCE    
21580 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b      %d\n", i-1);
21590 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
215a0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
215b0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
215c0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74  );..  /* Now out
215d0 70 75 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74  put the action t
215e0 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
215f0 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
21600 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
21610 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
21620 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
21630 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
21640 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
21650 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
21660 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
21670 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
21680 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
216b0 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
216c0 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
216d0 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
216e0 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
216f0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
21700 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
21710 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21730 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
21740 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
21750 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
21760 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
21770 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
21780 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
217b0 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
217c0 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
217d0 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
217e0 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
217f0 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
21800 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ..  */..  /* Out
21810 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
21820 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d  n table */.  lem
21830 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20  p->nactiontab = 
21840 6e 20 3d 20 61 63 74 74 61 62 5f 61 63 74 69 6f  n = acttab_actio
21850 6e 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b  n_size(pActtab);
21860 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
21870 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e  ze += n*szAction
21880 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  Type;.  fprintf(
21890 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
218a0 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25 64  ACTTAB_COUNT (%d
218b0 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f  )\n", n); lineno
218c0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
218d0 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
218e0 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
218f0 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29  action[] = {\n")
21900 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
21910 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
21920 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69  +){.    int acti
21930 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63  on = acttab_yyac
21940 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29  tion(pActtab, i)
21950 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e  ;.    if( action
21960 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65  <0 ) action = le
21970 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 3b 0a 20 20  mp->noAction;.  
21980 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
21990 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
219a0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
219b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
219c0 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  4d,", action);. 
219d0 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
219e0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
219f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
21a00 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
21a10 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
21a20 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
21a30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
21a40 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
21a50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
21a60 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
21a70 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20  lookahead table 
21a80 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 6c 6f 6f 6b  */.  lemp->nlook
21a90 61 68 65 61 64 74 61 62 20 3d 20 6e 20 3d 20 61  aheadtab = n = a
21aa0 63 74 74 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f  cttab_lookahead_
21ab0 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20  size(pActtab);. 
21ac0 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65   lemp->tablesize
21ad0 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70 65   += n*szCodeType
21ae0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21af0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
21b00 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b  CODETYPE yy_look
21b10 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ahead[] = {\n");
21b20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
21b30 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
21b40 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d 20  ){.    int la = 
21b50 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65  acttab_yylookahe
21b60 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a  ad(pActtab, i);.
21b70 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c      if( la<0 ) l
21b80 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  a = lemp->nsymbo
21b90 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  l;.    if( j==0 
21ba0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
21bb0 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
21bc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21bd0 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a  , " %4d,", la);.
21be0 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
21bf0 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
21c00 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
21c10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21c20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
21c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
21c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
21c50 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
21c60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
21c70 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
21c80 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61  _shift_ofst[] ta
21c90 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d  ble */.  n = lem
21ca0 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68  p->nxstate;.  wh
21cb0 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
21cc0 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
21cd0 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  TknOfst==NO_OFFS
21ce0 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
21cf0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
21d00 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54  e YY_SHIFT_COUNT
21d10 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31      (%d)\n", n-1
21d20 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
21d30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
21d40 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49  fine YY_SHIFT_MI
21d50 4e 20 20 20 20 20 20 28 25 64 29 5c 6e 22 2c 20  N      (%d)\n", 
21d60 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65  mnTknOfst); line
21d70 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
21d80 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
21d90 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 20 20 20  _SHIFT_MAX      
21da0 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66  (%d)\n", mxTknOf
21db0 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  st); lineno++;. 
21dc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73   fprintf(out, "s
21dd0 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79  tatic const %s y
21de0 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d  y_shift_ofst[] =
21df0 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6d 69   {\n",.       mi
21e00 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
21e10 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d  mnTknOfst, lemp-
21e20 3e 6e 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d  >nterminal+lemp-
21e30 3e 6e 61 63 74 69 6f 6e 74 61 62 2c 20 26 73 7a  >nactiontab, &sz
21e40 29 29 3b 0a 20 20 20 20 20 20 20 6c 69 6e 65 6e  ));.       linen
21e50 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62  o++;.  lemp->tab
21e60 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a  lesize += n*sz;.
21e70 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
21e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
21e90 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20  ofst;.    stp = 
21ea0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
21eb0 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d  .    ofst = stp-
21ec0 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69  >iTknOfst;.    i
21ed0 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  f( ofst==NO_OFFS
21ee0 45 54 20 29 20 6f 66 73 74 20 3d 20 6c 65 6d 70  ET ) ofst = lemp
21ef0 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 3b 0a 20 20  ->nactiontab;.  
21f00 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
21f10 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
21f20 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
21f30 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
21f40 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
21f50 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
21f60 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
21f70 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
21f80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
21f90 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
21fa0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
21fb0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
21fc0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
21fd0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
21fe0 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72 65  Output the yy_re
21ff0 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c  duce_ofst[] tabl
22000 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  e */.  n = lemp-
22010 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  >nxstate;.  whil
22020 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
22030 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74  sorted[n-1]->iNt
22040 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
22050 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
22060 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
22070 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 28  Y_REDUCE_COUNT (
22080 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69  %d)\n", n-1); li
22090 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
220a0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
220b0 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20 20  YY_REDUCE_MIN   
220c0 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73  (%d)\n", mnNtOfs
220d0 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
220e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
220f0 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
22100 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d  MAX   (%d)\n", m
22110 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  xNtOfst); lineno
22120 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
22130 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
22140 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66   %s yy_reduce_of
22150 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20  st[] = {\n",.   
22160 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73         minimum_s
22170 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73  ize_type(mnNtOfs
22180 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c 20 26  t-1, mxNtOfst, &
22190 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  sz)); lineno++;.
221a0 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
221b0 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72  e += n*sz;.  for
221c0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
221d0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
221e0 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
221f0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
22200 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  ofst = stp->iNtO
22210 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73  fst;.    if( ofs
22220 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f  t==NO_OFFSET ) o
22230 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d  fst = mnNtOfst -
22240 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   1;.    if( j==0
22250 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
22260 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
22270 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
22280 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
22290 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
222a0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
222b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
222c0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
222d0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
222e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
222f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
22300 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
22310 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
22320 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
22330 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   default action 
22340 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
22350 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
22360 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
22370 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20  PE yy_default[] 
22380 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
22390 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
223a0 78 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e  xstate;.  lemp->
223b0 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73  tablesize += n*s
223c0 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66  zActionType;.  f
223d0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
223e0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
223f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
22400 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
22410 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
22420 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
22430 20 20 69 66 28 20 73 74 70 2d 3e 69 44 66 6c 74    if( stp->iDflt
22440 52 65 64 75 63 65 3c 30 20 29 7b 0a 20 20 20 20  Reduce<0 ){.    
22450 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
22460 20 25 34 64 2c 22 2c 20 6c 65 6d 70 2d 3e 65 72   %4d,", lemp->er
22470 72 41 63 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 65  rAction);.    }e
22480 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
22490 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
224a0 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
224b0 65 20 2b 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  e + lemp->minRed
224c0 75 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uce);.    }.    
224d0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
224e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
224f0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
22500 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
22510 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
22520 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
22530 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
22540 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
22550 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
22560 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
22570 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
22580 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
22590 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c  the table of fal
225a0 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20  lback tokens..  
225b0 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  */.  if( lemp->h
225c0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
225d0 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70     int mx = lemp
225e0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b  ->nterminal - 1;
225f0 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30  .    while( mx>0
22600 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
22610 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d  s[mx]->fallback=
22620 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20  =0 ){ mx--; }.  
22630 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
22640 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a 43 6f  e += (mx+1)*szCo
22650 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f 72 28  deType;.    for(
22660 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29  i=0; i<=mx; i++)
22670 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
22680 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
22690 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
226a0 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
226b0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
226c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
226d0 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
226e0 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
226f0 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
22700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22710 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
22720 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
22730 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
22740 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
22750 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
22760 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
22770 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
22780 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
22790 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
227a0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
227b0 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
227c0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
227d0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
227e0 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
227f0 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
22800 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
22810 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
22820 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
22830 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
22840 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c  line,"\"%s\",",l
22850 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
22860 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69  >name);.    fpri
22870 6e 74 66 28 6f 75 74 2c 22 20 20 2f 2a 20 25 34  ntf(out,"  /* %4
22880 64 20 2a 2f 20 5c 22 25 73 5c 22 2c 5c 6e 22 2c  d */ \"%s\",\n",
22890 69 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  i, lemp->symbols
228a0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  [i]->name); line
228b0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
228c0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
228d0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
228e0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
228f0 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   a table contain
22900 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69 6e  ing a text strin
22910 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
22920 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65   every.  ** rule
22930 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74   in the rule set
22940 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
22950 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
22960 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  on is used.  ** 
22970 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44  when tracing RED
22980 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  UCE actions..  *
22990 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d  /.  for(i=0, rp=
229a0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
229b0 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b  rp=rp->next, i++
229c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
229d0 70 2d 3e 69 52 75 6c 65 3d 3d 69 20 29 3b 0a 20  p->iRule==i );. 
229e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
229f0 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20   /* %3d */ \"", 
22a00 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c  i);.    writeRul
22a10 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a  eText(out, rp);.
22a20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22a30 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  "\",\n"); lineno
22a40 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
22a50 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
22a60 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
22a70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
22a80 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
22a90 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61 20  es every time a 
22aa0 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64  symbol is popped
22ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73   from.  ** the s
22ac0 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65  tack while proce
22ad0 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20  ssing errors or 
22ae0 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67  while destroying
22af0 20 74 68 65 20 70 61 72 73 65 72 2e 0a 20 20 2a   the parser..  *
22b00 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  * (In other word
22b10 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  s, generate the 
22b20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69  %destructor acti
22b30 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons).  */.  if( 
22b40 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20  lemp->tokendest 
22b50 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  ){.    int once 
22b60 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
22b70 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
22b80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
22b90 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
22ba0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
22bb0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [i];.      if( s
22bc0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
22bd0 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e  !=TERMINAL ) con
22be0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
22bf0 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
22c00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
22c10 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c       /* TERMINAL
22c20 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e   Destructor */\n
22c30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
22c40 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
22c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
22c60 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
22c70 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
22c80 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
22c90 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
22ca0 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  o++;.    }.    f
22cb0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
22cc0 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d  nsymbol && lemp-
22cd0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70  >symbols[i]->typ
22ce0 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b  e!=TERMINAL; i++
22cf0 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d  );.    if( i<lem
22d00 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
22d10 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
22d20 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d  tor_code(out,lem
22d30 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65  p->symbols[i],le
22d40 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
22d50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
22d60 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
22d70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
22d80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  }.  }.  if( lemp
22d90 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20  ->vardest ){.   
22da0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
22db0 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20  dflt_sp = 0;.   
22dc0 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
22dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
22de0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
22df0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
22e00 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
22e10 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
22e20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
22e30 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
22e40 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  INAL ||.        
22e50 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c    sp->index<=0 |
22e60 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
22e70 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
22e80 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29        if( once )
22e90 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
22ea0 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a  f(out, "      /*
22eb0 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52   Default NON-TER
22ec0 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72  MINAL Destructor
22ed0 20 2a 2f 5c 6e 22 29 3b 6c 69 6e 65 6e 6f 2b 2b   */\n");lineno++
22ee0 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
22ef0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22f00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
22f10 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
22f20 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
22f30 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
22f40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64  ineno++;.      d
22f50 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20  flt_sp = sp;.   
22f60 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f   }.    if( dflt_
22f70 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  sp!=0 ){.      e
22f80 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
22f90 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c  ode(out,dflt_sp,
22fa0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
22fb0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
22fc0 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
22fd0 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
22fe0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
22ff0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
23000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
23010 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
23020 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
23030 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
23040 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
23050 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73  MINAL || sp->des
23060 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e  tructor==0 ) con
23070 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
23080 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3c 30 20  p->destLineno<0 
23090 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
230a0 41 6c 72 65 61 64 79 20 65 6d 69 74 74 65 64 20  Already emitted 
230b0 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  */.    fprintf(o
230c0 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
230d0 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70   /* %s */\n", sp
230e0 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
230f0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  e); lineno++;.. 
23100 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75     /* Combine du
23110 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63 74  plicate destruct
23120 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ors into a singl
23130 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f  e case */.    fo
23140 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d  r(j=i+1; j<lemp-
23150 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nsymbol; j++){.
23160 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
23170 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d  bol *sp2 = lemp-
23180 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20  >symbols[j];.   
23190 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73 70     if( sp2 && sp
231a0 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41  2->type!=TERMINA
231b0 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72 75  L && sp2->destru
231c0 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20 26  ctor.          &
231d0 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70  & sp2->dtnum==sp
231e0 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20 20  ->dtnum.        
231f0 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d 3e    && strcmp(sp->
23200 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e  destructor,sp2->
23210 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20 29  destructor)==0 )
23220 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  {.         fprin
23230 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
23240 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
23250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23260 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73     sp2->index, s
23270 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  p2->name); linen
23280 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73 70  o++;.         sp
23290 32 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20  2->destLineno = 
232a0 2d 31 3b 20 20 2f 2a 20 41 76 6f 69 64 20 65 6d  -1;  /* Avoid em
232b0 69 74 74 69 6e 67 20 74 68 69 73 20 64 65 73 74  itting this dest
232c0 72 75 63 74 6f 72 20 61 67 61 69 6e 20 2a 2f 0a  ructor again */.
232d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
232e0 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
232f0 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
23300 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
23310 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
23320 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
23330 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
23340 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
23350 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
23360 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
23370 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
23380 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
23390 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72  xecutes whenever
233a0 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
233b0 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  k overflows */. 
233c0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
233d0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66  lemp,lemp->overf
233e0 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  low,&lineno);.  
233f0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
23400 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
23410 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
23420 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 73 20  rate the tables 
23430 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74  of rule informat
23440 69 6f 6e 2e 20 20 79 79 52 75 6c 65 49 6e 66 6f  ion.  yyRuleInfo
23450 4c 68 73 5b 5d 20 61 6e 64 0a 20 20 2a 2a 20 79  Lhs[] and.  ** y
23460 79 52 75 6c 65 49 6e 66 6f 4e 52 68 73 5b 5d 2e  yRuleInfoNRhs[].
23470 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a  .  **.  ** Note:
23480 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
23490 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
234a0 68 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75  hat rules are nu
234b0 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e  mber.  ** sequen
234c0 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67  tually beginning
234d0 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20   with 0..  */.  
234e0 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70  for(i=0, rp=lemp
234f0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
23500 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  p->next, i++){. 
23510 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
23520 20 20 25 34 64 2c 20 20 2f 2a 20 28 25 64 29 20    %4d,  /* (%d) 
23530 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65  ", rp->lhs->inde
23540 78 2c 20 69 29 3b 0a 20 20 20 20 20 72 75 6c 65  x, i);.     rule
23550 5f 70 72 69 6e 74 28 6f 75 74 2c 20 72 70 29 3b  _print(out, rp);
23560 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
23570 2c 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ," */\n"); linen
23580 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
23590 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
235a0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
235b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c  .  for(i=0, rp=l
235c0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
235d0 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29  p=rp->next, i++)
235e0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
235f0 74 2c 22 20 20 25 33 64 2c 20 20 2f 2a 20 28 25  t,"  %3d,  /* (%
23600 64 29 20 22 2c 20 2d 72 70 2d 3e 6e 72 68 73 2c  d) ", -rp->nrhs,
23610 20 69 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70 72   i);.    rule_pr
23620 69 6e 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  int(out, rp);.  
23630 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
23640 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
23650 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
23660 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23670 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23680 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
23690 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
236a0 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
236b0 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
236c0 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70   i = 0;.  for(rp
236d0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
236e0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
236f0 20 20 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74     i += translat
23700 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29  e_code(lemp, rp)
23710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b  ;.  }.  if( i ){
23720 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
23730 2c 22 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f  ,"        YYMINO
23740 52 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72  RTYPE yylhsminor
23750 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
23760 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20  .  }.  /* First 
23770 6f 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68  output rules oth
23780 65 72 20 74 68 61 6e 20 74 68 65 20 64 65 66 61  er than the defa
23790 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66  ult: rule */.  f
237a0 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
237b0 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
237c0 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72  t){.    struct r
237d0 75 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20  ule *rp2;       
237e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72          /* Other
237f0 20 72 75 6c 65 73 20 77 69 74 68 20 74 68 65 20   rules with the 
23800 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  same action */. 
23810 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45     if( rp->codeE
23820 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  mitted ) continu
23830 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6e  e;.    if( rp->n
23840 6f 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 2f  oCode ){.      /
23850 2a 20 4e 6f 20 43 20 63 6f 64 65 20 61 63 74 69  * No C code acti
23860 6f 6e 73 2c 20 73 6f 20 74 68 69 73 20 77 69 6c  ons, so this wil
23870 6c 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65  l be part of the
23880 20 22 64 65 66 61 75 6c 74 3a 22 20 72 75 6c 65   "default:" rule
23890 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
238a0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ue;.    }.    fp
238b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
238c0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
238d0 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
238e0 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
238f0 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69  t, rp);.    fpri
23900 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22  ntf(out, " */\n"
23910 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
23920 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78   for(rp2=rp->nex
23930 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d  t; rp2; rp2=rp2-
23940 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
23950 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d  ( rp2->code==rp-
23960 3e 63 6f 64 65 20 26 26 20 72 70 32 2d 3e 63 6f  >code && rp2->co
23970 64 65 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63 6f  dePrefix==rp->co
23980 64 65 50 72 65 66 69 78 0a 20 20 20 20 20 20 20  dePrefix.       
23990 20 20 20 20 20 20 26 26 20 72 70 32 2d 3e 63 6f        && rp2->co
239a0 64 65 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63 6f  deSuffix==rp->co
239b0 64 65 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20  deSuffix ){.    
239c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
239d0 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
239e0 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65  /* ", rp2->iRule
239f0 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
23a00 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
23a10 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  2);.        fpri
23a20 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74  ntf(out," */ yyt
23a30 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f  estcase(yyruleno
23a40 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e  ==%d);\n", rp2->
23a50 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  iRule); lineno++
23a60 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63  ;.        rp2->c
23a70 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a  odeEmitted = 1;.
23a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23a90 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
23aa0 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
23ab0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
23ac0 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
23ad0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
23ae0 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d 69  .    rp->codeEmi
23af0 74 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  tted = 1;.  }.  
23b00 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70  /* Finally, outp
23b10 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  ut the default: 
23b20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65  rule.  We choose
23b30 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a   as the default:
23b40 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20   all.  ** empty 
23b50 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70  actions. */.  fp
23b60 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
23b70 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c   default:\n"); l
23b80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72  ineno++;.  for(r
23b90 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
23ba0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
23bb0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
23bc0 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e  Emitted ) contin
23bd0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
23be0 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20 20  rp->noCode );.  
23bf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
23c00 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20       /* (%d) ", 
23c10 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
23c20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
23c30 74 2c 20 72 70 29 3b 0a 20 20 20 20 69 66 28 20  t, rp);.    if( 
23c40 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 29  rp->doesReduce )
23c50 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
23c60 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74  out, " */ yytest
23c70 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25  case(yyruleno==%
23c80 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75 6c  d);\n", rp->iRul
23c90 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
23ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
23cb0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 4f  printf(out, " (O
23cc0 50 54 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a 2f  PTIMIZED OUT) */
23cd0 20 61 73 73 65 72 74 28 79 79 72 75 6c 65 6e 6f   assert(yyruleno
23ce0 21 3d 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20 20  !=%d);\n",.     
23cf0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 52 75           rp->iRu
23d00 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  le); lineno++;. 
23d10 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
23d20 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
23d30 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
23d40 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
23d50 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23d60 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23d70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
23d80 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
23d90 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c   if a parse fail
23da0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
23db0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
23dc0 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f  >failure,&lineno
23dd0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
23de0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
23df0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
23e00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
23e10 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
23e20 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
23e30 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70  r occurs */.  tp
23e40 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
23e50 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c  p,lemp->error,&l
23e60 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
23e70 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
23e80 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
23e90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
23ea0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
23eb0 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73  es when the pars
23ec0 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69  er accepts its i
23ed0 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  nput */.  tplt_p
23ee0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
23ef0 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65  mp->accept,&line
23f00 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
23f10 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
23f20 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
23f30 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
23f40 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
23f50 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
23f60 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
23f70 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
23f80 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  acode,&lineno);.
23f90 0a 20 20 61 63 74 74 61 62 5f 66 72 65 65 28 70  .  acttab_free(p
23fa0 41 63 74 74 61 62 29 3b 0a 20 20 66 63 6c 6f 73  Acttab);.  fclos
23fb0 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
23fc0 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
23fd0 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
23fe0 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
23ff0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
24000 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
24010 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
24020 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp).{.  FILE *o
24030 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74  ut, *in;.  const
24040 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
24050 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
24060 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
24070 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
24080 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
24090 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
240a0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
240b0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
240c0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
240d0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
240e0 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
240f0 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
24100 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
24110 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78  n ){.    int nex
24120 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69  tChar;.    for(i
24130 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
24140 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c  minal && fgets(l
24150 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
24160 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65  ; i++){.      le
24170 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74  mon_sprintf(patt
24180 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25  ern,"#define %s%
24190 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20  -30s %3d\n",.   
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79   prefix,lemp->sy
241c0 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
241d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
241e0 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
241f0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
24200 0a 20 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20  .    nextChar = 
24210 66 67 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66  fgetc(in);.    f
24220 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
24230 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
24240 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61  minal && nextCha
24250 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  r==EOF ){.      
24260 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20  /* No change in 
24270 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74  the file.  Don't
24280 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a   rewrite it. */.
24290 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
242a0 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20    }.  }.  out = 
242b0 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
242c0 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .h","wb");.  if(
242d0 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
242e0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
242f0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
24300 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
24310 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
24320 20 25 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %3d\n",prefix,l
24330 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
24340 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
24350 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
24360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
24370 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
24380 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
24390 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
243a0 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
243b0 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
243c0 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
243d0 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
243e0 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
243f0 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
24400 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
24410 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
24420 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65 20    Except, there 
24430 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66  is no default if
24440 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
24450 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73  ken.** is a poss
24460 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e  ible look-ahead.
24470 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
24480 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c  sTables(struct l
24490 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
244a0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
244b0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
244c0 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e  on *ap, *ap2, *n
244d0 65 78 74 61 70 3b 0a 20 20 73 74 72 75 63 74 20  extap;.  struct 
244e0 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
244f0 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
24500 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
24510 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63  .  int usesWildc
24520 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ard;..  for(i=0;
24530 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
24540 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
24550 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
24560 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
24570 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
24580 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
24590 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61   = 0;..    for(a
245a0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
245b0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
245c0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
245d0 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70  =SHIFT && ap->sp
245e0 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ==lemp->wildcard
245f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73   ){.        uses
24600 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20  Wildcard = 1;.  
24610 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24620 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
24630 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24640 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
24650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
24660 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69  lhsStart ) conti
24670 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nue;.      if( r
24680 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
24690 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
246a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
246b0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
246c0 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
246d0 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
246e0 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
246f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24700 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
24710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
24720 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
24730 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
24740 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
24750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24760 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
24770 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
24780 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
24790 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
247a0 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
247b0 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20   make a default 
247c0 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
247d0 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c   rules to defaul
247e0 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
247f0 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66  at least 1 or if
24800 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
24810 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ken is a possibl
24820 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65  e.    ** lookahe
24830 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ad..    */.    i
24840 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73  f( nbest<1 || us
24850 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e  esWildcard ) con
24860 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20  tinue;...    /* 
24870 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67  Combine matching
24880 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20   REDUCE actions 
24890 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65  into a single de
248a0 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72  fault */.    for
248b0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
248c0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
248d0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
248e0 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
248f0 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62  >x.rp==rbest ) b
24900 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24910 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
24920 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
24930 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
24940 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
24950 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
24960 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
24970 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
24980 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
24990 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74  p==rbest ) ap->t
249a0 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a  ype = NOT_USED;.
249b0 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61      }.    stp->a
249c0 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
249d0 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66  stp->ap);..    f
249e0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
249f0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
24a00 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
24a10 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62 72 65  ype==SHIFT ) bre
24a20 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  ak;.      if( ap
24a30 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
24a40 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73  & ap->x.rp!=rbes
24a50 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
24a60 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29  .    if( ap==0 )
24a70 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61 75 74  {.      stp->aut
24a80 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20  oReduce = 1;.   
24a90 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64     stp->pDfltRed
24aa0 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20 20 20  uce = rbest;.   
24ab0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
24ac0 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
24ad0 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
24ae0 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f  and actions.  Co
24af0 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65 72 79  nvert.  ** every
24b00 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20   action that is 
24b10 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20 61 75  a SHIFT to an au
24b20 74 6f 52 65 64 75 63 65 20 73 74 61 74 65 20 69  toReduce state i
24b30 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46 54  nto.  ** a SHIFT
24b40 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20  REDUCE action.. 
24b50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
24b60 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
24b70 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
24b80 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
24b90 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
24ba0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
24bb0 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74 72 75  ext){.      stru
24bc0 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78 74 53  ct state *pNextS
24bd0 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  tate;.      if( 
24be0 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 20  ap->type!=SHIFT 
24bf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24c00 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d 20 61    pNextState = a
24c10 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20  p->x.stp;.      
24c20 69 66 28 20 70 4e 65 78 74 53 74 61 74 65 2d 3e  if( pNextState->
24c30 61 75 74 6f 52 65 64 75 63 65 20 26 26 20 70 4e  autoReduce && pN
24c40 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52  extState->pDfltR
24c50 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20 20 20  educe!=0 ){.    
24c60 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 53      ap->type = S
24c70 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20 20 20  HIFTREDUCE;.    
24c80 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70      ap->x.rp = p
24c90 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74  NextState->pDflt
24ca0 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a  Reduce;.      }.
24cb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24cc0 49 66 20 61 20 53 48 49 46 54 52 45 44 55 43 45  If a SHIFTREDUCE
24cd0 20 61 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65   action specifie
24ce0 73 20 61 20 72 75 6c 65 20 74 68 61 74 20 68 61  s a rule that ha
24cf0 73 20 61 20 73 69 6e 67 6c 65 20 52 48 53 20 74  s a single RHS t
24d00 65 72 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69 6e  erm.  ** (meanin
24d10 67 20 74 68 61 74 20 74 68 65 20 53 48 49 46 54  g that the SHIFT
24d20 52 45 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e 64  REDUCE will land
24d30 20 62 61 63 6b 20 69 6e 20 74 68 65 20 73 74 61   back in the sta
24d40 74 65 20 77 68 65 72 65 20 69 74 0a 20 20 2a 2a  te where it.  **
24d50 20 73 74 61 72 74 65 64 29 20 61 6e 64 20 69 66   started) and if
24d60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 43 2d 63   there is no C-c
24d70 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ode associated w
24d80 69 74 68 20 74 68 65 20 72 65 64 75 63 65 20 61  ith the reduce a
24d90 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e  ction,.  ** then
24da0 20 77 65 20 63 61 6e 20 67 6f 20 61 68 65 61 64   we can go ahead
24db0 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65   and convert the
24dc0 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68   action to be th
24dd0 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 20 20  e same as the.  
24de0 2a 2a 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ** action for th
24df0 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
24e00 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
24e10 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
24e20 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
24e30 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
24e40 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  i];.    for(ap=s
24e50 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 6e  tp->ap; ap; ap=n
24e60 65 78 74 61 70 29 7b 0a 20 20 20 20 20 20 6e 65  extap){.      ne
24e70 78 74 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74 3b  xtap = ap->next;
24e80 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
24e90 79 70 65 21 3d 53 48 49 46 54 52 45 44 55 43 45  ype!=SHIFTREDUCE
24ea0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24eb0 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
24ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
24ed0 6e 6f 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74  noCode==0 ) cont
24ee0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
24ef0 72 70 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63 6f  rp->nrhs!=1 ) co
24f00 6e 74 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20 20  ntinue;.#if 1.  
24f10 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70 6c      /* Only appl
24f20 79 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  y this optimizat
24f30 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d 69  ion to non-termi
24f40 6e 61 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64 20  nals.  It would 
24f50 62 65 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20 2a  be OK to.      *
24f60 2a 20 61 70 70 6c 79 20 69 74 20 74 6f 20 74 65  * apply it to te
24f70 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 74  rminal symbols t
24f80 6f 6f 2c 20 62 75 74 20 74 68 61 74 20 6d 61 6b  oo, but that mak
24f90 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 61  es the parser ta
24fa0 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  bles.      ** la
24fb0 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rger. */.      i
24fc0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
24fd0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
24fe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e   ) continue;.#en
24ff0 64 69 66 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  dif.      /* If 
25000 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
25010 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
25020 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
25030 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f  an be applied */
25040 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20  .      nextap = 
25050 61 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  ap;.      for(ap
25060 32 3d 73 74 70 2d 3e 61 70 3b 20 61 70 32 20 26  2=stp->ap; ap2 &
25070 26 20 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61 70  & (ap2==ap || ap
25080 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29 3b  2->sp!=rp->lhs);
25090 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b   ap2=ap2->next){
250a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
250b0 61 70 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ap2!=0 );.      
250c0 61 70 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32 2d  ap->spOpt = ap2-
250d0 3e 73 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e 74  >sp;.      ap->t
250e0 79 70 65 20 3d 20 61 70 32 2d 3e 74 79 70 65 3b  ype = ap2->type;
250f0 0a 20 20 20 20 20 20 61 70 2d 3e 78 20 3d 20 61  .      ap->x = a
25100 70 32 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  p2->x;.    }.  }
25110 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
25120 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f  re two states fo
25130 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
25140 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72  es.  The smaller
25150 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a   state is the.**
25160 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f   one with the mo
25170 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  st non-terminal 
25180 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
25190 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
251a0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e  number.** of non
251b0 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e  -terminal action
251c0 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c  s, then the smal
251d0 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77  ler is the one w
251e0 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20  ith the most.** 
251f0 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a  token actions..*
25200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61  /.static int sta
25210 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28  teResortCompare(
25220 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
25230 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
25240 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74   const struct st
25250 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73  ate *pA = *(cons
25260 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a  t struct state**
25270 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  )a;.  const stru
25280 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a  ct state *pB = *
25290 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
252a0 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e  ate**)b;.  int n
252b0 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74  ;..  n = pB->nNt
252c0 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74  Act - pA->nNtAct
252d0 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ;.  if( n==0 ){.
252e0 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e      n = pB->nTkn
252f0 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63  Act - pA->nTknAc
25300 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  t;.    if( n==0 
25310 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d  ){.      n = pB-
25320 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e  >statenum - pA->
25330 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a  statenum;.    }.
25340 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21    }.  assert( n!
25350 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  =0 );.  return n
25360 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75  ;.}.../*.** Renu
25370 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20  mber and resort 
25380 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
25390 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
253a0 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75   choices.** occu
253b0 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45  r at the end.  E
253c0 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74  xcept, keep stat
253d0 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73 74  e 0 as the first
253e0 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20   state..*/.void 
253f0 52 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72  ResortStates(str
25400 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
25410 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
25420 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
25430 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
25440 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   *ap;..  for(i=0
25450 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
25460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
25470 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
25480 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e  ];.    stp->nTkn
25490 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  Act = stp->nNtAc
254a0 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e  t = 0;.    stp->
254b0 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 2d 31  iDfltReduce = -1
254c0 3b 20 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20 61  ; /* Init dflt a
254d0 63 74 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78  ction to "syntax
254e0 20 65 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73   error" */.    s
254f0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
25500 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
25510 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
25520 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
25530 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
25540 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
25550 20 20 20 20 69 6e 74 20 69 41 63 74 69 6f 6e 20      int iAction 
25560 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  = compute_action
25570 28 6c 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20  (lemp,ap);.     
25580 20 69 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20   if( iAction>=0 
25590 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
255a0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
255b0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a  p->nterminal ){.
255c0 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
255d0 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20  TknAct++;.      
255e0 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e    }else if( ap->
255f0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
25600 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
25610 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74       stp->nNtAct
25620 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
25630 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
25640 65 72 74 28 20 73 74 70 2d 3e 61 75 74 6f 52 65  ert( stp->autoRe
25650 64 75 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e  duce==0 || stp->
25660 70 44 66 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d  pDfltReduce==ap-
25670 3e 78 2e 72 70 20 29 3b 0a 20 20 20 20 20 20 20  >x.rp );.       
25680 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64     stp->iDfltRed
25690 75 63 65 20 3d 20 69 41 63 74 69 6f 6e 3b 0a 20  uce = iAction;. 
256a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
256b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f  .    }.  }.  qso
256c0 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  rt(&lemp->sorted
256d0 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  [1], lemp->nstat
256e0 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70  e-1, sizeof(lemp
256f0 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20  ->sorted[0]),.  
25700 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72        stateResor
25710 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72  tCompare);.  for
25720 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
25730 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
25740 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
25750 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20  >statenum = i;. 
25760 20 7d 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61   }.  lemp->nxsta
25770 74 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  te = lemp->nstat
25780 65 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d 70  e;.  while( lemp
25790 2d 3e 6e 78 73 74 61 74 65 3e 31 20 26 26 20 6c  ->nxstate>1 && l
257a0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d 70  emp->sorted[lemp
257b0 2d 3e 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61 75  ->nxstate-1]->au
257c0 74 6f 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20  toReduce ){.    
257d0 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b  lemp->nxstate--;
257e0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  .  }.}.../******
257f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
25800 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63   the file "set.c
25810 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
25820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25830 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65  ******/./*.** Se
25840 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72  t manipulation r
25850 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20  outines for the 
25860 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
25870 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
25880 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b  ic int size = 0;
25890 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74  ../* Set the set
258a0 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65   size */.void Se
258b0 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20  tSize(int n).{. 
258c0 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a   size = n+1;.}..
258d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
258e0 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53  w set */.char *S
258f0 65 74 4e 65 77 28 76 6f 69 64 29 7b 0a 20 20 63  etNew(void){.  c
25900 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63  har *s;.  s = (c
25910 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  har*)calloc( siz
25920 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d  e, 1);.  if( s==
25930 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  0 ){.    extern 
25940 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
25950 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  r();.    memory_
25960 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  error();.  }.  r
25970 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44  eturn s;.}../* D
25980 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
25990 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28  */.void SetFree(
259a0 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65  char *s).{.  fre
259b0 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  e(s);.}../* Add 
259c0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
259d0 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72   the set.  Retur
259e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c  n TRUE if the el
259f0 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a  ement was added.
25a00 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ** and FALSE if 
25a10 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74  it was already t
25a20 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  here. */.int Set
25a30 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e 74  Add(char *s, int
25a40 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a   e).{.  int rv;.
25a50 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26    assert( e>=0 &
25a60 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76  & e<size );.  rv
25a70 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20   = s[e];.  s[e] 
25a80 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72  = 1;.  return !r
25a90 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65  v;.}../* Add eve
25aa0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32  ry element of s2
25ab0 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20   to s1.  Return 
25ac0 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67  TRUE if s1 chang
25ad0 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e  es. */.int SetUn
25ae0 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63 68  ion(char *s1, ch
25af0 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20  ar *s2).{.  int 
25b00 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70  i, progress;.  p
25b10 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66  rogress = 0;.  f
25b20 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
25b30 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32  i++){.    if( s2
25b40 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
25b50 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d  e;.    if( s1[i]
25b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
25b70 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
25b80 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20   s1[i] = 1;.    
25b90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
25ba0 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a  rogress;.}./****
25bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bc0 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
25bd0 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a   "table.c" *****
25be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bf0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
25c00 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
25c10 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
25c20 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
25c30 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
25c40 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
25c50 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
25c60 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
25c70 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
25c80 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
25c90 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
25ca0 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
25cb0 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
25cc0 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
25cd0 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
25ce0 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
25cf0 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
25d00 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
25d10 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
25d20 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
25d30 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
25d40 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56  erator..*/..PRIV
25d50 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74 72  ATE unsigned str
25d60 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20  hash(const char 
25d70 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *x).{.  unsigned
25d80 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   h = 0;.  while(
25d90 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33 20 2b   *x ) h = h*13 +
25da0 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72   *(x++);.  retur
25db0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73  n h;.}../* Works
25dc0 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f   like strdup, so
25dd0 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73  rt of.  Save a s
25de0 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65  tring in malloce
25df0 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a  d memory, but.**
25e00 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e   keep strings in
25e10 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74   a table so that
25e20 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67   the same string
25e30 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a   is not in more.
25e40 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63  ** than one plac
25e50 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
25e60 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20   *Strsafe(const 
25e70 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e  char *y).{.  con
25e80 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  st char *z;.  ch
25e90 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20  ar *cpy;..  if( 
25ea0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
25eb0 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66  .  z = Strsafe_f
25ec0 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d  ind(y);.  if( z=
25ed0 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68 61 72  =0 && (cpy=(char
25ee0 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e   *)malloc( lemon
25ef0 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d  Strlen(y)+1 ))!=
25f00 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73  0 ){.    lemon_s
25f10 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20  trcpy(cpy,y);.  
25f20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53    z = cpy;.    S
25f30 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29  trsafe_insert(z)
25f40 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68  ;.  }.  MemoryCh
25f50 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  eck(z);.  return
25f60 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   z;.}../* There 
25f70 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
25f80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
25f90 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
25fa0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
25fb0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
25fc0 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x1"..*/.struct
25fd0 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69   s_x1 {.  int si
25fe0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
25ff0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
26000 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
26010 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
26040 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
26050 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
26080 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
26090 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
260a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
260b0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
260c0 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
260d0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74  ruct s_x1node *t
260e0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
260f0 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
26100 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
26110 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
26120 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
26130 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
26140 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
26150 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
26160 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
26170 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
26180 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
26190 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
261a0 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x1"..*/.typedef 
261b0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
261c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
261d0 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  data;        /* 
261e0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
261f0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e  ruct s_x1node *n
26200 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
26210 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
26220 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
26230 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66  uct s_x1node **f
26240 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
26250 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f  s link */.} x1no
26260 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
26270 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
26280 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
26290 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
262a0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
262b0 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78  c struct s_x1 *x
262c0 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  1a;../* Allocate
262d0 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
262e0 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
262f0 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f   Strsafe_init(vo
26300 69 64 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29  id){.  if( x1a )
26310 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d   return;.  x1a =
26320 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d   (struct s_x1*)m
26330 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
26340 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20  ruct s_x1) );.  
26350 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78  if( x1a ){.    x
26360 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b  1a->size = 1024;
26370 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20  .    x1a->count 
26380 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62  = 0;.    x1a->tb
26390 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c  l = (x1node*)cal
263a0 6c 6f 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66  loc(1024, sizeof
263b0 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
263c0 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x1node*));.   
263d0 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30   if( x1a->tbl==0
263e0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
263f0 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d  1a);.      x1a =
26400 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
26410 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
26420 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e    x1a->ht = (x1n
26430 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c  ode**)&(x1a->tbl
26440 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66  [1024]);.      f
26450 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20  or(i=0; i<1024; 
26460 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20  i++) x1a->ht[i] 
26470 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
26480 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
26490 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
264a0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
264b0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
264c0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
264d0 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
264e0 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
264f0 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
26500 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e  rsafe_insert(con
26510 73 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b  st char *data).{
26520 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x1node *np;. 
26530 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75   unsigned h;.  u
26540 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69  nsigned ph;..  i
26550 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
26560 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
26570 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
26580 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
26590 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
265a0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
265b0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
265c0 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
265d0 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
265e0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
265f0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
26600 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
26610 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
26620 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
26630 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
26640 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
26650 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
26660 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
26670 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e  .  }.  if( x1a->
26680 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65  count>=x1a->size
26690 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
266a0 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
266b0 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
266c0 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69  .    int i,arrSi
266d0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
266e0 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x1 array;.    a
266f0 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53  rray.size = arrS
26700 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a  ize = x1a->size*
26710 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
26720 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b  nt = x1a->count;
26730 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
26740 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x1node*)calloc
26750 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
26760 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
26770 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x1node*));.   
26780 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
26790 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
267a0 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
267b0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
267c0 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
267d0 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x1node**)&(array
267e0 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a  .tbl[arrSize]);.
267f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
26800 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
26810 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
26820 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61    for(i=0; i<x1a
26830 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
26840 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64       x1node *old
26850 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
26860 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d    oldnp = &(x1a-
26870 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
26880 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e  h = strhash(oldn
26890 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72 53  p->data) & (arrS
268a0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
268b0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
268c0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
268d0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
268e0 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
268f0 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
26900 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
26910 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
26920 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
26930 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
26940 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
26950 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
26960 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
26970 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
26980 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
26990 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x1a->tbl);.  
269a0 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a    *x1a = array;.
269b0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
269c0 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
269d0 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
269e0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
269f0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d   &(x1a->tbl[x1a-
26a00 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
26a10 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
26a20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20   if( x1a->ht[h] 
26a30 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x1a->ht[h]->fr
26a40 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
26a50 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
26a60 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61  1a->ht[h];.  x1a
26a70 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
26a80 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61  np->from = &(x1a
26a90 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
26aa0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
26ab0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
26ac0 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
26ad0 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
26ae0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
26af0 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
26b00 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  */.const char *S
26b10 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73  trsafe_find(cons
26b20 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
26b30 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
26b40 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
26b50 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
26b60 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
26b70 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
26b80 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
26b90 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
26ba0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
26bb0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
26bc0 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
26bd0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
26be0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
26bf0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
26c00 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
26c10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
26c20 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
26c30 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
26c40 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
26c50 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
26c60 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
26c70 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
26c80 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
26c90 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
26ca0 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73  *Symbol_new(cons
26cb0 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73  t char *x).{.  s
26cc0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
26cd0 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  ;..  sp = Symbol
26ce0 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20  _find(x);.  if( 
26cf0 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20  sp==0 ){.    sp 
26d00 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
26d10 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a   *)calloc(1, siz
26d20 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
26d30 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79  l) );.    Memory
26d40 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73  Check(sp);.    s
26d50 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66  p->name = Strsaf
26d60 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79  e(x);.    sp->ty
26d70 70 65 20 3d 20 49 53 55 50 50 45 52 28 2a 78 29  pe = ISUPPER(*x)
26d80 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f   ? TERMINAL : NO
26d90 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73  NTERMINAL;.    s
26da0 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  p->rule = 0;.   
26db0 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
26dc0 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20  0;.    sp->prec 
26dd0 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73  = -1;.    sp->as
26de0 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73  soc = UNK;.    s
26df0 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b  p->firstset = 0;
26e00 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20  .    sp->lambda 
26e10 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
26e20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f     sp->destructo
26e30 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  r = 0;.    sp->d
26e40 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20  estLineno = 0;. 
26e50 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20     sp->datatype 
26e60 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65  = 0;.    sp->use
26e70 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d  Cnt = 0;.    Sym
26e80 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70  bol_insert(sp,sp
26e90 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  ->name);.  }.  s
26ea0 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72  p->useCnt++;.  r
26eb0 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20  eturn sp;.}../* 
26ec0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62  Compare two symb
26ed0 6f 6c 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ols for sorting 
26ee0 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72  purposes.  Retur
26ef0 6e 20 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a  n negative,.** z
26f00 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
26f10 20 69 66 20 61 20 69 73 20 6c 65 73 73 20 74 68   if a is less th
26f20 65 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  en, equal to, or
26f30 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
26f40 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c   b..**.** Symbol
26f50 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
26f60 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74  h upper case let
26f70 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20  ters (terminals 
26f80 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75  or tokens).** mu
26f90 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73  st sort before s
26fa0 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
26fb0 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73  n with lower cas
26fc0 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f  e letters.** (no
26fd0 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41  n-terminals).  A
26fe0 6e 64 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  nd MULTITERMINAL
26ff0 20 73 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65   symbols (create
27000 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25  d using the.** %
27010 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65  token_class dire
27020 63 74 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74  ctive) must sort
27030 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e 64   at the very end
27040 2e 20 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20  . Other than.** 
27050 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20  that, the order 
27060 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
27070 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65  .**.** We find e
27080 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68  xperimentally th
27090 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73  at leaving the s
270a0 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20  ymbols in their 
270b0 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65  original.** orde
270c0 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65  r (the order the
270d0 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  y appeared in th
270e0 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20  e grammar file) 
270f0 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61  gives the.** sma
27100 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62  llest parser tab
27110 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a  les in SQLite..*
27120 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  /.int Symbolcmpp
27130 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c  (const void *_a,
27140 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29   const void *_b)
27150 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
27160 74 20 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28  t symbol *a = *(
27170 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
27180 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f  bol **) _a;.  co
27190 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
271a0 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73  l *b = *(const s
271b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
271c0 20 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20   _b;.  int i1 = 
271d0 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  a->type==MULTITE
271e0 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e  RMINAL ? 3 : a->
271f0 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20  name[0]>'Z' ? 2 
27200 3a 20 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  : 1;.  int i2 = 
27210 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  b->type==MULTITE
27220 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e  RMINAL ? 3 : b->
27230 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20  name[0]>'Z' ? 2 
27240 3a 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31  : 1;.  return i1
27250 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20  ==i2 ? a->index 
27260 2d 20 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20  - b->index : i1 
27270 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  - i2;.}../* Ther
27280 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
27290 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
272a0 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
272b0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
272c0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
272d0 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x2"..*/.stru
272e0 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20  ct s_x2 {.  int 
272f0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
27300 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
27310 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
27320 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
27350 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
27360 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
27390 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
273a0 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
273b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
273c0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
273d0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
273e0 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
273f0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
27400 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
27410 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
27420 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
27430 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
27440 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
27450 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
27460 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
27470 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
27480 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
27490 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
274a0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
274b0 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x2"..*/.typede
274c0 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64  f struct s_x2nod
274d0 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
274e0 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f  bol *data;     /
274f0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
27500 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b  const char *key;
27510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27520 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
27530 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x2node *next; 
27540 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
27550 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
27560 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
27570 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x2node **from; 
27580 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
27590 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a  k */.} x2node;..
275a0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
275b0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
275c0 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
275d0 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
275e0 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
275f0 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a  uct s_x2 *x2a;..
27600 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
27610 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
27620 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62  ray */.void Symb
27630 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  ol_init(void){. 
27640 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72   if( x2a ) retur
27650 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75  n;.  x2a = (stru
27660 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28  ct s_x2*)malloc(
27670 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
27680 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32  _x2) );.  if( x2
27690 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69  a ){.    x2a->si
276a0 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32  ze = 128;.    x2
276b0 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
276c0 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32    x2a->tbl = (x2
276d0 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38  node*)calloc(128
276e0 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29  , sizeof(x2node)
276f0 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
27700 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61  *));.    if( x2a
27710 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
27720 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20    free(x2a);.   
27730 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20     x2a = 0;.    
27740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
27750 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68   i;.      x2a->h
27760 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
27770 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x2a->tbl[128]);.
27780 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
27790 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e  <128; i++) x2a->
277a0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
277b0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
277c0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
277d0 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
277e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
277f0 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
27800 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
27810 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
27820 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
27830 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72  int Symbol_inser
27840 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t(struct symbol 
27850 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
27860 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f  r *key).{.  x2no
27870 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
27880 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
27890 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d   ph;..  if( x2a=
278a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
278b0 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65   ph = strhash(ke
278c0 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
278d0 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
278e0 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
278f0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
27900 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
27910 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
27920 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
27930 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
27940 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
27950 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
27960 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
27970 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
27980 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
27990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
279a0 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
279b0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
279c0 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61   x2a->count>=x2a
279d0 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
279e0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
279f0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
27a00 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
27a10 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74  ,arrSize;.    st
27a20 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
27a30 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
27a40 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d  = arrSize = x2a-
27a50 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
27a60 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e  ay.count = x2a->
27a70 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
27a80 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  .tbl = (x2node*)
27a90 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
27aa0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
27ab0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
27ac0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
27ad0 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
27ae0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
27af0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
27b00 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
27b10 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
27b20 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69  (array.tbl[arrSi
27b30 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
27b40 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
27b50 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
27b60 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
27b70 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x2a->count; i
27b80 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64  ++){.      x2nod
27b90 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
27ba0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
27bb0 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x2a->tbl[i]);.
27bc0 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
27bd0 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
27be0 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
27bf0 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
27c00 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
27c10 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
27c20 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
27c30 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
27c40 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
27c50 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
27c60 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
27c70 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
27c80 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
27c90 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
27ca0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
27cb0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
27cc0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
27cd0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
27ce0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
27cf0 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29    free(x2a->tbl)
27d00 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72  ;.    *x2a = arr
27d10 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
27d20 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
27d30 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
27d40 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
27d50 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
27d60 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x2a->count++]);.
27d70 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
27d80 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
27d90 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68  ta;.  if( x2a->h
27da0 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68  t[h] ) x2a->ht[h
27db0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
27dc0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
27dd0 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x2a->ht[h];.
27de0 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x2a->ht[h] = n
27df0 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
27e00 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x2a->ht[h]);. 
27e10 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
27e20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
27e30 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
27e40 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
27e50 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
27e60 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
27e70 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
27e80 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
27e90 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  nd(const char *k
27ea0 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
27eb0 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
27ec0 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
27ed0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
27ee0 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
27ef0 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
27f00 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
27f10 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
27f20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
27f30 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
27f40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
27f50 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
27f60 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
27f70 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
27f80 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
27f90 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
27fa0 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
27fb0 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
27fc0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
27fd0 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a  mbol_Nth(int n).
27fe0 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
27ff0 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78  l *data;.  if( x
28000 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d  2a && n>0 && n<=
28010 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20  x2a->count ){.  
28020 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62    data = x2a->tb
28030 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d  l[n-1].data;.  }
28040 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
28050 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
28060 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74   data;.}../* Ret
28070 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
28080 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74  the array */.int
28090 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a   Symbol_count().
280a0 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f  {.  return x2a ?
280b0 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b   x2a->count : 0;
280c0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
280d0 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
280e0 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
280f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
28100 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
28110 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
28120 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
28130 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
28140 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
28150 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
28160 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
28170 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
28180 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a  ymbol_arrayof().
28190 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
281a0 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  l **array;.  int
281b0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66   i,arrSize;.  if
281c0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
281d0 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d  n 0;.  arrSize =
281e0 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
281f0 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
28200 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28  ymbol **)calloc(
28210 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
28220 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
28230 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
28240 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
28250 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
28260 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74  rray[i] = x2a->t
28270 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
28280 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
28290 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
282a0 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  o configurations
282b0 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d   */.int Configcm
282c0 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61  p(const char *_a
282d0 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29  ,const char *_b)
282e0 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
282f0 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73  t config *a = (s
28300 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
28310 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
28320 63 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28  ct config *b = (
28330 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
28340 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20   _b;.  int x;.  
28350 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  x = a->rp->index
28360 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
28370 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20  .  if( x==0 ) x 
28380 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
28390 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  t;.  return x;.}
283a0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
283b0 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41   states */.PRIVA
283c0 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28  TE int statecmp(
283d0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
283e0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
283f0 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b).{.  int rc;.
28400 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
28410 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
28420 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
28430 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
28440 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
28450 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
28460 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
28470 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
28480 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
28490 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
284a0 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
284b0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
284c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
284d0 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
284e0 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64  PRIVATE unsigned
284f0 20 73 74 61 74 65 68 61 73 68 28 73 74 72 75 63   statehash(struc
28500 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
28510 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20   unsigned h=0;. 
28520 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20   while( a ){.   
28530 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
28540 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
28550 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61  ->dot;.    a = a
28560 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ->bp;.  }.  retu
28570 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f  rn h;.}../* Allo
28580 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65  cate a new state
28590 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74   structure */.st
285a0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
285b0 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75  e_new().{.  stru
285c0 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61  ct state *newsta
285d0 74 65 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d  te;.  newstate =
285e0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
285f0 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
28600 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20  f(struct state) 
28610 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  );.  MemoryCheck
28620 28 6e 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65  (newstate);.  re
28630 74 75 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d  turn newstate;.}
28640 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
28650 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
28660 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
28670 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
28680 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
28690 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22  ray of type "x3"
286a0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33  ..*/.struct s_x3
286b0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
286d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
286e0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
286f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
28710 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
28720 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
28730 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
28760 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
28770 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
28780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
28790 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
287a0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
287b0 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x3node *tbl;  
287c0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
287d0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
287e0 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68  uct s_x3node **h
287f0 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
28800 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
28810 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
28820 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
28830 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
28840 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
28850 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
28860 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
28870 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
28880 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
28890 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73  t s_x3node {.  s
288a0 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
288b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
288c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
288d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
288e0 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ig *key;        
288f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28900 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
28910 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74  t s_x3node *next
28920 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
28930 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
28940 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
28950 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x3node **from
28960 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
28970 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b  ink */.} x3node;
28980 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
28990 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
289a0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
289b0 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
289c0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
289d0 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b  truct s_x3 *x3a;
289e0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
289f0 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
28a00 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
28a10 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  ate_init(void){.
28a20 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75    if( x3a ) retu
28a30 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72  rn;.  x3a = (str
28a40 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63  uct s_x3*)malloc
28a50 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
28a60 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x3) );.  if( x
28a70 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73  3a ){.    x3a->s
28a80 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
28a90 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  3a->count = 0;. 
28aa0 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78     x3a->tbl = (x
28ab0 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32  3node*)calloc(12
28ac0 38 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65  8, sizeof(x3node
28ad0 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
28ae0 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 33  e*));.    if( x3
28af0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
28b00 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20     free(x3a);.  
28b10 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20      x3a = 0;.   
28b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
28b30 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e  t i;.      x3a->
28b40 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
28b50 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x3a->tbl[128]);
28b60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28b70 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d  i<128; i++) x3a-
28b80 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
28b90 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
28ba0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
28bb0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
28bc0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
28bd0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
28be0 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
28bf0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
28c00 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
28c10 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
28c20 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
28c30 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e  data, struct con
28c40 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33  fig *key).{.  x3
28c50 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69  node *np;.  unsi
28c60 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e  gned h;.  unsign
28c70 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33  ed ph;..  if( x3
28c80 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
28c90 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73  .  ph = statehas
28ca0 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68  h(key);.  h = ph
28cb0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
28cc0 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
28cd0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
28ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
28cf0 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
28d00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
28d10 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
28d20 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
28d30 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
28d40 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
28d50 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
28d60 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
28d70 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
28d80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
28d90 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
28da0 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e  .  if( x3a->coun
28db0 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x3a->size ){.
28dc0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
28dd0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
28de0 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
28df0 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a   int i,arrSize;.
28e00 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20      struct s_x3 
28e10 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
28e20 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20  .size = arrSize 
28e30 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x3a->size*2;. 
28e40 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
28e50 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x3a->count;.   
28e60 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33   array.tbl = (x3
28e70 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72  node*)calloc(arr
28e80 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e  Size, sizeof(x3n
28e90 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
28ea0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
28eb0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
28ec0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
28ed0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
28ee0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
28ef0 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f  array.ht = (x3no
28f00 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
28f10 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20  [arrSize]);.    
28f20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
28f30 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
28f40 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
28f50 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f  r(i=0; i<x3a->co
28f60 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
28f70 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x3node *oldnp, 
28f80 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
28f90 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c  dnp = &(x3a->tbl
28fa0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
28fb0 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d  statehash(oldnp-
28fc0 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a 65  >key) & (arrSize
28fd0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
28fe0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
28ff0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
29000 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
29010 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
29020 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
29030 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
29040 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
29050 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
29060 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
29070 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
29080 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
29090 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
290a0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
290b0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
290c0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
290d0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
290e0 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  3a->tbl);.    *x
290f0 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  3a = array;.  }.
29100 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
29110 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
29120 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
29130 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
29140 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75  3a->tbl[x3a->cou
29150 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
29160 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
29170 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
29180 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x3a->ht[h] ) x
29190 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  3a->ht[h]->from 
291a0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
291b0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d   np->next = x3a-
291c0 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68  >ht[h];.  x3a->h
291d0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
291e0 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68  >from = &(x3a->h
291f0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
29200 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
29210 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
29220 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
29230 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
29240 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
29250 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
29260 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
29270 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
29280 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
29290 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
292a0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  3node *np;..  if
292b0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
292c0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65  n 0;.  h = state
292d0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33 61  hash(key) & (x3a
292e0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
292f0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
29300 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
29310 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
29320 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
29330 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
29340 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
29350 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
29360 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
29370 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
29380 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
29390 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
293a0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
293b0 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
293c0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
293d0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
293e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
293f0 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
29400 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
29410 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
29420 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72  tate **State_arr
29430 61 79 6f 66 28 76 6f 69 64 29 0a 7b 0a 20 20 73  ayof(void).{.  s
29440 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
29450 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72  ray;.  int i,arr
29460 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d  Size;.  if( x3a=
29470 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
29480 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e   arrSize = x3a->
29490 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
294a0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
294b0 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
294c0 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
294d0 73 74 61 74 65 20 2a 29 29 3b 0a 20 20 69 66 28  state *));.  if(
294e0 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
294f0 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
29500 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20  ; i++) array[i] 
29510 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  = x3a->tbl[i].da
29520 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ta;.  }.  return
29530 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61   array;.}../* Ha
29540 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  sh a configurati
29550 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e  on */.PRIVATE un
29560 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 68 61 73  signed confighas
29570 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  h(struct config 
29580 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *a).{.  unsigned
29590 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37   h=0;.  h = h*57
295a0 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
295b0 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
295c0 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
295d0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
295e0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
295f0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
29600 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
29610 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
29620 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
29630 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20  struct s_x4 {.  
29640 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
29650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
29660 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
29670 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29690 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
296a0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
296b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
296c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
296e0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
296f0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
29700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29710 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
29720 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
29730 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
29740 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
29750 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
29760 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
29770 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x4node **ht;  /
29780 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
29790 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
297a0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
297b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
297c0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
297d0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
297e0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
297f0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
29800 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79  type "x4"..*/.ty
29810 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
29820 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  4node {.  struct
29830 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20   config *data;  
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
29860 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
29870 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
29880 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
29890 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
298a0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
298b0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
298c0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
298d0 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  4node;../* There
298e0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
298f0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
29900 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
29910 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
29920 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34  atic struct s_x4
29930 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x4a;../* Alloc
29940 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
29950 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
29960 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
29970 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66  init(void){.  if
29980 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x4a ) return;.
29990 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20    x4a = (struct 
299a0 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x4*)malloc( si
299b0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34  zeof(struct s_x4
299c0 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29  ) );.  if( x4a )
299d0 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20  {.    x4a->size 
299e0 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63  = 64;.    x4a->c
299f0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34  ount = 0;.    x4
29a00 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  a->tbl = (x4node
29a10 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a  *)calloc(64, siz
29a20 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
29a30 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
29a40 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c      if( x4a->tbl
29a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
29a60 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34  e(x4a);.      x4
29a70 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
29a80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
29a90 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28       x4a->ht = (
29aa0 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e  x4node**)&(x4a->
29ab0 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20  tbl[64]);.      
29ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69  for(i=0; i<64; i
29ad0 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
29ae0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
29af0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
29b00 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
29b10 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
29b20 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
29b30 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
29b40 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
29b50 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
29b60 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e  itten */.int Con
29b70 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
29b80 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
29b90 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata).{.  x4node 
29ba0 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
29bb0 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
29bc0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
29bd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
29be0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
29bf0 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
29c00 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
29c10 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
29c20 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
29c30 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
29c40 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
29c50 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
29c60 74 20 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d  t char *) data)=
29c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
29c80 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
29c90 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
29ca0 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
29cb0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
29cc0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
29cd0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
29ce0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
29cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
29d00 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
29d10 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
29d20 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
29d30 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
29d40 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
29d50 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
29d60 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
29d70 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72    struct s_x4 ar
29d80 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
29d90 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20  ize = arrSize = 
29da0 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x4a->size*2;.   
29db0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
29dc0 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  4a->count;.    a
29dd0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f  rray.tbl = (x4no
29de0 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69  de*)calloc(arrSi
29df0 7a 65 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ze, sizeof(x4nod
29e00 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
29e10 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61  de*));.    if( a
29e20 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
29e30 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
29e40 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
29e50 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
29e60 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65  ray.ht = (x4node
29e70 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61  **)&(array.tbl[a
29e80 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  rrSize]);.    fo
29e90 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
29ea0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
29eb0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
29ec0 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
29ed0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
29ee0 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  4node *oldnp, *n
29ef0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
29f00 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69  p = &(x4a->tbl[i
29f10 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f  ]);.      h = co
29f20 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  nfighash(oldnp->
29f30 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a 65  data) & (arrSize
29f40 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
29f50 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
29f60 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
29f70 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
29f80 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
29f90 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
29fa0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
29fb0 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
29fc0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
29fd0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
29fe0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
29ff0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
2a000 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
2a010 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
2a020 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
2a030 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x4a->tbl);.    *
2a040 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x4a = array;.  }
2a050 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
2a060 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
2a070 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
2a080 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
2a090 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f  x4a->tbl[x4a->co
2a0a0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
2a0b0 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
2a0c0 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x4a->ht[h] ) x
2a0d0 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  4a->ht[h]->from 
2a0e0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
2a0f0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d   np->next = x4a-
2a100 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68  >ht[h];.  x4a->h
2a110 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
2a120 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68  >from = &(x4a->h
2a130 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
2a140 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
2a150 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
2a160 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
2a170 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
2a180 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
2a190 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
2a1a0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
2a1b0 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
2a1c0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
2a1d0 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey).{.  int h;. 
2a1e0 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
2a1f0 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
2a200 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
2a210 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
2a220 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
2a230 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
2a240 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
2a250 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
2a260 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  p((const char *)
2a270 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74   np->data,(const
2a280 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30   char *) key)==0
2a290 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
2a2a0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
2a2b0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
2a2c0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
2a2d0 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
2a2e0 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
2a2f0 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
2a300 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
2a310 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
2a320 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
2a330 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
2a340 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
2a350 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
2a360 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74  gtable_clear(int
2a370 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66  (*f)(struct conf
2a380 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69  ig *)).{.  int i
2a390 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c  ;.  if( x4a==0 |
2a3a0 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20  | x4a->count==0 
2a3b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2a3c0 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  f ) for(i=0; i<x
2a3d0 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20  4a->count; i++) 
2a3e0 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d  (*f)(x4a->tbl[i]
2a3f0 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d  .data);.  for(i=
2a400 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20  0; i<x4a->size; 
2a410 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
2a420 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e  = 0;.  x4a->coun
2a430 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  t = 0;.  return;
2a440 0a 7d 0a                                         .}.