/ Hex Artifact Content
Login

Artifact 3b5fb488c6b27e7cc4e3191cc1014af6d6250786dcae02991fb0df0d598fc5df:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bols */.  int mi
38c0: 6e 53 68 69 66 74 52 65 64 75 63 65 3b 20 20 20  nShiftReduce;   
38d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68     /* Minimum sh
38e0: 69 66 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f  ift-reduce actio
38f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
3900: 20 65 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20   errAction;     
3910: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61        /* Error a
3920: 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  ction value */. 
3930: 20 69 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20   int accAction; 
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
3950: 65 70 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65  ept action value
3960: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69   */.  int noActi
3970: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  on;            /
3980: 2a 20 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76  * No-op action v
3990: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  alue */.  int mi
39a0: 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  nReduce;        
39b0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65     /* Minimum re
39c0: 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
39d0: 20 69 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20   int maxAction; 
39e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
39f0: 69 6d 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75  imum action valu
3a00: 65 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  e of any kind */
3a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3a20: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
3a30: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
3a40: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
3a50: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
3a60: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
3a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
3a80: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
3a90: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
3aa0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
3ab0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
3ac0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
3ad0: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
3ae0: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
3af0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
3b00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3b10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
3b30: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b50: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
3b60: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
3b70: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
3b80: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
3b90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
3ba0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
3bb0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
3bc0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
3bd0: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3bf0: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
3c00: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
3c10: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
3c20: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
3c30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c40: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
3c50: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
3c60: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
3c70: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
3c80: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
3c90: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
3ca0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
3cb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3cc0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
3cd0: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
3ce0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
3cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3d00: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3d10: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
3d20: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
3d30: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
3d40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3d50: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
3d60: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
3d70: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3d90: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3da0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
3db0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
3dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3dd0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3de0: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
3df0: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
3e00: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
3e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
3e20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
3e30: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
3e40: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
3e50: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
3e60: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
3e70: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
3e80: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
3e90: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
3ea0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
3eb0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
3ec0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
3ed0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
3ee0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3ef0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
3f10: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3f30: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3f40: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
3f50: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
3f60: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
3f70: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
3f80: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
3f90: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
3fa0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fc0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
3fd0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
3fe0: 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20 20 20  nactiontab;     
3ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4000: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4010: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
4020: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6c 6f 6f  le */.  int nloo
4030: 6b 61 68 65 61 64 74 61 62 3b 20 20 20 20 20 20  kaheadtab;      
4040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4050: 74 72 69 65 73 20 69 6e 20 79 79 5f 6c 6f 6f 6b  tries in yy_look
4060: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
4070: 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20   tablesize;     
4080: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74        /* Total t
4090: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c  able size of all
40a0: 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73   tables in bytes
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
40c0: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
40d0: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
40e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
40f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
4100: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
4110: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
4120: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
4130: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
4140: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
4150: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
4160: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
4170: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
4180: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
4190: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
41c0: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
41d0: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
41e0: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
41f0: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
4200: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
4210: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
4220: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
4240: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
4250: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
4280: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
4290: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
42a0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
42b0: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
42c0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
42d0: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
42e0: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
42f0: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
4300: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
4310: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
4320: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
4330: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
4340: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
4350: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
4360: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
4370: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
4380: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
4390: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
43a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
43b0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
43c0: 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e  or..*/./* Routin
43d0: 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  es for handling 
43e0: 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f  a strings */..co
43f0: 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
4400: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  e(const char *);
4410: 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  ..void Strsafe_i
4420: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4430: 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
4440: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e  nst char *);.con
4450: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
4460: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
4470: 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65   *);../* Routine
4480: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73  s for handling s
4490: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
44a0: 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74  ammar */..struct
44b0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
44c0: 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
44d0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  );.int Symbolcmp
44e0: 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20  p(const void *, 
44f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76  const void *);.v
4500: 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
4510: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  void);.int Symbo
4520: 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
4530: 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20  symbol *, const 
4540: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4550: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
4560: 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
4570: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4580: 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
4590: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
45a0: 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  unt(void);.struc
45b0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
45c0: 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  l_arrayof(void);
45d0: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  ../* Routines to
45e0: 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74   manage the stat
45f0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20  e table */..int 
4600: 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
4610: 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68  char *, const ch
4620: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ar *);.struct st
4630: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76  ate *State_new(v
4640: 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65  oid);.void State
4650: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4660: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
4670: 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74  ruct state *, st
4680: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
4690: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
46a0: 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
46b0: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
46c0: 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f  t state **State_
46d0: 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a  arrayof(void);..
46e0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
46f0: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
4700: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
4710: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
4720: 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
4730: 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  );.int Configtab
4740: 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  le_insert(struct
4750: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
4760: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
4770: 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
4780: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
4790: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
47a0: 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75  lear(int(*)(stru
47b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a  ct config *));..
47c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
47e0: 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "action.c" ***
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
4810: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
4820: 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61  cessing parser a
4830: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45  ctions in the LE
4840: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4850: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c  ator..*/../* All
4860: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73  ocate a new pars
4870: 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61  er action */.sta
4880: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
4890: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
48a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  id){.  static st
48b0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65  ruct action *fre
48c0: 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  elist = 0;.  str
48d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
48e0: 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72  ction;..  if( fr
48f0: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4910: 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66  amt = 100;.    f
4920: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
4930: 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f  t action *)callo
4940: 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  c(amt, sizeof(st
4950: 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20  ruct action));. 
4960: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
4970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
4980: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
4990: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
49a0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
49b0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29  parser action.")
49c0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
49d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
49e0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
49f0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
4a00: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
4a10: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
4a20: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4a30: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4a40: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  on = freelist;. 
4a50: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
4a60: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
4a70: 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  turn newaction;.
4a80: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
4a90: 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f  o actions for so
4aa0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
4ab0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
4ac0: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
4ad0: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4ae0: 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65  rst action is le
4af0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
4b00: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
4b10: 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a  an.** the first.
4b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
4b30: 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63  tioncmp(.  struc
4b40: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20  t action *ap1,. 
4b50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4b60: 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ap2.){.  int rc;
4b70: 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d  .  rc = ap1->sp-
4b80: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70  >index - ap2->sp
4b90: 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72  ->index;.  if( r
4ba0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
4bb0: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
4bc0: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
4bd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4be0: 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d  0 && (ap1->type=
4bf0: 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e  =REDUCE || ap1->
4c00: 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
4c10: 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  E) ){.    rc = a
4c20: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
4c30: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
4c40: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4c60: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
4c70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c80: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
4c90: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
4ca0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
4cb0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
4cc0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
4cd0: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
4ce0: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4cf0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
4d00: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
4d10: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
4d40: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
4d50: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
4d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
4d70: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
4d80: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
4d90: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
4da0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
4db0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
4dc0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
4dd0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
4de0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
4df0: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
4e00: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
4e10: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
4e20: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
4e30: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4e40: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
4e50: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
4e60: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e 65 77  ->sp = sp;.  new
4e70: 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20 3d 20  action->spOpt = 
4e80: 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  0;.  if( type==S
4e90: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 61  HIFT ){.    newa
4ea0: 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d 20 28  ction->x.stp = (
4eb0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 61  struct state *)a
4ec0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
4ed0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 72 70   newaction->x.rp
4ee0: 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
4ef0: 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  *)arg;.  }.}./**
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f  **** New code to
4f20: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
4f30: 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a  acttab" module *
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
4f50: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d  * This module im
4f60: 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65  plements routine
4f70: 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75  s use to constru
4f80: 63 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ct the yy_action
4f90: 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  [] table..*/../*
4fa0: 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  .** The state of
4fb0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
4fc0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4fd0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ruction is an in
4fe0: 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65  stance of.** the
4ff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5000: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5010: 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
5020: 6d 61 70 73 20 74 68 65 20 70 61 69 72 20 28 73  maps the pair (s
5030: 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f  tate_number, loo
5040: 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61 6e 0a  kahead) into an.
5050: 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  ** action_number
5060: 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  .  The table is 
5070: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
5080: 67 65 72 73 20 70 61 69 72 73 2e 20 20 54 68 65  gers pairs.  The
5090: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a   state_number.**
50a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e 20 69   determines an i
50b0: 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 69 6e  nitial offset in
50c0: 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  to the yy_action
50d0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c 6f 6f   array.  The loo
50e0: 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75 65 20  kahead.** value 
50f0: 69 73 20 74 68 65 6e 20 61 64 64 65 64 20 74 6f  is then added to
5100: 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20 6f 66   this initial of
5110: 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e 20 69  fset to get an i
5120: 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68 65 0a  ndex X into the.
5130: 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72  ** yy_action arr
5140: 61 79 2e 20 49 66 20 74 68 65 20 61 41 63 74 69  ay. If the aActi
5150: 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[X].lookahead 
5160: 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c 75 65  equals the value
5170: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20 74 68   of the.** of th
5180: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 70 75  e lookahead inpu
5190: 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
51a0: 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 5f  e of the action_
51b0: 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20 69 73  number output is
51c0: 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 61  .** aAction[X].a
51d0: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 6c  ction.  If the l
51e0: 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e 6f 74  ookaheads do not
51f0: 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68 65 0a   match then the.
5200: 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  ** default actio
5210: 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 5f  n for the state_
5220: 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
5230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63  ed..**.** All ac
5240: 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
5250: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 73   with a single s
5260: 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20  tate_number are 
5270: 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a 2a 2a  first entered.**
5280: 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65 61 64   into aLookahead
5290: 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  [] using multipl
52a0: 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  e calls to actta
52b0: 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54 68 65  b_action().  The
52c0: 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f 6e 73  n the.** actions
52d0: 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67 6c 65   for that single
52e0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
52f0: 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20 74 68  e placed into th
5300: 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a 20 61  e aAction[].** a
5310: 72 72 61 79 20 77 69 74 68 20 61 20 73 69 6e 67  rray with a sing
5320: 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61  le call to actta
5330: 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65  b_insert().  The
5340: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29   acttab_insert()
5350: 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65   call.** also re
5360: 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68  sets the aLookah
5370: 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70  ead[] array in p
5380: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74  reparation for t
5390: 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65  he next.** state
53a0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75   number..*/.stru
53b0: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
53c0: 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b  ion {.  int look
53d0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
53e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
53f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b  he lookahead tok
5400: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69  en */.  int acti
5410: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
5420: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
5430: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
5440: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d  n lookahead */.}
5450: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
5460: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
5470: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
5480: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
54b0: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
54c0: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
54d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
54e0: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
54f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
5500: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
5510: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5520: 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e  ion.    *aAction
5530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5540: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
5550: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
5560: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
5570: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
5580: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5590: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
55a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
55c0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
55d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
55e0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
55f0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
5600: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
5610: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
5620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5630: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
5640: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
5650: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5660: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
5670: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
5680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
5690: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
56a0: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
56b0: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
56c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
56d0: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
56e0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
56f0: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
5700: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
5710: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5730: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79  r of terminal sy
5740: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
5750: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
5760: 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 74 61 6c          /* total
5770: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   number of symbo
5780: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74  ls */.};../* Ret
5790: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
57a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
57b0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
57c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
57d0: 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a  ab_lookahead_siz
57e0: 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69  e(X) ((X)->nActi
57f0: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5800: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5810: 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f  ntry in yy_actio
5820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  n */.#define act
5830: 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e  tab_yyaction(X,N
5840: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5850: 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20  [N].action)../* 
5860: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
5870: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
5880: 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  yy_lookahead */.
5890: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
58a0: 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20  ylookahead(X,N) 
58b0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
58c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a  ].lookahead)../*
58d0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
58e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
58f0: 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74 61   the given actta
5900: 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  b */.void acttab
5910: 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70 29  _free(acttab *p)
5920: 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63  {.  free( p->aAc
5930: 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20  tion );.  free( 
5940: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b  p->aLookahead );
5950: 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a  .  free( p );.}.
5960: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
5970: 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63 74  ew acttab struct
5980: 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61  ure */.acttab *a
5990: 63 74 74 61 62 5f 61 6c 6c 6f 63 28 69 6e 74 20  cttab_alloc(int 
59a0: 6e 73 79 6d 62 6f 6c 2c 20 69 6e 74 20 6e 74 65  nsymbol, int nte
59b0: 72 6d 69 6e 61 6c 29 7b 0a 20 20 61 63 74 74 61  rminal){.  actta
59c0: 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62 20 2a  b *p = (acttab *
59d0: 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a  ) calloc( 1, siz
59e0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
59f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   p==0 ){.    fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
5a10: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
5a20: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
5a30: 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20 20 20   acttab.");.    
5a40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
5a50: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5a60: 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e 73  of(*p));.  p->ns
5a70: 79 6d 62 6f 6c 20 3d 20 6e 73 79 6d 62 6f 6c 3b  ymbol = nsymbol;
5a80: 0a 20 20 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  .  p->nterminal 
5a90: 3d 20 6e 74 65 72 6d 69 6e 61 6c 3b 0a 20 20 72  = nterminal;.  r
5aa0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41  eturn p;.}../* A
5ab0: 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20  dd a new action 
5ac0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
5ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
5ae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5af0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
5b00: 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61  e for each looka
5b10: 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69  head for a parti
5b20: 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a  cular.** state..
5b30: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
5b40: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
5b50: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
5b60: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
5b70: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
5b80: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
5b90: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5ba0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
5bb0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
5bc0: 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63  okahead = (struc
5bd0: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
5be0: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
5bf0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20  ->aLookahead,.  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5c20: 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  f(p->aLookahead[
5c30: 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  0])*p->nLookahea
5c40: 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66  dAlloc );.    if
5c50: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->aLookahead=
5c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
5c70: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
5c80: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
5c90: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
5ca0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
5cb0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >nLookahead==0 )
5cc0: 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61  {.    p->mxLooka
5cd0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5ce0: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ;.    p->mnLooka
5cf0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5d00: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f  ;.    p->mnActio
5d10: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65  n = action;.  }e
5d20: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
5d30: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b  mxLookahead<look
5d40: 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f  ahead ) p->mxLoo
5d50: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5d60: 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  ad;.    if( p->m
5d70: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61  nLookahead>looka
5d80: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  head ){.      p-
5d90: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
5da0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
5db0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5dc0: 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tion;.    }.  }.
5dd0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5de0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c  p->nLookahead].l
5df0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5e00: 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  head;.  p->aLook
5e10: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5e20: 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63  ead].action = ac
5e30: 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  tion;.  p->nLook
5e40: 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ahead++;.}../*.*
5e50: 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61  * Add the transa
5e60: 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20  ction set built 
5e70: 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61  up with prior ca
5e80: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
5e90: 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74  tion().** into t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5eb0: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72  n table.  Then r
5ec0: 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63  eset the transac
5ed0: 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a  tion set back.**
5ee0: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74   to an empty set
5ef0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
5f00: 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20  for a new round 
5f10: 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  of acttab_action
5f20: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () calls..**.** 
5f30: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5f40: 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f  t into the actio
5f50: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e  n table of the n
5f60: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
5f70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 6b  **.** If the mak
5f80: 65 49 74 53 61 66 65 20 70 61 72 61 6d 65 74 65  eItSafe paramete
5f90: 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  r is true, then 
5fa0: 74 68 65 20 6f 66 66 73 65 74 20 69 73 20 63 68  the offset is ch
5fb0: 6f 73 65 6e 20 73 6f 20 74 68 61 74 0a 2a 2a 20  osen so that.** 
5fc0: 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
5fd0: 20 74 6f 20 6f 76 65 72 72 65 61 64 20 74 68 65   to overread the
5fe0: 20 79 79 5f 6c 6f 6f 6b 61 73 69 64 65 5b 5d 20   yy_lookaside[] 
5ff0: 74 61 62 6c 65 20 72 65 67 61 72 64 6c 65 73 73  table regardless
6000: 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61   of.** the looka
6010: 73 69 64 65 20 74 6f 6b 65 6e 2e 20 20 54 68 69  side token.  Thi
6020: 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 74 68  s is done for th
6030: 65 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  e terminal symbo
6040: 6c 73 2c 20 61 73 20 74 68 65 79 0a 2a 2a 20 63  ls, as they.** c
6050: 6f 6d 65 20 66 72 6f 6d 20 65 78 74 65 72 6e 61  ome from externa
6060: 6c 20 69 6e 70 75 74 73 20 61 6e 64 20 63 61 6e  l inputs and can
6070: 20 63 6f 6e 74 61 69 6e 20 73 79 6e 74 61 78 20   contain syntax 
6080: 65 72 72 6f 72 73 2e 20 20 57 68 65 6e 20 6d 61  errors.  When ma
6090: 6b 65 49 74 53 61 66 65 0a 2a 2a 20 69 73 20 66  keItSafe.** is f
60a0: 61 6c 73 65 2c 20 74 68 65 72 65 20 69 73 20 6d  alse, there is m
60b0: 6f 72 65 20 66 6c 65 78 69 62 69 6c 69 74 79 20  ore flexibility 
60c0: 69 6e 20 73 65 6c 65 63 74 69 6e 67 20 6f 66 66  in selecting off
60d0: 73 65 74 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  sets, resulting 
60e0: 69 6e 0a 2a 2a 20 61 20 73 6d 61 6c 6c 65 72 20  in.** a smaller 
60f0: 74 61 62 6c 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  table.  For non-
6100: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
6110: 2c 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  , which are neve
6120: 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 2c  r syntax errors,
6130: 0a 2a 2a 20 6d 61 6b 65 49 74 53 61 66 65 20 63  .** makeItSafe c
6140: 61 6e 20 62 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  an be false..*/.
6150: 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72  int acttab_inser
6160: 74 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74  t(acttab *p, int
6170: 20 6d 61 6b 65 49 74 53 61 66 65 29 7b 0a 20 20   makeItSafe){.  
6180: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 2c 20  int i, j, k, n, 
6190: 65 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  end;.  assert( p
61a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
61b0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
61c0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
61d0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
61e0: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
61f0: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
6200: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
6210: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
6220: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
6230: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
6240: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
6250: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
6260: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
6270: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6e  .  */.  n = p->n
6280: 73 79 6d 62 6f 6c 20 2b 20 31 3b 0a 20 20 69 66  symbol + 1;.  if
6290: 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e  ( p->nAction + n
62a0: 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c   >= p->nActionAl
62b0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
62c0: 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  ldAlloc = p->nAc
62d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  tionAlloc;.    p
62e0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d  ->nActionAlloc =
62f0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20   p->nAction + n 
6300: 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  + p->nActionAllo
6310: 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61  c + 20;.    p->a
6320: 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75 63 74  Action = (struct
6330: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
6340: 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d  n *) realloc( p-
6350: 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20  >aAction,.      
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41      sizeof(p->aA
6380: 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63  ction[0])*p->nAc
6390: 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  tionAlloc);.    
63a0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d  if( p->aAction==
63b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
63c0: 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
63d0: 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
63e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64   }.    for(i=old
6400: 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74  Alloc; i<p->nAct
6410: 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a  ionAlloc; i++){.
6420: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
6430: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  [i].lookahead = 
6440: 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63  -1;.      p->aAc
6450: 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d  tion[i].action =
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   -1;.    }.  }..
6470: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78    /* Scan the ex
6480: 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61  isting action ta
6490: 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ble looking for 
64a0: 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74 20 69  an offset that i
64b0: 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61  s a.  ** duplica
64c0: 74 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  te of the curren
64d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
64e0: 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20  t.  Fall out of 
64f0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66  the loop.  ** if
6500: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75   and when the du
6510: 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64  plicate is found
6520: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73  ..  **.  ** i is
6530: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d   the index in p-
6540: 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65  >aAction[] where
6550: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6560: 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  is inserted..  *
6570: 2f 0a 20 20 65 6e 64 20 3d 20 6d 61 6b 65 49 74  /.  end = makeIt
6580: 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b  Safe ? p->mnLook
6590: 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 66 6f 72  ahead : 0;.  for
65a0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
65b0: 20 69 3e 3d 65 6e 64 3b 20 69 2d 2d 29 7b 0a 20   i>=end; i--){. 
65c0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
65d0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
65e0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
65f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c  {.      /* All l
6600: 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63  ookaheads and ac
6610: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f  tions in the aLo
6620: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
6630: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
6640: 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  ust match agains
6650: 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  t the candidate 
6660: 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79  aAction[i] entry
6670: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
6680: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74  ->aAction[i].act
6690: 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e  ion!=p->mnAction
66a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
66b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
66c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
66e0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
66f0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
6700: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
6710: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
6720: 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e  || k>=p->nAction
6730: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6740: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
6750: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6760: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6770: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61  lookahead ) brea
6780: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
6790: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
67a0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69  action!=p->aActi
67b0: 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62  on[k].action ) b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
67d0: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67e0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67f0: 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  ue;..      /* No
6800: 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68   possible lookah
6810: 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20 69  ead value that i
6820: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f  s not in the aLo
6830: 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20  okahead[].      
6840: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
6850: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  s allowed to mat
6860: 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f  ch aAction[i] */
6870: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
6880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6890: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
68a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
68b0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
68c0: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
68d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
68e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
68f0: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
6900: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
6910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6920: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
6930: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
6940: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78  break;  /* An ex
6950: 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75  act match is fou
6960: 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a  nd at offset i *
6970: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
6980: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
6990: 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73  existing offsets
69a0: 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
69b0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
69c0: 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a  action, find an.
69d0: 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66    ** an empty of
69e0: 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63 74  fset in the aAct
69f0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77  ion[] table in w
6a00: 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64 20  hich we can add 
6a10: 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68  the.  ** aLookah
6a20: 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f  ead[] transactio
6a30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c  n..  */.  if( i<
6a40: 65 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f  end ){.    /* Lo
6a50: 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20  ok for holes in 
6a60: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6a70: 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65  ble that fit the
6a80: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
6a90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
6aa0: 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65  nsaction.  Leave
6ab0: 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66   i set to the of
6ac0: 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65  fset of the hole
6ad0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68  ..    ** If no h
6ae0: 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  oles are found, 
6af0: 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e  i is left at p->
6b00: 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d  nAction, which m
6b10: 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  eans the.    ** 
6b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
6b30: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f   be appended. */
6b40: 0a 20 20 20 20 69 20 3d 20 6d 61 6b 65 49 74 53  .    i = makeItS
6b50: 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  afe ? p->mnLooka
6b60: 68 65 61 64 20 3a 20 30 3b 0a 20 20 20 20 66 6f  head : 0;.    fo
6b70: 72 28 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  r(; i<p->nAction
6b80: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
6b90: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
6ba0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6bb0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6bd0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6be0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6bf0: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6c00: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6c10: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6c20: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6c30: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6c50: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6c60: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
6c70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6c80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6c90: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
6ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6cb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6cc0: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6ce0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6cf0: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6d00: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6d10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6d30: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6d40: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
6d50: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
6d60: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d80: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
6d90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
6da0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 23 69 66   index i. */.#if
6db0: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41 63 74   0.  printf("Act
6dc0: 74 61 62 3a 22 29 3b 0a 20 20 66 6f 72 28 6a 3d  tab:");.  for(j=
6dd0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
6de0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 72  ad; j++){.    pr
6df0: 69 6e 74 66 28 22 20 25 64 22 2c 20 70 2d 3e 61  intf(" %d", p->a
6e00: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6e10: 6b 61 68 65 61 64 29 3b 0a 20 20 7d 0a 20 20 70  kahead);.  }.  p
6e20: 72 69 6e 74 66 28 22 20 69 6e 73 65 72 74 65 64  rintf(" inserted
6e30: 20 61 74 20 25 64 5c 6e 22 2c 20 69 29 3b 0a 23   at %d\n", i);.#
6e40: 65 6e 64 69 66 0a 20 20 66 6f 72 28 6a 3d 30 3b  endif.  for(j=0;
6e50: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
6e60: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
6e70: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6e80: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6e90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6ea0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6eb0: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6ec0: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6ed0: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6ee0: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 61 6b 65 49  .  }.  if( makeI
6f00: 74 53 61 66 65 20 26 26 20 69 2b 70 2d 3e 6e 74  tSafe && i+p->nt
6f10: 65 72 6d 69 6e 61 6c 3e 3d 70 2d 3e 6e 41 63 74  erminal>=p->nAct
6f20: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
6f30: 20 3d 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61   = i+p->ntermina
6f40: 6c 2b 31 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  l+1;.  p->nLooka
6f50: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
6f60: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6f70: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
6f80: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
6f90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
6fa0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
6fb0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
6fc0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
6fd0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
6fe0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
6ff0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7000: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
7010: 69 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 6f 75  ion table withou
7020: 74 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73  t the trailing s
7030: 79 6e 74 61 78 20 65 72 72 6f 72 0a 2a 2a 20 65  yntax error.** e
7040: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 61  ntries..*/.int a
7050: 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73 69 7a  cttab_action_siz
7060: 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20  e(acttab *p){.  
7070: 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 41 63 74 69  int n = p->nActi
7080: 6f 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  on;.  while( n>0
7090: 20 26 26 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6e   && p->aAction[n
70a0: 2d 31 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20  -1].lookahead<0 
70b0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
70c0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  rn n;.}../******
70d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
70e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
70f0: 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  build.c" *******
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7110: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
7120: 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72  utines to constr
7130: 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74  uction the finit
7140: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20  e state machine 
7150: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a  for the LEMON.**
7160: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
7170: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  r..*/../* Find a
7180: 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   precedence symb
7190: 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65  ol of every rule
71a0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   in the grammar.
71b0: 0a 2a 2a 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c  .**.** Those rul
71c0: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 61 20  es which have a 
71d0: 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
71e0: 6c 20 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69  l coded in the i
71f0: 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20  nput.** grammar 
7200: 75 73 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62  using the "[symb
7210: 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77  ol]" construct w
7220: 69 6c 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65  ill already have
7230: 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63   the.** rp->prec
7240: 73 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  sym field filled
7250: 2e 20 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74  .  Other rules t
7260: 61 6b 65 20 61 73 20 74 68 65 69 72 20 70 72 65  ake as their pre
7270: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
7280: 6c 20 74 68 65 20 66 69 72 73 74 20 52 48 53 20  l the first RHS 
7290: 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65  symbol with a de
72a0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
72b0: 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
72c0: 72 65 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f  re not RHS symbo
72d0: 6c 73 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  ls with a define
72e0: 64 20 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68  d precedence, th
72f0: 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  e precedence.** 
7300: 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20  symbol field is 
7310: 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76  left blank..*/.v
7320: 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63  oid FindRulePrec
7330: 65 64 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c  edences(struct l
7340: 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74  emon *xp).{.  st
7350: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
7360: 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65   for(rp=xp->rule
7370: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
7380: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
7390: 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20  precsym==0 ){.  
73a0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
73b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
73c0: 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70  p->nrhs && rp->p
73d0: 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b  recsym==0; i++){
73e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
73f0: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7400: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7410: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
7420: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7430: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7440: 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; j<sp->nsubsym
7450: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7460: 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73      if( sp->subs
7470: 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29  ym[j]->prec>=0 )
7480: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7490: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70  rp->precsym = sp
74a0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20  ->subsym[j];.   
74b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
74c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
74d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
74e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
74f0: 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
7500: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
7510: 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  ym = rp->rhs[i];
7520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7530: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7540: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
7550: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
7560: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
7570: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
7580: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
7590: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
75a0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
75b0: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
75c0: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
75d0: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
75e0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
75f0: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
7600: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
7610: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
7620: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
7630: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
7640: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 73   FindFirstSets(s
7650: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7660: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  p).{.  int i, j;
7670: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7680: 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  rp;.  int progre
7690: 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ss;..  for(i=0; 
76a0: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
76b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
76c0: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d  >symbols[i]->lam
76d0: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
76e0: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c  E;.  }.  for(i=l
76f0: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
7700: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
7710: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
7720: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72  >symbols[i]->fir
7730: 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29  stset = SetNew()
7740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
7750: 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61  t compute all la
7760: 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20  mbdas */.  do{. 
7770: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
7780: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
7790: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
77a0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
77b0: 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d  if( rp->lhs->lam
77c0: 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bda ) continue;.
77d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
77e0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
77f0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
7800: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7810: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7820: 20 61 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70   assert( sp->typ
7830: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e==NONTERMINAL |
7840: 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  | sp->lambda==LE
7850: 4d 4f 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20  MON_FALSE );.   
7860: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
7870: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7890: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
78a0: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
78b0: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
78c0: 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  da = LEMON_TRUE;
78d0: 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73  .        progres
78e0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
78f0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70     }.  }while( p
7900: 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a  rogress );..  /*
7910: 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c   Now compute all
7920: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
7930: 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20   do{.    struct 
7940: 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b  symbol *s1, *s2;
7950: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
7960: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
7970: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
7980: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
7990: 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a    s1 = rp->lhs;.
79a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
79b0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
79c0: 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70  .        s2 = rp
79d0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
79e0: 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d    if( s2->type==
79f0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
7a00: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7a10: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
7a20: 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29  stset,s2->index)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7a40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7a50: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d   if( s2->type==M
7a60: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7a70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7a80: 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d  0; j<s2->nsubsym
7a90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7aa0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
7ab0: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
7ac0: 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a  set,s2->subsym[j
7ad0: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
7ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7b00: 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32  }else if( s1==s2
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7b20: 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s1->lambda==LE
7b30: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
7b40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
7b60: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
7b70: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7b80: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
7b90: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
7ba0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
7bb0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
7bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7bd0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
7be0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
7bf0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
7c00: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
7c10: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
7c20: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
7c30: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
7c40: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
7c50: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
7c60: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
7c70: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
7c80: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
7c90: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
7ca0: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
7cb0: 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f  lemon *);  /* fo
7cc0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
7cd0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74  */.void FindStat
7ce0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
7cf0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
7d00: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
7d10: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7d20: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
7d30: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
7d40: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
7d50: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
7d60: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
7d70: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
7d80: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
7d90: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
7da0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
7db0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
7dc0: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
7dd0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
7de0: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
7df0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
7e00: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
7e10: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
7e20: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
7e30: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
7e40: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
7e50: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7e60: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
7e70: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
7e80: 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65  +;.      sp = le
7e90: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7ea0: 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  hs;.    }.  }els
7eb0: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
7ec0: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
7ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
7ee0: 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20   sure the start 
7ef0: 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f  symbol doesn't o
7f00: 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68  ccur on the righ
7f10: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20  t-hand side of. 
7f20: 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52   ** any rule.  R
7f30: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
7f40: 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43  f it does.  (YAC
7f50: 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  C would generate
7f60: 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72   a new.  ** star
7f70: 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  t symbol in this
7f80: 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72   case.) */.  for
7f90: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
7fa0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
7fb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
7fd0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
7fe0: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
7ff0: 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58  ==sp ){   /* FIX
8000: 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20   ME:  Deal with 
8010: 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a  multiterminals *
8020: 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  /.        ErrorM
8030: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
8040: 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20  e,0,."The start 
8050: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63  symbol \"%s\" oc
8060: 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69  curs on the \.ri
8070: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
8080: 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69   a rule. This wi
8090: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70  ll result in a p
80a0: 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f  arser which \.do
80b0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70  es not work prop
80c0: 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29  erly.",sp->name)
80d0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
80e0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
80f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8100: 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f   /* The basis co
8110: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20  nfiguration set 
8120: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74  for the first st
8130: 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20  ate.  ** is all 
8140: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
8150: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
8160: 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20  l as their.  ** 
8170: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a  left-hand side *
8180: 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72  /.  for(rp=sp->r
8190: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
81a0: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74  nextlhs){.    st
81b0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
81c0: 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73  cfp;.    rp->lhs
81d0: 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e  Start = 1;.    n
81e0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
81f0: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30  st_addbasis(rp,0
8200: 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65  );.    SetAdd(ne
8210: 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20  wcfp->fws,0);.  
8220: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
8230: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
8240: 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74    All other stat
8250: 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  es will be.  ** 
8260: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
8270: 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68  ically during th
8280: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
8290: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a   the first one..
82a0: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65    ** The returne
82b0: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
82c0: 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73 20   first state is 
82d0: 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28  not used. */.  (
82e0: 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c 65  void)getstate(le
82f0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mp);.  return;.}
8300: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
8320: 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72 69   which is descri
8330: 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69  bed by the confi
8340: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  guration.** list
8350: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
8360: 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73  built from calls
8370: 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   to Configlist_a
8380: 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  dd..*/.PRIVATE v
8390: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
83a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
83b0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b  struct state *);
83c0: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
83d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
83e0: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
83f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8400: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
8410: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b  onfig *cfp, *bp;
8420: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
8430: 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  *stp;..  /* Extr
8440: 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62  act the sorted b
8450: 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20  asis of the new 
8460: 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69  state.  The basi
8470: 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  s was constructe
8480: 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20  d.  ** by prior 
8490: 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67  calls to "Config
84a0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22  list_addbasis()"
84b0: 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73  . */.  Configlis
84c0: 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20  t_sortbasis();. 
84d0: 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74   bp = Configlist
84e0: 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20  _basis();..  /* 
84f0: 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68  Get a state with
8500: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
8510: 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65  */.  stp = State
8520: 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28  _find(bp);.  if(
8530: 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41   stp ){.    /* A
8540: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
8550: 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61  same basis alrea
8560: 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79  dy exists!  Copy
8570: 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d   all the follow-
8580: 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61  set.    ** propa
8590: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f  gation links fro
85a0: 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65  m the state unde
85b0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
85c0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  nto the.    ** p
85d0: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
85e0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
85f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8600: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
8610: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63   */.    struct c
8620: 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20  onfig *x, *y;.  
8630: 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74    for(x=bp, y=st
8640: 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78  p->bp; x && y; x
8650: 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29  =x->bp, y=y->bp)
8660: 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f  {.      Plink_co
8670: 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62  py(&y->bplp,x->b
8680: 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  plp);.      Plin
8690: 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70  k_delete(x->fplp
86a0: 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70  );.      x->fplp
86b0: 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   = x->bplp = 0;.
86c0: 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20      }.    cfp = 
86d0: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
86e0: 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c  n();.    Configl
86f0: 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20  ist_eat(cfp);.  
8700: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
8710: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e  is really is a n
8720: 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74  ew state.  Const
8730: 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74  ruct all the det
8740: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  ails */.    Conf
8750: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c  iglist_closure(l
8760: 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70  emp);    /* Comp
8770: 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ute the configur
8780: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
8790: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
87a0: 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20  sort();         
87b0: 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f    /* Sort the co
87c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
87d0: 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d  ure */.    cfp =
87e0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
87f0: 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61  rn();   /* Get a
8800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8810: 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20  config list */. 
8820: 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e     stp = State_n
8830: 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ew();           
8840: 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73  /* A new state s
8850: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8860: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29  MemoryCheck(stp)
8870: 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20  ;.    stp->bp = 
8880: 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bp;             
8890: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
88a0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
88b0: 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74   basis */.    st
88c0: 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20  p->cfp = cfp;   
88d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
88e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
88f0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
8900: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61   */.    stp->sta
8910: 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73  tenum = lemp->ns
8920: 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79  tate++; /* Every
8930: 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65   state gets a se
8940: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f  quence number */
8950: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30  .    stp->ap = 0
8960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8970: 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c    /* No actions,
8980: 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61   yet. */.    Sta
8990: 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74  te_insert(stp,st
89a0: 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64  p->bp);   /* Add
89b0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61   to the state ta
89c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64  ble */.    build
89d0: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
89e0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72  ;       /* Recur
89f0: 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73  sively compute s
8a00: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
8a10: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
8a20: 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  stp;.}../*.** Re
8a30: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f  turn true if two
8a40: 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65   symbols are the
8a50: 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61   same..*/.int sa
8a60: 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74  me_symbol(struct
8a70: 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75   symbol *a, stru
8a80: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a  ct symbol *b).{.
8a90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
8aa0: 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==b ) return 1;.
8ab0: 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d    if( a->type!=M
8ac0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72  ULTITERMINAL ) r
8ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62  eturn 0;.  if( b
8ae0: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
8af0: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
8b00: 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73  ;.  if( a->nsubs
8b10: 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29  ym!=b->nsubsym )
8b20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
8b30: 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73  (i=0; i<a->nsubs
8b40: 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ym; i++){.    if
8b50: 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d  ( a->subsym[i]!=
8b60: 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72  b->subsym[i] ) r
8b70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
8b80: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43  eturn 1;.}../* C
8b90: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63  onstruct all suc
8ba0: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f  cessor states to
8bb0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
8bc0: 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f 72 22  .  A "successor"
8bd0: 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79  .** state is any
8be0: 20 73 74 61 74 65 20 77 68 69 63 68 20 63 61 6e   state which can
8bf0: 20 62 65 20 72 65 61 63 68 65 64 20 62 79 20 61   be reached by a
8c00: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a   shift action..*
8c10: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
8c20: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
8c30: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
8c40: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
8c50: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
8c60: 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f  fig *cfp;  /* Fo
8c70: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74  r looping thru t
8c80: 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  he config closur
8c90: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
8ca0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
8cb0: 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20  cfp; /* For the 
8cc0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f  inner loop on co
8cd0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
8ce0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
8cf0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67  t config *newcfg
8d00: 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63  ;  /* */.  struc
8d10: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
8d20: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
8d30: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
8d40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66  onfiguration "cf
8d50: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
8d60: 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20  ymbol *bsp;  /* 
8d70: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
8d80: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
8d90: 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22  iguration "bcfp"
8da0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
8db0: 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41  te *newstp; /* A
8dc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
8dd0: 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f  ccessor state */
8de0: 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66  ..  /* Each conf
8df0: 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65  iguration become
8e00: 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72  s complete after
8e10: 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74   it contibutes t
8e20: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20  o a successor.  
8e30: 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69  ** state.  Initi
8e40: 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67  ally, all config
8e50: 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63  urations are inc
8e60: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72  omplete */.  for
8e70: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
8e80: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
8e90: 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  t) cfp->status =
8ea0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20   INCOMPLETE;..  
8eb0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
8ec0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8ed0: 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 20  ns of the state 
8ee0: 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63  "stp" */.  for(c
8ef0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8f00: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8f10: 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73  {.    if( cfp->s
8f20: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
8f30: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
8f40: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 62  * Already used b
8f50: 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  y inner loop */.
8f60: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
8f70: 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  >=cfp->rp->nrhs 
8f80: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
8f90: 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73  Can't shift this
8fa0: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43   config */.    C
8fb0: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
8fc0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74          /* Reset
8fe0: 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20   the new config 
8ff0: 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20  set */.    sp = 
9000: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70  cfp->rp->rhs[cfp
9010: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
9020: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66      /* Symbol af
9030: 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a  ter the dot */..
9040: 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79      /* For every
9050: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
9060: 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  n the state "stp
9070: 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65 20  " which has the 
9080: 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20  symbol "sp".    
9090: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73  ** following its
90a0: 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61   dot, add the sa
90b0: 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  me configuration
90c0: 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73 65   to the basis se
90d0: 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63  t under.    ** c
90e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20  onstruction but 
90f0: 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68 69  with the dot shi
9100: 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20  fted one symbol 
9110: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  to the right. */
9120: 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66  .    for(bcfp=cf
9130: 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63  p; bcfp; bcfp=bc
9140: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
9150: 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75   if( bcfp->statu
9160: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
9170: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
9180: 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20  ready used */.  
9190: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f      if( bcfp->do
91a0: 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  t>=bcfp->rp->nrh
91b0: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  s ) continue; /*
91c0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
91d0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62  s one */.      b
91e0: 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72  sp = bcfp->rp->r
91f0: 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  hs[bcfp->dot];  
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20           /* Get 
9210: 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74  symbol after dot
9220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73   */.      if( !s
9230: 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73  ame_symbol(bsp,s
9240: 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  p) ) continue;  
9250: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73      /* Must be s
9260: 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70 22  ame as for "cfp"
9270: 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e   */.      bcfp->
9280: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
9290: 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
92a0: 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73      /* Mark this
92b0: 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20   config as used 
92c0: 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20  */.      newcfg 
92d0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
92e0: 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62  basis(bcfp->rp,b
92f0: 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20  cfp->dot+1);.   
9300: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65     Plink_add(&ne
9310: 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29  wcfg->bplp,bcfp)
9320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9330: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
9340: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
9350: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
9360: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
9370: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
9380: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
9390: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
93a0: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
93b0: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
93c0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
93d0: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
93e0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
93f0: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
9400: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
9410: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
9420: 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sp" */.    if( s
9430: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
9440: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
9450: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
9460: 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62  (i=0; i<sp->nsub
9470: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sym; i++){.     
9480: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
9490: 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d  tp->ap,SHIFT,sp-
94a0: 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72  >subsym[i],(char
94b0: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20  *)newstp);.     
94c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
94d0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
94e0: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
94f0: 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29  ,(char *)newstp)
9500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9510: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
9520: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
9530: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
9540: 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65  dLinks(struct le
9550: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
9560: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
9570: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68  onfig *cfp, *oth
9580: 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  er;.  struct sta
9590: 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
95a0: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20  t plink *plp;.. 
95b0: 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67   /* Housekeeping
95c0: 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64   detail:.  ** Ad
95d0: 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61  d to every propa
95e0: 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e  gate link a poin
95f0: 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ter back to the 
9600: 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68  state to.  ** wh
9610: 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20  ich the link is 
9620: 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66  attached. */.  f
9630: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9640: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9650: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
9660: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
9670: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
9680: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
9690: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
96a0: 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a  tp = stp;.    }.
96b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
96c0: 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20  t all backlinks 
96d0: 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e  into forward lin
96e0: 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f  ks.  Only the fo
96f0: 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73  rward.  ** links
9700: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
9710: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70   follow-set comp
9720: 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  utation. */.  fo
9730: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9740: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9750: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
9760: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
9770: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
9780: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9790: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70  ){.      for(plp
97a0: 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b  =cfp->bplp; plp;
97b0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
97c0: 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d  .        other =
97d0: 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20   plp->cfp;.     
97e0: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74     Plink_add(&ot
97f0: 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a  her->fplp,cfp);.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9810: 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  }.}../* Compute 
9820: 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a  all followsets..
9830: 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65  **.** A followse
9840: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
9850: 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  all symbols whic
9860: 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64  h can come immed
9870: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
9880: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  a configuration.
9890: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  .*/.void FindFol
98a0: 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c  lowSets(struct l
98b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
98c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
98d0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
98e0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
98f0: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
9900: 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a  ;.  int change;.
9910: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
9920: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
9930: 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65  {.    for(cfp=le
9940: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
9950: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
9960: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  ->next){.      c
9970: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
9980: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20  OMPLETE;.    }. 
9990: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72   }..  do{.    pr
99a0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
99b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
99c0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
99d0: 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d       for(cfp=lem
99e0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
99f0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9a00: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
9a10: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
9a20: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
9a30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
9a40: 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b  r(plp=cfp->fplp;
9a50: 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e   plp; plp=plp->n
9a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
9a70: 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f  change = SetUnio
9a80: 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c  n(plp->cfp->fws,
9a90: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20  cfp->fws);.     
9aa0: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20       if( change 
9ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9ac0: 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20  lp->cfp->status 
9ad0: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  = INCOMPLETE;.  
9ae0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
9af0: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ss = 1;.        
9b00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b10: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
9b20: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  s = COMPLETE;.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
9b40: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
9b50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
9b60: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
9b70: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
9b80: 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  ,struct action *
9b90: 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  );../* Compute t
9ba0: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
9bb0: 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63  s, and resolve c
9bc0: 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69  onflicts..*/.voi
9bd0: 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74  d FindActions(st
9be0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
9bf0: 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20  ).{.  int i,j;. 
9c00: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9c10: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74  cfp;.  struct st
9c20: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
9c30: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
9c40: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
9c50: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  ;..  /* Add all 
9c60: 6f 66 20 74 68 65 20 72 65 64 75 63 65 20 61 63  of the reduce ac
9c70: 74 69 6f 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64  tions.  ** A red
9c80: 75 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64  uce action is ad
9c90: 64 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65  ded for each ele
9ca0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ment of the foll
9cb0: 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20  owset of.  ** a 
9cc0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68  configuration wh
9cd0: 69 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20  ich has its dot 
9ce0: 61 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  at the extreme r
9cf0: 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ight..  */.  for
9d00: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9d10: 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a  tate; i++){   /*
9d20: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73   Loop over all s
9d30: 74 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70  tates */.    stp
9d40: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
9d50: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
9d60: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
9d70: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20  fp=cfp->next){  
9d80: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
9d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
9da0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  */.      if( cfp
9db0: 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d  ->rp->nrhs==cfp-
9dc0: 3e 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f  >dot ){        /
9dd0: 2a 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72  * Is dot at extr
9de0: 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20  eme right? */.  
9df0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9e00: 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
9e10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9e20: 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66    if( SetFind(cf
9e30: 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20  p->fws,j) ){.   
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9e50: 61 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  a reduce action 
9e60: 74 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74  to the state "st
9e70: 70 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  p" which will re
9e80: 64 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20  duce by the.    
9e90: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20          ** rule 
9ea0: 22 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65  "cfp->rp" if the
9eb0: 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f   lookahead symbo
9ec0: 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62  l is "lemp->symb
9ed0: 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20  ols[j]" */.     
9ee0: 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64         Action_ad
9ef0: 64 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43  d(&stp->ap,REDUC
9f00: 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  E,lemp->symbols[
9f10: 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e  j],(char *)cfp->
9f20: 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rp);.          }
9f30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9f50: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
9f60: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
9f70: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
9f80: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
9f90: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
9fa0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
9fb0: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
9fc0: 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b  >startRule->lhs;
9fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
9fe0: 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75   = lemp->startRu
9ff0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f  le->lhs;.  }.  /
a000: 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72  * Add to the fir
a010: 73 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20  st state (which 
a020: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74  is always the st
a030: 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20  arting state of 
a040: 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20  the.  ** finite 
a050: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61  state machine) a
a060: 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45  n action to ACCE
a070: 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  PT if the lookah
a080: 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  ead is the.  ** 
a090: 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61  start nontermina
a0a0: 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f  l.  */.  Action_
a0b0: 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  add(&lemp->sorte
a0c0: 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c  d[0]->ap,ACCEPT,
a0d0: 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73  sp,0);..  /* Res
a0e0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a  olve conflicts *
a0f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
a100: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a110: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a120: 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a  tion *ap, *nap;.
a130: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
a140: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f  sorted[i];.    /
a150: 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61  * assert( stp->a
a160: 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d  p ); */.    stp-
a170: 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
a180: 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20  t(stp->ap);.    
a190: 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
a1a0: 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20  ap && ap->next; 
a1b0: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
a1c0: 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e      for(nap=ap->
a1d0: 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70  next; nap && nap
a1e0: 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61  ->sp==ap->sp; na
a1f0: 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=nap->next){.  
a200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
a210: 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61  o actions "ap" a
a220: 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68  nd "nap" have th
a230: 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64  e same lookahead
a240: 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69  ..         ** Fi
a250: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
a260: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ne should be use
a270: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65  d */.         le
a280: 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d  mp->nconflict +=
a290: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
a2a0: 74 28 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20  t(ap,nap);.     
a2b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a2c0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
a2d0: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
a2e0: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
a2f0: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
a300: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
a310: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
a320: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
a330: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
a340: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
a350: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a360: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a370: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
a380: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
a390: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
a3a0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
a3b0: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
a3c0: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
a3d0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
a3e0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
a3f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
a400: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
a410: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
a420: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
a430: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a440: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
a450: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
a460: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
a470: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
a480: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
a490: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
a4a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
a4b0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
a4c0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
a4d0: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
a4e0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
a4f0: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
a500: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
a510: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f  ero..**.** NO LO
a520: 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20  NGER TRUE:.**   
a530: 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e  To resolve a con
a540: 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f  flict, first loo
a550: 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68  k to see if eith
a560: 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69  er action.**   i
a570: 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75  s on an error ru
a580: 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
a590: 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69  e, take the acti
a5a0: 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73  on which.**   is
a5b0: 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20   not associated 
a5c0: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72  with the error r
a5d0: 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72  ule.  If neither
a5e0: 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63   or both.**   ac
a5f0: 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69  tions are associ
a600: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
a610: 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72  or rule, then tr
a620: 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72  y to.**   use pr
a630: 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f  ecedence to reso
a640: 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  lve the conflict
a650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
a660: 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48  r action is a SH
a670: 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  IFT, then it mus
a680: 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a  t be apx.  This.
a690: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27  ** function won'
a6a0: 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74  t work if apx->t
a6b0: 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20  ype==REDUCE and 
a6c0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6e0: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
a6f0: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
a700: 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74  n *apx,.  struct
a710: 20 61 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a   action *apy.){.
a720: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
a730: 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e  *spx, *spy;.  in
a740: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
a750: 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d  assert( apx->sp=
a760: 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20  =apy->sp );  /* 
a770: 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20  Otherwise there 
a780: 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66  would be no conf
a790: 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70  lict */.  if( ap
a7a0: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
a7b0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  & apy->type==SHI
a7c0: 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74  FT ){.    apy->t
a7d0: 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54  ype = SSCONFLICT
a7e0: 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  ;.    errcnt++;.
a7f0: 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74    }.  if( apx->t
a800: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
a810: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
a820: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
a830: 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20  ->sp;.    spy = 
a840: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
a850: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d  ym;.    if( spy=
a860: 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c  =0 || spx->prec<
a870: 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30  0 || spy->prec<0
a880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
a890: 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e   enough preceden
a8a0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ce information. 
a8b0: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
a8c0: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
a8d0: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
a8e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a8f0: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
a900: 65 63 20 29 7b 20 20 20 20 2f 2a 20 68 69 67 68  ec ){    /* high
a910: 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69  er precedence wi
a920: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  ns */.      apy-
a930: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
a940: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
a950: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
a960: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a970: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
a980: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
a990: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
a9a0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
a9b0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54  px->assoc==RIGHT
a9c0: 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61   ){ /* Use opera
a9d0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  tor */.      apy
a9e0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
a9f0: 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20  LVED;           
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69    /* associativi
aa20: 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ty */.    }else 
aa30: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
aa40: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
aa50: 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20  >assoc==LEFT ){ 
aa60: 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65   /* to break tie
aa70: 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   */.      apx->t
aa80: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
aa90: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
aaa0: 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d      assert( spx-
aab0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
aac0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
aad0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70  NONE );.      ap
aae0: 78 2d 3e 74 79 70 65 20 3d 20 45 52 52 4f 52 3b  x->type = ERROR;
aaf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ab00: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  f( apx->type==RE
ab10: 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70  DUCE && apy->typ
ab20: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
ab30: 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70   spx = apx->x.rp
ab40: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73  ->precsym;.    s
ab50: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
ab60: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
ab70: 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d   spx==0 || spy==
ab80: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
ab90: 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65   ||.    spy->pre
aba0: 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  c<0 || spx->prec
abb0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  ==spy->prec ){. 
abc0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
abd0: 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   RRCONFLICT;.   
abe0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
abf0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
ac00: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
ac10: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
ac20: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
ac30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ac40: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
ac50: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
ac60: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
ac70: 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  VED;.    }.  }el
ac80: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0a  se{.    assert(.
ac90: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
aca0: 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =SH_RESOLVED ||.
acb0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
acc0: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =RD_RESOLVED ||.
acd0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
ace0: 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SSCONFLICT ||. 
acf0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
ad00: 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SRCONFLICT ||.  
ad10: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
ad20: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
ad30: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48     apy->type==SH
ad40: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad50: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44     apy->type==RD
ad60: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad70: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53     apy->type==SS
ad80: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
ad90: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43    apy->type==SRC
ada0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
adb0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apy->type==RRCO
adc0: 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  NFLICT.    );.  
add0: 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f    /* The REDUCE/
ade0: 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f  SHIFT case canno
adf0: 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73 65  t happen because
ae00: 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66   SHIFTs come bef
ae10: 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43  ore.    ** REDUC
ae20: 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20  Es on the list. 
ae30: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
ae40: 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20  s point it must 
ae50: 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  be because.    *
ae60: 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * the parser con
ae70: 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61 64  flict had alread
ae80: 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  y been resolved.
ae90: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
aea0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a   errcnt;.}./****
aeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aec0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
aed0: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a  "configlist.c" *
aee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aef0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
af00: 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63  Routines to proc
af10: 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75  essing a configu
af20: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
af30: 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65  building a state
af40: 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
af50: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
af60: 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74  r..*/..static st
af70: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65  ruct config *fre
af80: 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  elist = 0;      
af90: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
afa0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
afb0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
afc0: 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20  config *current 
afd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
afe0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e  p of list of con
aff0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
b000: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
b010: 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64  fig **currentend
b020: 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20   = 0;   /* Last 
b030: 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  on list of confi
b040: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
b050: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69  uct config *basi
b060: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
b070: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
b080: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
b090: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
b0a0: 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e  config **basisen
b0b0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e  d = 0;     /* En
b0c0: 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  d of list of bas
b0d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f  is configs */../
b0e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b0f0: 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66  er to a new conf
b100: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
b110: 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66  VATE struct conf
b120: 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f  ig *newconfig(vo
b130: 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  id){.  struct co
b140: 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20  nfig *newcfg;.  
b150: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
b160: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b170: 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20    int amt = 3;. 
b180: 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73     freelist = (s
b190: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63  truct config *)c
b1a0: 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
b1b0: 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  of(struct config
b1c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  ) );.    if( fre
b1d0: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
b1e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b1f0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
b200: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
b210: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
b220: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
b230: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
b240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
b250: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
b260: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
b270: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
b280: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
b290: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
b2a0: 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74  ewcfg = freelist
b2b0: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
b2c0: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
b2d0: 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a   return newcfg;.
b2e0: 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67  }../* The config
b2f0: 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73  uration "old" is
b300: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20   no longer used 
b310: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
b320: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72  deleteconfig(str
b330: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29  uct config *old)
b340: 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d  .{.  old->next =
b350: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
b360: 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a  elist = old;.}..
b370: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
b380: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
b390: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
b3a0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
b3b0: 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63  _init(void){.  c
b3c0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
b3d0: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
b3e0: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
b3f0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
b400: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
b410: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
b420: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
b430: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
b440: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b450: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
b460: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
b470: 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e  (void){.  curren
b480: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
b490: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
b4a0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
b4b0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
b4c0: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
b4d0: 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75  clear(0);.  retu
b4e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e  rn;.}../* Add an
b4f0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
b500: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
b510: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
b520: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
b530: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a  Configlist_add(.
b540: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
b550: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p,    /* The rul
b560: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20  e */.  int dot  
b570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b580: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
b590: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
b5a0: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
b5b0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63  */.){.  struct c
b5c0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
b5d0: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
b5e0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b5f0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
b600: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
b610: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
b620: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
b630: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
b640: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
b650: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
b660: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
b670: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
b680: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
b690: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
b6a0: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
b6b0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b6c0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b6d0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b6e0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b6f0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b700: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b710: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b720: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
b730: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b750: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
b760: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b770: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
b780: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b790: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
b7a0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
b7b0: 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  is(struct rule *
b7c0: 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20  rp, int dot).{. 
b7d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b7e0: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
b7f0: 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21  ssert( basisend!
b800: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b810: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b820: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b830: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b840: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b850: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b860: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b870: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b880: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b890: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b8a0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b8b0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b8c0: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b8d0: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b8e0: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b8f0: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b900: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b910: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b920: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b930: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b940: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b950: 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73  next;.    *basis
b960: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62  end = cfp;.    b
b970: 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e  asisend = &cfp->
b980: 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  bp;.    Configta
b990: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b9a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b9b0: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  p;.}../* Compute
b9c0: 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20   the closure of 
b9d0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b9e0: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
b9f0: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
ba00: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
ba10: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
ba20: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e   config *cfp, *n
ba30: 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20  ewcfp;.  struct 
ba40: 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70  rule *rp, *newrp
ba50: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
ba60: 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69  l *sp, *xsp;.  i
ba70: 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73  nt i, dot;..  as
ba80: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
ba90: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70  !=0 );.  for(cfp
baa0: 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63  =current; cfp; c
bab0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
bac0: 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b     rp = cfp->rp;
bad0: 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e  .    dot = cfp->
bae0: 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74  dot;.    if( dot
baf0: 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  >=rp->nrhs ) con
bb00: 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20  tinue;.    sp = 
bb10: 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20  rp->rhs[dot];.  
bb20: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
bb30: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
bb40: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c       if( sp->rul
bb50: 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70  e==0 && sp!=lemp
bb60: 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
bb70: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
bb80: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
bb90: 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61  line,"Nontermina
bba0: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20  l \"%s\" has no 
bbb0: 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  rules.",.       
bbc0: 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20     sp->name);.  
bbd0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
bbe0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
bbf0: 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d        for(newrp=
bc00: 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b  sp->rule; newrp;
bc10: 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65   newrp=newrp->ne
bc20: 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20  xtlhs){.        
bc30: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
bc40: 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29  ist_add(newrp,0)
bc50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bc60: 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68  dot+1; i<rp->nrh
bc70: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
bc80: 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73     xsp = rp->rhs
bc90: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
bca0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45  f( xsp->type==TE
bcb0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
bcc0: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
bcd0: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e  cfp->fws,xsp->in
bce0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bd00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70     }else if( xsp
bd10: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
bd20: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
bd30: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bd40: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
bd50: 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b   k<xsp->nsubsym;
bd60: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
bd70: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
bd80: 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75  fp->fws, xsp->su
bd90: 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b  bsym[k]->index);
bda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bdb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bdc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
bdd0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e{.            S
bde0: 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e  etUnion(newcfp->
bdf0: 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65  fws,xsp->firstse
be00: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
be10: 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d  if( xsp->lambda=
be20: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
be30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
be40: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
be50: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
be60: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
be70: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
be80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
be90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
bea0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
beb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
bec0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
bed0: 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b  list_sort(void){
bee0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
bef0: 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f  ruct config*)mso
bf00: 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e  rt((char*)curren
bf10: 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72  t,(char**)&(curr
bf20: 65 6e 74 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20  ent->next),.    
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
bf50: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
bf60: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
bf70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
bf80: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
bf90: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
bfa0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
bfb0: 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29  _sortbasis(void)
bfc0: 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72  {.  basis = (str
bfd0: 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72  uct config*)msor
bfe0: 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74  t((char*)current
bff0: 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65  ,(char**)&(curre
c000: 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20  nt->bp),.       
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 20 43 6f 6e 66 69 67 63           Configc
c030: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
c040: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
c050: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
c060: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c070: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
c080: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
c090: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
c0a0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
c0b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
c0c0: 65 74 75 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73  eturn(void){.  s
c0d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
c0e0: 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65  d;.  old = curre
c0f0: 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  nt;.  current = 
c100: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
c110: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c  = 0;.  return ol
c120: 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  d;.}../* Return 
c130: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c140: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
c150: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
c160: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
c170: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
c180: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
c190: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 7b 0a  st_basis(void){.
c1a0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
c1b0: 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61  *old;.  old = ba
c1c0: 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  sis;.  basis = 0
c1d0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
c1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
c1f0: 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65  }../* Free all e
c200: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67  lements of the g
c210: 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  iven configurati
c220: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
c230: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73  Configlist_eat(s
c240: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
c250: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
c260: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
c270: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
c280: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
c290: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
c2a0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
c2b0: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
c2c0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
c2d0: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
c2e0: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
c2f0: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
c300: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
c310: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
c320: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
c340: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
c350: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
c380: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
c390: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
c3a0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
c3b0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
c3c0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
c3d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
c3e0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
c3f0: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
c400: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
c410: 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  d: ", filename, 
c420: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74  lineno);.  va_st
c430: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
c440: 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  .  vfprintf(stde
c450: 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  rr,format,ap);. 
c460: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66   va_end(ap);.  f
c470: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
c480: 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  \n");.}./*******
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
c4a0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
c4b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
c4e0: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
c4f0: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
c500: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
c510: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
c520: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
c530: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
c540: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
c550: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
c560: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
c570: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
c580: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
c590: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
c5a0: 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66  void){.  fprintf
c5b0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
c5c0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
c5d0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
c5e0: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
c5f0: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
c600: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c610: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
c620: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
c630: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
c640: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
c650: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c660: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
c670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c680: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
c690: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
c6a0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
c6b0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
c6c0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
c6d0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
c6e0: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
c6f0: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
c700: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
c710: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
c720: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
c730: 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72  azDefine = (char
c740: 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44   **) realloc(azD
c750: 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a  efine, sizeof(az
c760: 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69  Define[0])*nDefi
c770: 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66  ne);.  if( azDef
c780: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ine==0 ){.    fp
c790: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75  rintf(stderr,"ou
c7a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
c7b0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
c7c0: 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66  }.  paz = &azDef
c7d0: 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a  ine[nDefine-1];.
c7e0: 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a    *paz = (char *
c7f0: 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  ) malloc( lemonS
c800: 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20  trlen(z)+1 );.  
c810: 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20  if( *paz==0 ){. 
c820: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
c830: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
c840: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
c850: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
c860: 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a  trcpy(*paz, z);.
c870: 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a    for(z=*paz; *z
c880: 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b   && *z!='='; z++
c890: 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a  ){}.  *z = 0;.}.
c8a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73  .static char *us
c8b0: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
c8c0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
c8d0: 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  oid handle_T_opt
c8e0: 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ion(char *z){.  
c8f0: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
c900: 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  e = (char *) mal
c910: 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
c920: 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75  (z)+1 );.  if( u
c930: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
c940: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72  ==0 ){.    memor
c950: 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
c960: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73   lemon_strcpy(us
c970: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
c980: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65   z);.}../* Merge
c990: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73   together to lis
c9a0: 74 73 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65  ts of rules orde
c9b0: 72 65 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c  red by rule.iRul
c9c0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e */.static stru
c9d0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65  ct rule *Rule_me
c9e0: 72 67 65 28 73 74 72 75 63 74 20 72 75 6c 65 20  rge(struct rule 
c9f0: 2a 70 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *pA, struct rule
ca00: 20 2a 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20   *pB){.  struct 
ca10: 72 75 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30  rule *pFirst = 0
ca20: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
ca30: 2a 2a 70 70 50 72 65 76 20 3d 20 26 70 46 69 72  **ppPrev = &pFir
ca40: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  st;.  while( pA 
ca50: 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
ca60: 20 70 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69   pA->iRule<pB->i
ca70: 52 75 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Rule ){.      *p
ca80: 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20  pPrev = pA;.    
ca90: 20 20 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e    ppPrev = &pA->
caa0: 6e 65 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d  next;.      pA =
cab0: 20 70 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d   pA->next;.    }
cac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
cad0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rev = pB;.      
cae0: 70 70 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65  ppPrev = &pB->ne
caf0: 78 74 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  xt;.      pB = p
cb00: 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  B->next;.    }. 
cb10: 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
cb20: 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b     *ppPrev = pA;
cb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
cb40: 70 50 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a  pPrev = pB;.  }.
cb50: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
cb60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
cb70: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69   list of rules i
cb80: 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65  n order of incre
cb90: 61 73 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75  asing iRule valu
cba0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e.*/.static stru
cbb0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f  ct rule *Rule_so
cbc0: 72 74 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  rt(struct rule *
cbd0: 72 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rp){.  int i;.  
cbe0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65  struct rule *pNe
cbf0: 78 74 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  xt;.  struct rul
cc00: 65 20 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73  e *x[32];.  mems
cc10: 65 74 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(x, 0, sizeof(
cc20: 78 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70  x));.  while( rp
cc30: 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20   ){.    pNext = 
cc40: 72 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70  rp->next;.    rp
cc50: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
cc60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
cc70: 66 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d  f(x)/sizeof(x[0]
cc80: 29 20 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b  ) && x[i]; i++){
cc90: 0a 20 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65  .      rp = Rule
cca0: 5f 6d 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29  _merge(x[i], rp)
ccb0: 3b 0a 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30  ;.      x[i] = 0
ccc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d  ;.    }.    x[i]
ccd0: 20 3d 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20   = rp;.    rp = 
cce0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20  pNext;.  }.  rp 
ccf0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
cd00: 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65  i<sizeof(x)/size
cd10: 6f 66 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  of(x[0]); i++){.
cd20: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
cd30: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
cd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a   }.  return rp;.
cd50: 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  }../* forward re
cd60: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
cd70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
cd80: 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
cd90: 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
cda0: 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a  , int *pnByte);.
cdb0: 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
cdc0: 6c 65 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22  le line of the "
cdd0: 50 61 72 73 65 72 20 53 74 61 74 73 22 20 6f 75  Parser Stats" ou
cde0: 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tput.*/.static v
cdf0: 6f 69 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63  oid stats_line(c
ce00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
ce10: 6c 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a  l, int iValue){.
ce20: 20 20 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c    int nLabel = l
ce30: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65  emonStrlen(zLabe
ce40: 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  l);.  printf("  
ce50: 25 73 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a  %s%.*s %5d\n", z
ce60: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
ce70: 33 35 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e  35-nLabel, "....
ce80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
ce90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20  ............",. 
cea0: 20 20 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b          iValue);
ceb0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20  .}../* The main 
cec0: 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20  program.  Parse 
ced0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
cee0: 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f   and do it... */
cef0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
cf00: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
cf10: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
cf20: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
cf30: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
cf40: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
cf50: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
cf60: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
cf70: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
cf80: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
cf90: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
cfa0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
cfb0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
cfc0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
cfd0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
cfe0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
cff0: 74 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74  tic int noResort
d000: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73   = 0;.  static s
d010: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
d020: 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20  options[] = {.  
d030: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22    {OPT_FLAG, "b"
d040: 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66  , (char*)&basisf
d050: 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79  lag, "Print only
d060: 20 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65   the basis in re
d070: 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  port."},.    {OP
d080: 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68  T_FLAG, "c", (ch
d090: 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22  ar*)&compress, "
d0a0: 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74  Don't compress t
d0b0: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e  he action table.
d0c0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
d0d0: 52 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68  R, "D", (char*)h
d0e0: 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20  andle_D_option, 
d0f0: 22 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65  "Define an %ifde
d100: 66 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20  f macro."},.    
d110: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 66 22 2c 20  {OPT_FSTR, "f", 
d120: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
d130: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d  laceholder for -
d140: 66 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  f compiler optio
d150: 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ns.)"},.    {OPT
d160: 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61  _FLAG, "g", (cha
d170: 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69  r*)&rpflag, "Pri
d180: 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f  nt grammar witho
d190: 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20  ut actions."},. 
d1a0: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49     {OPT_FSTR, "I
d1b0: 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20  ", 0, "Ignored. 
d1c0: 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f   (Placeholder fo
d1d0: 72 20 27 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20  r '-I' compiler 
d1e0: 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20  options.)"},.   
d1f0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
d200: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
d210: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
d220: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
d230: 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  e file."},.    {
d240: 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28  OPT_FLAG, "l", (
d250: 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73  char*)&nolinenos
d260: 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72  flag, "Do not pr
d270: 69 6e 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d  int #line statem
d280: 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  ents."},.    {OP
d290: 54 5f 46 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20  T_FSTR, "O", 0, 
d2a0: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
d2b0: 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27  eholder for '-O'
d2c0: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
d2d0: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
d2e0: 46 4c 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72  FLAG, "p", (char
d2f0: 2a 29 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63  *)&showPrecedenc
d300: 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20  eConflict,.     
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d320: 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72  Show conflicts r
d330: 65 73 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65  esolved by prece
d340: 64 65 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20  dence rules"},. 
d350: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
d360: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
d370: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
d380: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
d390: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
d3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28  OPT_FLAG, "r", (
d3b0: 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c  char*)&noResort,
d3c0: 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72   "Do not sort or
d3d0: 20 72 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73   renumber states
d3e0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d3f0: 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26  G, "s", (char*)&
d400: 73 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20  statistics,.    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d430: 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61  Print parser sta
d440: 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ts to standard o
d450: 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f  utput."},.    {O
d460: 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63  PT_FLAG, "x", (c
d470: 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22  har*)&version, "
d480: 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f  Print the versio
d490: 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20  n number."},.   
d4a0: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c   {OPT_FSTR, "T",
d4b0: 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54   (char*)handle_T
d4c0: 5f 6f 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66  _option, "Specif
d4d0: 79 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  y a template fil
d4e0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
d4f0: 53 54 52 2c 20 22 57 22 2c 20 30 2c 20 22 49 67  STR, "W", 0, "Ig
d500: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
d510: 6c 64 65 72 20 66 6f 72 20 27 2d 57 27 20 63 6f  lder for '-W' co
d520: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
d530: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d540: 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20  G,0,0,0}.  };.  
d550: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69  int i;.  int exi
d560: 74 63 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  tcode;.  struct 
d570: 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72  lemon lem;.  str
d580: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
d590: 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70   OptInit(argv,op
d5a0: 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20  tions,stderr);. 
d5b0: 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a   if( version ){.
d5c0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d       printf("Lem
d5d0: 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e  on version 1.0\n
d5e0: 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29  ");.     exit(0)
d5f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e  ;.  }.  if( OptN
d600: 41 72 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20  Args()!=1 ){.   
d610: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d620: 22 45 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c  "Exactly one fil
d630: 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
d640: 73 20 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b  s required.\n");
d650: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
d660: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c  }.  memset(&lem,
d670: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29   0, sizeof(lem))
d680: 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  ;.  lem.errorcnt
d690: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74   = 0;..  /* Init
d6a0: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69  ialize the machi
d6b0: 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f  ne */.  Strsafe_
d6c0: 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c  init();.  Symbol
d6d0: 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65  _init();.  State
d6e0: 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61  _init();.  lem.a
d6f0: 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  rgv0 = argv[0];.
d700: 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d    lem.filename =
d710: 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65   OptArg(0);.  le
d720: 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61  m.basisflag = ba
d730: 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e  sisflag;.  lem.n
d740: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e  olinenosflag = n
d750: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20  olinenosflag;.  
d760: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b  Symbol_new("$");
d770: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
d780: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
d790: 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20 20   Parse(&lem);.  
d7a0: 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  if( lem.errorcnt
d7b0: 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f   ) exit(lem.erro
d7c0: 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65 6d  rcnt);.  if( lem
d7d0: 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  .nrule==0 ){.   
d7e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d7f0: 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c  "Empty grammar.\
d800: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
d810: 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72 72 73  ;.  }.  lem.errs
d820: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  ym = Symbol_find
d830: 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a  ("error");..  /*
d840: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
d850: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
d860: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
d870: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
d880: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
d890: 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c  nsymbol = Symbol
d8a0: 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c 65 6d 2e  _count();.  lem.
d8b0: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
d8c0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
d8d0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73 79  r(i=0; i<lem.nsy
d8e0: 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73  mbol; i++) lem.s
d8f0: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78  ymbols[i]->index
d900: 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65   = i;.  qsort(le
d910: 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73  m.symbols,lem.ns
d920: 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28 73 74 72  ymbol,sizeof(str
d930: 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 20 53 79  uct symbol*), Sy
d940: 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72  mbolcmpp);.  for
d950: 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73 79 6d  (i=0; i<lem.nsym
d960: 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79  bol; i++) lem.sy
d970: 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20  mbols[i]->index 
d980: 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65  = i;.  while( le
d990: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d 2d 3e  m.symbols[i-1]->
d9a0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
d9b0: 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  NAL ){ i--; }.  
d9c0: 61 73 73 65 72 74 28 20 73 74 72 63 6d 70 28 6c  assert( strcmp(l
d9d0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d 2d  em.symbols[i-1]-
d9e0: 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75 6c 74 7d  >name,"{default}
d9f0: 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65 6d 2e 6e  ")==0 );.  lem.n
da00: 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20 31 3b 0a  symbol = i - 1;.
da10: 20 20 66 6f 72 28 69 3d 31 3b 20 49 53 55 50 50    for(i=1; ISUPP
da20: 45 52 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  ER(lem.symbols[i
da30: 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b  ]->name[0]); i++
da40: 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e  );.  lem.ntermin
da50: 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 73  al = i;..  /* As
da60: 73 69 67 6e 20 73 65 71 75 65 6e 74 69 61 6c 20  sign sequential 
da70: 72 75 6c 65 20 6e 75 6d 62 65 72 73 2e 20 20 53  rule numbers.  S
da80: 74 61 72 74 20 77 69 74 68 20 30 2e 20 20 50 75  tart with 0.  Pu
da90: 74 20 72 75 6c 65 73 20 74 68 61 74 20 68 61 76  t rules that hav
daa0: 65 20 6e 6f 0a 20 20 2a 2a 20 72 65 64 75 63 65  e no.  ** reduce
dab0: 20 61 63 74 69 6f 6e 20 43 2d 63 6f 64 65 20 61   action C-code a
dac0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
dad0: 68 65 6d 20 6c 61 73 74 2c 20 73 6f 20 74 68 61  hem last, so tha
dae0: 74 20 74 68 65 20 73 77 69 74 63 68 28 29 0a 20  t the switch(). 
daf0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
db00: 61 74 20 73 65 6c 65 63 74 73 20 72 65 64 75 63  at selects reduc
db10: 74 69 6f 6e 20 61 63 74 69 6f 6e 73 20 77 69 6c  tion actions wil
db20: 6c 20 68 61 76 65 20 61 20 73 6d 61 6c 6c 65 72  l have a smaller
db30: 20 6a 75 6d 70 20 74 61 62 6c 65 2e 0a 20 20 2a   jump table..  *
db40: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d  /.  for(i=0, rp=
db50: 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b 20 72 70  lem.rule; rp; rp
db60: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
db70: 72 70 2d 3e 69 52 75 6c 65 20 3d 20 72 70 2d 3e  rp->iRule = rp->
db80: 63 6f 64 65 20 3f 20 69 2b 2b 20 3a 20 2d 31 3b  code ? i++ : -1;
db90: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
dba0: 6d 2e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  m.rule; rp; rp=r
dbb0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
dbc0: 28 20 72 70 2d 3e 69 52 75 6c 65 3c 30 20 29 20  ( rp->iRule<0 ) 
dbd0: 72 70 2d 3e 69 52 75 6c 65 20 3d 20 69 2b 2b 3b  rp->iRule = i++;
dbe0: 0a 20 20 7d 0a 20 20 6c 65 6d 2e 73 74 61 72 74  .  }.  lem.start
dbf0: 52 75 6c 65 20 3d 20 6c 65 6d 2e 72 75 6c 65 3b  Rule = lem.rule;
dc00: 0a 20 20 6c 65 6d 2e 72 75 6c 65 20 3d 20 52 75  .  lem.rule = Ru
dc10: 6c 65 5f 73 6f 72 74 28 6c 65 6d 2e 72 75 6c 65  le_sort(lem.rule
dc20: 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
dc30: 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74  e a reprint of t
dc40: 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72  he grammar, if r
dc50: 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20  equested on the 
dc60: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
dc70: 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a    if( rpflag ){.
dc80: 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d      Reprint(&lem
dc90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dca0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
dcb0: 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66  e size for all f
dcc0: 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20  ollow and first 
dcd0: 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53  sets */.    SetS
dce0: 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ize(lem.ntermina
dcf0: 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  l+1);..    /* Fi
dd00: 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  nd the precedenc
dd10: 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64  e for every prod
dd20: 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61  uction rule (tha
dd30: 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20  t has one) */.  
dd40: 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64    FindRulePreced
dd50: 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ences(&lem);..  
dd60: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
dd70: 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69   lambda-nontermi
dd80: 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72  nals and the fir
dd90: 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72  st-sets for ever
dda0: 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d  y.    ** nonterm
ddb0: 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inal */.    Find
ddc0: 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b  FirstSets(&lem);
ddd0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
dde0: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
ddf0: 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20  s.  Also record 
de00: 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
de10: 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69  gation.    ** li
de20: 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  nks so that the 
de30: 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62  follow-set can b
de40: 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72  e computed later
de50: 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61   */.    lem.nsta
de60: 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64  te = 0;.    Find
de70: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20  States(&lem);.  
de80: 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53    lem.sorted = S
de90: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a  tate_arrayof();.
dea0: 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c  .    /* Tie up l
deb0: 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65  oose ends on the
dec0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
ded0: 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69  ks */.    FindLi
dee0: 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  nks(&lem);..    
def0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
df00: 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65  ollow set of eve
df10: 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e  ry reducible con
df20: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
df30: 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73    FindFollowSets
df40: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
df50: 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
df60: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
df70: 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65   FindActions(&le
df80: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
df90: 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20  ress the action 
dfa0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66  tables */.    if
dfb0: 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20  ( compress==0 ) 
dfc0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26  CompressTables(&
dfd0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  lem);..    /* Re
dfe0: 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75 6d 62  order and renumb
dff0: 65 72 20 74 68 65 20 73 74 61 74 65 73 20 73 6f  er the states so
e000: 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74   that states wit
e010: 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a  h fewer choices.
e020: 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61 74 20      ** occur at 
e030: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
e040: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
e050: 6e 20 74 68 61 74 20 68 65 6c 70 73 20 6d 61 6b  n that helps mak
e060: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 67 65 6e  e the.    ** gen
e070: 65 72 61 74 65 64 20 70 61 72 73 65 72 20 74 61  erated parser ta
e080: 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f  bles smaller. */
e090: 0a 20 20 20 20 69 66 28 20 6e 6f 52 65 73 6f 72  .    if( noResor
e0a0: 74 3d 3d 30 20 29 20 52 65 73 6f 72 74 53 74 61  t==0 ) ResortSta
e0b0: 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  tes(&lem);..    
e0c0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65  /* Generate a re
e0d0: 70 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73  port of the pars
e0e0: 65 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28  er generated.  (
e0f0: 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66  the "y.output" f
e100: 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile) */.    if( 
e110: 21 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f  !quiet ) ReportO
e120: 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20  utput(&lem);..  
e130: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
e140: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f  e source code fo
e150: 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  r the parser */.
e160: 20 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28      ReportTable(
e170: 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a  &lem, mhflag);..
e180: 20 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61      /* Produce a
e190: 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
e1a0: 20 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e   use by the scan
e1b0: 6e 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70  ner.  (This step
e1c0: 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74   is.    ** omitt
e1d0: 65 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f  ed if the "-m" o
e1e0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65  ption is used be
e1f0: 63 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72  cause makeheader
e200: 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65  s will.    ** ge
e210: 6e 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20  nerate the file 
e220: 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20  for us.) */.    
e230: 69 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65  if( !mhflag ) Re
e240: 70 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29  portHeader(&lem)
e250: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
e260: 69 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72  istics ){.    pr
e270: 69 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61  intf("Parser sta
e280: 74 69 73 74 69 63 73 3a 5c 6e 22 29 3b 0a 20 20  tistics:\n");.  
e290: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 65    stats_line("te
e2a0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c  rminal symbols",
e2b0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b   lem.nterminal);
e2c0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e2d0: 22 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79  "non-terminal sy
e2e0: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79 6d  mbols", lem.nsym
e2f0: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
e300: 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  nal);.    stats_
e310: 6c 69 6e 65 28 22 74 6f 74 61 6c 20 73 79 6d 62  line("total symb
e320: 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f  ols", lem.nsymbo
e330: 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  l);.    stats_li
e340: 6e 65 28 22 72 75 6c 65 73 22 2c 20 6c 65 6d 2e  ne("rules", lem.
e350: 6e 72 75 6c 65 29 3b 0a 20 20 20 20 73 74 61 74  nrule);.    stat
e360: 73 5f 6c 69 6e 65 28 22 73 74 61 74 65 73 22 2c  s_line("states",
e370: 20 6c 65 6d 2e 6e 78 73 74 61 74 65 29 3b 0a 20   lem.nxstate);. 
e380: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 63     stats_line("c
e390: 6f 6e 66 6c 69 63 74 73 22 2c 20 6c 65 6d 2e 6e  onflicts", lem.n
e3a0: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 20 20 73  conflict);.    s
e3b0: 74 61 74 73 5f 6c 69 6e 65 28 22 61 63 74 69 6f  tats_line("actio
e3c0: 6e 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 22  n table entries"
e3d0: 2c 20 6c 65 6d 2e 6e 61 63 74 69 6f 6e 74 61 62  , lem.nactiontab
e3e0: 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e  );.    stats_lin
e3f0: 65 28 22 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62  e("lookahead tab
e400: 6c 65 20 65 6e 74 72 69 65 73 22 2c 20 6c 65 6d  le entries", lem
e410: 2e 6e 6c 6f 6f 6b 61 68 65 61 64 74 61 62 29 3b  .nlookaheadtab);
e420: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e430: 22 74 6f 74 61 6c 20 74 61 62 6c 65 20 73 69 7a  "total table siz
e440: 65 20 28 62 79 74 65 73 29 22 2c 20 6c 65 6d 2e  e (bytes)", lem.
e450: 74 61 62 6c 65 73 69 7a 65 29 3b 0a 20 20 7d 0a  tablesize);.  }.
e460: 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c    if( lem.nconfl
e470: 69 63 74 20 3e 20 30 20 29 7b 0a 20 20 20 20 66  ict > 0 ){.    f
e480: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
e490: 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  d parsing confli
e4a0: 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e  cts.\n",lem.ncon
e4b0: 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  flict);.  }..  /
e4c0: 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * return 0 on su
e4d0: 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c  ccess, 1 on fail
e4e0: 75 72 65 2e 20 2a 2f 0a 20 20 65 78 69 74 63 6f  ure. */.  exitco
e4f0: 64 65 20 3d 20 28 28 6c 65 6d 2e 65 72 72 6f 72  de = ((lem.error
e500: 63 6e 74 20 3e 20 30 29 20 7c 7c 20 28 6c 65 6d  cnt > 0) || (lem
e510: 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 29 29  .nconflict > 0))
e520: 20 3f 20 31 20 3a 20 30 3b 0a 20 20 65 78 69 74   ? 1 : 0;.  exit
e530: 28 65 78 69 74 63 6f 64 65 29 3b 0a 20 20 72 65  (exitcode);.  re
e540: 74 75 72 6e 20 28 65 78 69 74 63 6f 64 65 29 3b  turn (exitcode);
e550: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
e560: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
e570: 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22  e file "msort.c"
e580: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69  /./*.** A generi
e5b0: 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72 6f  c merge-sort pro
e5c0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47  gram..**.** USAG
e5d0: 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22 20  E:.** Let "ptr" 
e5e0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
e5f0: 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20 77  some structure w
e600: 68 69 63 68 20 69 73 20 61 74 20 74 68 65 20 68  hich is at the h
e610: 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c  ead of.** a null
e620: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74  -terminated list
e630: 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74 20  .  Then to sort 
e640: 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a  the list call:.*
e650: 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20 6d  *.**     ptr = m
e660: 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d 3e  sort(ptr,&(ptr->
e670: 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a  next),cmpfnc);.*
e680: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76  *.** In the abov
e690: 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20 61  e, "cmpfnc" is a
e6a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
e6b0: 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d  nction which com
e6c0: 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73  pares.** two ins
e6d0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73 74  tances of the st
e6e0: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
e6f0: 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20  rns an integer, 
e700: 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e  as in.** strcmp.
e710: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67    The second arg
e720: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
e730: 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  er to the pointe
e740: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f  r to the.** seco
e750: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  nd element of th
e760: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  e linked list.  
e770: 54 68 69 73 20 61 64 64 72 65 73 73 20 69 73 20  This address is 
e780: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a  used to compute.
e790: 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  ** the offset to
e7a0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
e7b0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72  d within the str
e7c0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66 66  ucture.  The off
e7d0: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e  set to.** the "n
e7e0: 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74 20  ext" field must 
e7f0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20  be constant for 
e800: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
e810: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
e820: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  * The function r
e830: 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f 69  eturns a new poi
e840: 6e 74 65 72 20 77 68 69 63 68 20 69 73 20 74 68  nter which is th
e850: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69  e head of the li
e860: 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72 74  st.** after sort
e870: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52  ing..**.** ALGOR
e880: 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73  ITHM:.** Merge-s
e890: 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ort..*/../*.** R
e8a0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
e8b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72 75  to the next stru
e8c0: 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69 6e  cture in the lin
e8d0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65  ked list..*/.#de
e8e0: 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a 28  fine NEXT(A) (*(
e8f0: 63 68 61 72 2a 2a 29 28 28 28 63 68 61 72 2a 29  char**)(((char*)
e900: 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a  A)+offset))../*.
e910: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
e920: 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65  a:       A sorte
e930: 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  d, null-terminat
e940: 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  ed linked list. 
e950: 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a   (May be null)..
e960: 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20  **   b:       A 
e970: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
e980: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
e990: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
e9a0: 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20  ll)..**   cmp:  
e9b0: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
e9c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
e9d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66  unction..**   of
e9e0: 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e  fset:  Offset in
e9f0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74   the structure t
ea00: 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  o the "next" fie
ea10: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ld..**.** Return
ea20: 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70   Value:.**   A p
ea30: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
ea40: 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c  ad of a sorted l
ea50: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
ea60: 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20  he elements.**  
ea70: 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62   of both a and b
ea80: 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66  ..**.** Side eff
ea90: 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22  ects:.**   The "
eaa0: 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66  next" pointers f
eab0: 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  or elements in t
eac0: 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62  he lists a and b
ead0: 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65   are.**   change
eae0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
eaf0: 72 20 2a 6d 65 72 67 65 28 0a 20 20 63 68 61 72  r *merge(.  char
eb00: 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62 2c 0a   *a,.  char *b,.
eb10: 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e    int (*cmp)(con
eb20: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
eb30: 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f 66 66  har*),.  int off
eb40: 73 65 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70  set.){.  char *p
eb50: 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66  tr, *head;..  if
eb60: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65  ( a==0 ){.    he
eb70: 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20  ad = b;.  }else 
eb80: 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20  if( b==0 ){.    
eb90: 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73  head = a;.  }els
eba0: 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70  e{.    if( (*cmp
ebb0: 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20  )(a,b)<=0 ){.   
ebc0: 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20     ptr = a;.    
ebd0: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
ebe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebf0: 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62  ptr = b;.      b
ec00: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
ec10: 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74 72  }.    head = ptr
ec20: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20 26  ;.    while( a &
ec30: 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  & b ){.      if(
ec40: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20   (*cmp)(a,b)<=0 
ec50: 29 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28  ){.        NEXT(
ec60: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20  ptr) = a;.      
ec70: 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20    ptr = a;.     
ec80: 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a     a = NEXT(a);.
ec90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eca0: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
ecb0: 20 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   b;.        ptr 
ecc0: 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  = b;.        b =
ecd0: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20   NEXT(b);.      
ece0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ecf0: 61 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20  a ) NEXT(ptr) = 
ed00: 61 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e  a;.    else    N
ed10: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
ed20: 7d 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b  }.  return head;
ed30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73  .}../*.** Inputs
ed40: 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20  :.**   list:    
ed50: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73    Pointer to a s
ed60: 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73  ingly-linked lis
ed70: 74 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e  t of structures.
ed80: 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20  .**   next:     
ed90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   Pointer to poin
eda0: 74 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e  ter to the secon
edb0: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  d element of the
edc0: 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a   list..**   cmp:
edd0: 20 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69         A compari
ede0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
edf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
ee00: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
ee10: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
ee20: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
ee30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
ee40: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e  ments.**   orgin
ee50: 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a  ally in list..**
ee60: 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  .** Side effects
ee70: 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74  :.**   The "next
ee80: 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65  " pointers for e
ee90: 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20  lements in list 
eea0: 61 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  are changed..*/.
eeb0: 23 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45  #define LISTSIZE
eec0: 20 33 30 0a 73 74 61 74 69 63 20 63 68 61 72 20   30.static char 
eed0: 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61 72 20 2a  *msort(.  char *
eee0: 6c 69 73 74 2c 0a 20 20 63 68 61 72 20 2a 2a 6e  list,.  char **n
eef0: 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70  ext,.  int (*cmp
ef00: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
ef10: 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
ef20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 66  unsigned long of
ef30: 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 65 70  fset;.  char *ep
ef40: 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b 4c 49  ;.  char *set[LI
ef50: 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69  STSIZE];.  int i
ef60: 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 75 6e  ;.  offset = (un
ef70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 28 28 63 68  signed long)((ch
ef80: 61 72 2a 29 6e 65 78 74 20 2d 20 28 63 68 61 72  ar*)next - (char
ef90: 2a 29 6c 69 73 74 29 3b 0a 20 20 66 6f 72 28 69  *)list);.  for(i
efa0: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
efb0: 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30 3b  i++) set[i] = 0;
efc0: 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20 29  .  while( list )
efd0: 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74 3b  {.    ep = list;
efe0: 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58 54  .    list = NEXT
eff0: 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58 54  (list);.    NEXT
f000: 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66 6f  (ep) = 0;.    fo
f010: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
f020: 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d 30  E-1 && set[i]!=0
f030: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65 70  ; i++){.      ep
f040: 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b   = merge(ep,set[
f050: 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a  i],cmp,offset);.
f060: 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 30        set[i] = 0
f070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 5b  ;.    }.    set[
f080: 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20 65  i] = ep;.  }.  e
f090: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  p = 0;.  for(i=0
f0a0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b  ; i<LISTSIZE; i+
f0b0: 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29 20  +) if( set[i] ) 
f0c0: 65 70 20 3d 20 6d 65 72 67 65 28 73 65 74 5b 69  ep = merge(set[i
f0d0: 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73 65 74 29  ],ep,cmp,offset)
f0e0: 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a 7d  ;.  return ep;.}
f0f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
f110: 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e  the file "option
f120: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
f140: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 72  static char **ar
f150: 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  gv;.static struc
f160: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b  t s_options *op;
f170: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65 72  .static FILE *er
f180: 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e  rstream;..#defin
f190: 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29 5b  e ISOPT(X) ((X)[
f1a0: 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d  0]=='-'||(X)[0]=
f1b0: 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58 29  ='+'||strchr((X)
f1c0: 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a  ,'=')!=0)../*.**
f1d0: 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61   Print the comma
f1e0: 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20 63  nd line with a c
f1f0: 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  arrot pointing t
f200: 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72 61  o the k-th chara
f210: 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  cter.** of the n
f220: 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  -th field..*/.st
f230: 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69 6e  atic void errlin
f240: 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20 6b 2c 20  e(int n, int k, 
f250: 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69  FILE *err).{.  i
f260: 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 69  nt spcnt, i;.  i
f270: 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70 72  f( argv[0] ) fpr
f280: 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61 72  intf(err,"%s",ar
f290: 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20  gv[0]);.  spcnt 
f2a0: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  = lemonStrlen(ar
f2b0: 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f  gv[0]) + 1;.  fo
f2c0: 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72  r(i=1; i<n && ar
f2d0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
f2e0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25   fprintf(err," %
f2f0: 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  s",argv[i]);.   
f300: 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f 6e 53   spcnt += lemonS
f310: 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31  trlen(argv[i])+1
f320: 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d  ;.  }.  spcnt +=
f330: 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67 76   k;.  for(; argv
f340: 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74  [i]; i++) fprint
f350: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
f360: 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63 6e  [i]);.  if( spcn
f370: 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72 69  t<20 ){.    fpri
f380: 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d  ntf(err,"\n%*s^-
f390: 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c  - here\n",spcnt,
f3a0: 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  "");.  }else{.  
f3b0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c    fprintf(err,"\
f3c0: 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c  n%*shere --^\n",
f3d0: 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d  spcnt-7,"");.  }
f3e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f3f0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
f400: 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63  e N-th non-switc
f410: 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74  h argument.  Ret
f420: 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69  urn -1.** if N i
f430: 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a  s out of range..
f440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
f450: 67 69 6e 64 65 78 28 69 6e 74 20 6e 29 0a 7b 0a  gindex(int n).{.
f460: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64    int i;.  int d
f470: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
f480: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61  f( argv!=0 && *a
f490: 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rgv!=0 ){.    fo
f4a0: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
f4b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f4c0: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
f4d0: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  PT(argv[i]) ){. 
f4e0: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20         if( n==0 
f4f0: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
f500: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
f510: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
f520: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
f530: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
f540: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
f550: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
f560: 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20  tic char emsg[] 
f570: 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  = "Command line 
f580: 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b  syntax error: ";
f590: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
f5a0: 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c  a flag command l
f5b0: 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ine argument..*/
f5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
f5d0: 6c 65 66 6c 61 67 73 28 69 6e 74 20 69 2c 20 46  leflags(int i, F
f5e0: 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e  ILE *err).{.  in
f5f0: 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  t v;.  int errcn
f600: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  t = 0;.  int j;.
f610: 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d    for(j=0; op[j]
f620: 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  .label; j++){.  
f630: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 61    if( strncmp(&a
f640: 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e  rgv[i][1],op[j].
f650: 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72 6c 65  label,lemonStrle
f660: 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d  n(op[j].label))=
f670: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
f680: 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d    v = argv[i][0]
f690: 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20  =='-' ? 1 : 0;. 
f6a0: 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c   if( op[j].label
f6b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
f6c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rr ){.      fpri
f6d0: 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66  ntf(err,"%sundef
f6e0: 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c  ined option.\n",
f6f0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
f700: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
f710: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
f720: 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  +;.  }else if( o
f730: 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20 29 7b 0a 20  p[j].arg==0 ){. 
f740: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69     /* Ignore thi
f750: 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 7d 65  s option */.  }e
f760: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
f770: 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a  pe==OPT_FLAG ){.
f780: 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a      *((int*)op[j
f790: 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65  ].arg) = v;.  }e
f7a0: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
f7b0: 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b  pe==OPT_FFLAG ){
f7c0: 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28  .    (*(void(*)(
f7d0: 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int))(op[j].arg)
f7e0: 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )(v);.  }else if
f7f0: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
f800: 54 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a  T_FSTR ){.    (*
f810: 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29  (void(*)(char *)
f820: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61  )(op[j].arg))(&a
f830: 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65  rgv[i][2]);.  }e
f840: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72  lse{.    if( err
f850: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
f860: 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67  f(err,"%smissing
f870: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69   argument on swi
f880: 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  tch.\n",emsg);. 
f890: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
f8a0: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
f8b0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
f8c0: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
f8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
f8e0: 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
f8f0: 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73  switch which has
f900: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
f910: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
f920: 6c 65 73 77 69 74 63 68 28 69 6e 74 20 69 2c 20  leswitch(int i, 
f930: 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69  FILE *err).{.  i
f940: 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75  nt lv = 0;.  dou
f950: 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20  ble dv = 0.0;.  
f960: 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65  char *sv = 0, *e
f970: 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  nd;.  char *cp;.
f980: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65    int j;.  int e
f990: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20  rrcnt = 0;.  cp 
f9a0: 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d  = strchr(argv[i]
f9b0: 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28  ,'=');.  assert(
f9c0: 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20   cp!=0 );.  *cp 
f9d0: 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  = 0;.  for(j=0; 
f9e0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
f9f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
fa00: 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e  p(argv[i],op[j].
fa10: 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61  label)==0 ) brea
fa20: 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27  k;.  }.  *cp = '
fa30: 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e  =';.  if( op[j].
fa40: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
fa50: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
fa60: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
fa70: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
fa80: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
fa90: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
faa0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
fab0: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  rcnt++;.  }else{
fac0: 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73  .    cp++;.    s
fad0: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
fae0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
faf0: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
fb00: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
fb10: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
fb20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
fb30: 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69  intf(err,"%sopti
fb40: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
fb50: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
fb60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72  );.          err
fb70: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
fb80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fb90: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
fba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fbb0: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
fbc0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
fbd0: 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20  L:.        dv = 
fbe0: 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b  strtod(cp,&end);
fbf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
fc00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
fc10: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
fc20: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
fc30: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
fc40: 20 20 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61    "%sillegal cha
fc50: 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69  racter in floati
fc60: 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e  ng-point argumen
fc70: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
fc80: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
fc90: 28 69 2c 28 69 6e 74 29 28 28 63 68 61 72 2a 29  (i,(int)((char*)
fca0: 65 6e 64 2d 28 63 68 61 72 2a 29 61 72 67 76 5b  end-(char*)argv[
fcb0: 69 5d 29 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  i]),err);.      
fcc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fcd0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
fce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
fcf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
fd00: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
fd10: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
fd20: 20 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28      lv = strtol(
fd30: 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20  cp,&end,0);.    
fd40: 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a      if( *end ){.
fd50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
fd60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
fd70: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
fd80: 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  illegal characte
fd90: 72 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67  r in integer arg
fda0: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
fdc0: 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63 68  line(i,(int)((ch
fdd0: 61 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29 61  ar*)end-(char*)a
fde0: 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20 20  rgv[i]),err);.  
fdf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fe00: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fe10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
fe30: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
fe40: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
fe50: 20 20 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b          sv = cp;
fe60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fe70: 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
fe80: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a  ( op[j].type ){.
fe90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fea0: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
feb0: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
fec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fed0: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
fee0: 20 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29        *(double*)
fef0: 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76  (op[j].arg) = dv
ff00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ff10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ff20: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a  FDBL:.        (*
ff30: 28 76 6f 69 64 28 2a 29 28 64 6f 75 62 6c 65 29  (void(*)(double)
ff40: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76  )(op[j].arg))(dv
ff50: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
ff60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
ff70: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28  _INT:.        *(
ff80: 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int*)(op[j].arg)
ff90: 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62   = lv;.        b
ffa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ffb0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
ffc0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e     (*(void(*)(in
ffd0: 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  t))(op[j].arg))(
ffe0: 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20  (int)lv);.      
fff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10000 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
10010 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f       *(char**)(o
10020 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a  p[j].arg) = sv;.
10030 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10040 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
10050 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  TR:.        (*(v
10060 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28  oid(*)(char *))(
10070 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b  op[j].arg))(sv);
10080 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
100a0 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e  rn errcnt;.}..in
100b0 74 20 4f 70 74 49 6e 69 74 28 63 68 61 72 20 2a  t OptInit(char *
100c0 2a 61 2c 20 73 74 72 75 63 74 20 73 5f 6f 70 74  *a, struct s_opt
100d0 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45 20 2a 65  ions *o, FILE *e
100e0 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63  rr).{.  int errc
100f0 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d  nt = 0;.  argv =
10100 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20   a;.  op = o;.  
10110 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b  errstream = err;
10120 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a  .  if( argv && *
10130 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20  argv && op ){.  
10140 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10150 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
10160 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
10170 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c  rgv[i][0]=='+' |
10180 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d  | argv[i][0]=='-
10190 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ' ){.        err
101a0 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61  cnt += handlefla
101b0 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20  gs(i,err);.     
101c0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68   }else if( strch
101d0 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29  r(argv[i],'=') )
101e0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  {.        errcnt
101f0 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68   += handleswitch
10200 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d  (i,err);.      }
10210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10220 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20   errcnt>0 ){.   
10230 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61   fprintf(err,"Va
10240 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  lid command line
10250 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25   options for \"%
10260 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b  s\" are:\n",*a);
10270 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b  .    OptPrint();
10280 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
10290 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
102a0 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 76 6f  .int OptNArgs(vo
102b0 69 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  id){.  int cnt =
102c0 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
102d0 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
102e0 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
102f0 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
10300 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
10310 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
10320 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
10330 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
10340 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
10350 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
10360 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
10370 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
10380 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10390 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
103a0 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  tArg(int n).{.  
103b0 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
103c0 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
103d0 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
103e0 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
103f0 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20  ptErr(int n).{. 
10400 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
10410 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28  gindex(n);.  if(
10420 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28   i>=0 ) errline(
10430 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a  i,0,errstream);.
10440 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74  }..void OptPrint
10450 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
10460 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b  .  int max, len;
10470 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f  .  max = 0;.  fo
10480 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
10490 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  el; i++){.    le
104a0 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
104b0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31  op[i].label) + 1
104c0 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
104d0 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
104e0 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
104f0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10500 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
10510 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
10520 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
10530 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
10540 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b         len += 9;
10550 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
10560 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20   of "<integer>" 
10570 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
10580 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10590 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
105a0 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
105b0 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20     len += 6;    
105c0 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
105d0 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20  "<real>" */.    
105e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
105f0 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
10600 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
10610 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  TR:.        len 
10620 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 8;       /* l
10630 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e  ength of "<strin
10640 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  g>" */.        b
10650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10660 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61  if( len>max ) ma
10670 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66  x = len;.  }.  f
10680 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
10690 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bel; i++){.    s
106a0 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
106b0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
106c0 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
106d0 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
106e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
106f0 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d  errstream,"  -%-
10700 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70  *s  %s\n",max,op
10710 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e  [i].label,op[i].
10720 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10740 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
10750 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
10760 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
10770 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
10780 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20  %s<integer>%*s  
10790 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
107a0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
107b0 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
107c0 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
107d0 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  9),"",op[i].mess
107e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
107f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10800 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
10810 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
10820 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
10830 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72  rstream,"  -%s<r
10840 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  eal>%*s  %s\n",o
10850 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10860 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10870 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10880 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
10890 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
108a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
108b0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
108c0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
108d0 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
108e0 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
108f0 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25  ,"  -%s<string>%
10900 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
10910 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
10920 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
10930 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
10940 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-8),"",op[i].
10950 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10960 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10970 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
10990 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72  om the file "par
109a0 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se.c" **********
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  **/./*.** Input 
109d0 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20  file parser for 
109e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
109f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
10a00 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
10a10 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e  the parser */.en
10a20 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49  um e_state {.  I
10a30 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49  NITIALIZE,.  WAI
10a40 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10a50 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47  _RULE,.  WAITING
10a60 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10a70 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
10a80 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49  _DECL_ARG,.  WAI
10a90 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
10aa0 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  NCE_SYMBOL,.  WA
10ab0 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c  ITING_FOR_ARROW,
10ac0 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53  .  IN_RHS,.  LHS
10ad0 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f  _ALIAS_1,.  LHS_
10ae0 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41  ALIAS_2,.  LHS_A
10af0 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_3,.  RHS_AL
10b00 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49  IAS_1,.  RHS_ALI
10b10 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e  AS_2,.  PRECEDEN
10b20 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45  CE_MARK_1,.  PRE
10b30 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a  CEDENCE_MARK_2,.
10b40 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52    RESYNC_AFTER_R
10b50 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53  ULE_ERROR,.  RES
10b60 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
10b70 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f  RROR,.  WAITING_
10b80 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
10b90 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
10ba0 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
10bb0 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
10bc0 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c  FOR_FALLBACK_ID,
10bd0 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  .  WAITING_FOR_W
10be0 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57 41  ILDCARD_ID,.  WA
10bf0 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
10c00 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
10c10 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 2c 0a 20  R_CLASS_TOKEN,. 
10c20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b   WAITING_FOR_TOK
10c30 45 4e 5f 4e 41 4d 45 0a 7d 3b 0a 73 74 72 75 63  EN_NAME.};.struc
10c40 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61  t pstate {.  cha
10c50 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20  r *filename;    
10c60 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10c70 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
10c80 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e    int tokenlinen
10c90 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e  o;      /* Linen
10ca0 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
10cb0 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61  urrent token sta
10cc0 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  rts */.  int err
10cd0 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  orcnt;         /
10ce0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
10cf0 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  rs so far */.  c
10d00 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b  har *tokenstart;
10d10 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
10d20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  current token */
10d30 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
10d40 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62  *gp;     /* Glob
10d50 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
10d60 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74  */.  enum e_stat
10d70 65 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  e state;        
10d80 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
10d90 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
10da0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66  struct symbol *f
10db0 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68  allback;   /* Th
10dc0 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  e fallback token
10dd0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10de0 62 6f 6c 20 2a 74 6b 63 6c 61 73 73 3b 20 20 20  bol *tkclass;   
10df0 20 2f 2a 20 54 6f 6b 65 6e 20 63 6c 61 73 73 20   /* Token class 
10e00 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
10e10 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20  ct symbol *lhs; 
10e20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
10e30 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72  and side of curr
10e40 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f  ent rule */.  co
10e50 6e 73 74 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  nst char *lhsali
10e60 61 73 3b 20 20 20 20 20 20 2f 2a 20 41 6c 69 61  as;      /* Alia
10e70 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f  s for the LHS */
10e80 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ea0 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74   Number of right
10eb0 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f  -hand side symbo
10ec0 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72  ls seen */.  str
10ed0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b  uct symbol *rhs[
10ee0 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53  MAXRHS];  /* RHS
10ef0 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f   symbols */.  co
10f00 6e 73 74 20 63 68 61 72 20 2a 61 6c 69 61 73 5b  nst char *alias[
10f10 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41 6c 69 61  MAXRHS]; /* Alia
10f20 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53  ses for each RHS
10f30 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c   symbol (or NULL
10f40 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  ) */.  struct ru
10f50 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20  le *prevrule;   
10f60 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75    /* Previous ru
10f70 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63  le parsed */.  c
10f80 6f 6e 73 74 20 63 68 61 72 20 2a 64 65 63 6c 6b  onst char *declk
10f90 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20 4b 65 79  eyword;   /* Key
10fa0 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72  word of a declar
10fb0 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
10fc0 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20  **declargslot;  
10fd0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
10fe0 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  he declaration a
10ff0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
11000 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  e put */.  int i
11010 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20  nsertLineMacro; 
11020 20 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69        /* Add #li
11030 6e 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72  ne before declar
11040 61 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ation insert */.
11050 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e    int *decllinen
11060 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20  oslot;       /* 
11070 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 64  Where to write d
11080 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20  eclaration line 
11090 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d  number */.  enum
110a0 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73   e_assoc declass
110b0 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  oc;    /* Assign
110c0 20 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f   this associatio
110d0 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65  n to decl argume
110e0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  nts */.  int pre
110f0 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  ccounter;       
11100 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68      /* Assign th
11110 69 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f  is precedence to
11120 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20   decl arguments 
11130 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
11140 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20   *firstrule;    
11150 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
11160 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  rst rule in the 
11170 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72  grammar */.  str
11180 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75  uct rule *lastru
11190 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  le;     /* Point
111a0 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  er to the most r
111b0 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72  ecently parsed r
111c0 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61  ule */.};../* Pa
111d0 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b  rse a single tok
111e0 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  en */.static voi
111f0 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28  d parseonetoken(
11200 73 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70  struct pstate *p
11210 73 70 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sp).{.  const ch
11220 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72  ar *x;.  x = Str
11230 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73  safe(psp->tokens
11240 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61  tart);     /* Sa
11250 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72  ve the token per
11260 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20  manently */.#if 
11270 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25  0.  printf("%s:%
11280 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74  d: Token=[%s] st
11290 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66  ate=%d\n",psp->f
112a0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
112b0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c  enlineno,.    x,
112c0 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e  psp->state);.#en
112d0 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73  dif.  switch( ps
112e0 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  p->state ){.    
112f0 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a  case INITIALIZE:
11300 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76  .      psp->prev
11310 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
11320 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11330 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
11340 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70  >firstrule = psp
11350 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a  ->lastrule = 0;.
11360 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e        psp->gp->n
11370 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
11380 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
11390 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
113a0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
113b0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a  R_DECL_OR_RULE:.
113c0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
113d0 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '%' ){.        p
113e0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
113f0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
11400 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  WORD;.      }els
11410 65 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b  e if( ISLOWER(x[
11420 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
11430 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c  sp->lhs = Symbol
11440 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
11450 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a   psp->nrhs = 0;.
11460 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
11470 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  alias = 0;.     
11480 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11490 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
114a0 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  W;.      }else i
114b0 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a  f( x[0]=='{' ){.
114c0 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
114d0 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
114e0 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
114f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11500 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11510 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 20  o,."There is no 
11520 70 72 69 6f 72 20 72 75 6c 65 20 75 70 6f 6e 20  prior rule upon 
11530 77 68 69 63 68 20 74 6f 20 61 74 74 61 63 68 20  which to attach 
11540 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d  the code \.fragm
11550 65 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e 73  ent which begins
11560 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29   on this line.")
11570 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11580 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
115a0 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f  sp->prevrule->co
115b0 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de!=0 ){.       
115c0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
115d0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
115e0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64  okenlineno,."Cod
115f0 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e  e fragment begin
11600 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ning on this lin
11610 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
11620 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
11630 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
11640 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
11650 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11670 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
11680 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70  evrule->line = p
11690 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
116a0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
116b0 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d  prevrule->code =
116c0 20 26 78 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20   &x[1];.        
116d0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
116e0 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  >noCode = 0;.   
116f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11700 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27  se if( x[0]=='['
11710 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11720 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45  >state = PRECEDE
11730 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20  NCE_MARK_1;.    
11740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11750 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11760 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11770 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11780 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c      "Token \"%s\
11790 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68  " should be eith
117a0 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e  er \"%%\" or a n
117b0 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e  onterminal name.
117c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b  ",.          x);
117d0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
117e0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
117f0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11800 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
11810 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20  CE_MARK_1:.     
11820 20 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b   if( !ISUPPER(x[
11830 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
11840 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11850 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11860 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11870 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e 63    "The precedenc
11880 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65  e symbol must be
11890 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a   a terminal.");.
118a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
118b0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
118c0 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
118d0 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  evrule==0 ){.   
118e0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
118f0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11900 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11910 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20 69          "There i
11920 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
11930 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65 64  to assign preced
11940 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c  ence \"[%s]\".",
11950 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11960 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11970 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70     }else if( psp
11980 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
11990 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sym!=0 ){.      
119a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
119b0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
119c0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63  kenlineno,."Prec
119d0 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74  edence mark on t
119e0 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
119f0 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
11a00 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
11a10 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
11a20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11a30 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
11a40 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70  {.        psp->p
11a50 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d  revrule->precsym
11a60 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
11a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a80 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45  psp->state = PRE
11a90 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a  CEDENCE_MARK_2;.
11aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ab0 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
11ac0 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69  _MARK_2:.      i
11ad0 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a  f( x[0]!=']' ){.
11ae0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11af0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11b00 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11b10 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
11b20 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65  ing \"]\" on pre
11b30 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b  cedence mark.");
11b40 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11b50 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11b60 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
11b70 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11b80 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
11b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ba0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11bb0 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66  _ARROW:.      if
11bc0 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78  ( x[0]==':' && x
11bd0 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d  [1]==':' && x[2]
11be0 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='=' ){.       
11bf0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
11c00 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
11c10 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
11c20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11c30 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
11c40 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
11c50 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11c60 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11c70 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11c80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45 78  o,.          "Ex
11c90 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61 20  pected to see a 
11ca0 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20  \":\" following 
11cb0 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c  the LHS symbol \
11cc0 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
11cd0 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d     psp->lhs->nam
11ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
11cf0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11d00 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11d10 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
11d20 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
11d30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11d40 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
11d50 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
11d60 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b  ISALPHA(x[0]) ){
11d70 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
11d80 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20  salias = x;.    
11d90 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11da0 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   LHS_ALIAS_2;.  
11db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11dc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11dd0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11de0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11df0 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
11e00 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
11e10 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c  as for the LHS \
11e20 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
11e30 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e      x,psp->lhs->
11e40 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
11e50 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11e60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11e70 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11e80 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
11e90 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11ea0 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
11eb0 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69  ALIAS_2:.      i
11ec0 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a  f( x[0]==')' ){.
11ed0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11ee0 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33  te = LHS_ALIAS_3
11ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11f00 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11f10 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11f20 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11f30 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
11f40 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
11f50 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
11f60 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
11f70 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
11f80 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11f90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
11fa0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
11fb0 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
11fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11fd0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11fe0 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20  LHS_ALIAS_3:.   
11ff0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
12000 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
12010 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
12020 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12030 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
12040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12050 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12060 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12070 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12080 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e     "Missing \"->
12090 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22  \" following: \"
120a0 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20  %s(%s)\".",.    
120b0 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d         psp->lhs-
120c0 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c  >name,psp->lhsal
120d0 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
120e0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
120f0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12100 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12110 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
12120 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12130 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48  ;.    case IN_RH
12140 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  S:.      if( x[0
12150 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12160 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
12170 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20  p;.        rp = 
12180 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63  (struct rule *)c
12190 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
121a0 72 75 63 74 20 72 75 6c 65 29 20 2b 0a 20 20 20  ruct rule) +.   
121b0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
121c0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
121d0 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a  *psp->nrhs + siz
121e0 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e  eof(char*)*psp->
121f0 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20  nrhs, 1);.      
12200 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20    if( rp==0 ){. 
12210 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
12220 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12230 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
12250 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e  an't allocate en
12260 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20  ough memory for 
12270 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  this rule.");.  
12280 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12290 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
122a0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
122b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
122c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
122d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
122e0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70  rp->ruleline = p
122f0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
12300 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
12310 68 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  hs = (struct sym
12320 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20  bol**)&rp[1];.  
12330 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
12340 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  lias = (const ch
12350 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70  ar**)&(rp->rhs[p
12360 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20  sp->nrhs]);.    
12370 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12380 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <psp->nrhs; i++)
12390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  {.            rp
123a0 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e  ->rhs[i] = psp->
123b0 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
123c0 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
123d0 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73  [i] = psp->alias
123e0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [i];.          }
123f0 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
12400 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20  hs = psp->lhs;. 
12410 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
12420 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73  alias = psp->lhs
12430 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  alias;.         
12440 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d   rp->nrhs = psp-
12450 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20  >nrhs;.         
12460 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20   rp->code = 0;. 
12470 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 6f 43           rp->noC
12480 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
12490 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d     rp->precsym =
124a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   0;.          rp
124b0 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67  ->index = psp->g
124c0 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20  p->nrule++;.    
124d0 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68        rp->nextlh
124e0 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c  s = rp->lhs->rul
124f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  e;.          rp-
12500 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b  >lhs->rule = rp;
12510 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
12520 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
12530 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73     if( psp->firs
12540 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  trule==0 ){.    
12550 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72          psp->fir
12560 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61  strule = psp->la
12570 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
12580 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12590 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
125a0 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20  astrule->next = 
125b0 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp;.            
125c0 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
125d0 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rp;.          }.
125e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
125f0 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  revrule = rp;.  
12600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12610 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12620 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12630 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
12640 73 65 20 69 66 28 20 49 53 41 4c 50 48 41 28 78  se if( ISALPHA(x
12650 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
12660 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
12670 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
12680 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12690 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
126a0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
126b0 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
126c0 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53  y symbols on RHS
126d0 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   of rule beginni
126e0 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
126f0 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
12700 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
12710 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
12720 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12730 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
12740 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
12750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12760 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70      psp->rhs[psp
12770 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c  ->nrhs] = Symbol
12780 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
12790 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73     psp->alias[ps
127a0 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20  p->nrhs] = 0;.  
127b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
127c0 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  s++;.        }. 
127d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
127e0 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30  x[0]=='|' || x[0
127f0 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e  ]=='/') && psp->
12800 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
12810 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12820 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b  *msp = psp->rhs[
12830 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20  psp->nrhs-1];.  
12840 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74        if( msp->t
12850 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
12860 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
12870 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f  struct symbol *o
12880 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20  rigsp = msp;.   
12890 20 20 20 20 20 20 20 6d 73 70 20 3d 20 28 73 74         msp = (st
128a0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 20 63  ruct symbol *) c
128b0 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a  alloc(1,sizeof(*
128c0 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
128d0 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
128e0 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
128f0 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
12900 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
12910 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
12920 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
12930 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
12940 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
12950 73 79 6d 62 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f  symbol **) callo
12960 63 28 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63  c(1,sizeof(struc
12970 74 20 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20  t symbol*));.   
12980 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73         msp->subs
12990 79 6d 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a  ym[0] = origsp;.
129a0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e            msp->n
129b0 61 6d 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61  ame = origsp->na
129c0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  me;.          ps
129d0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
129e0 2d 31 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20  -1] = msp;.     
129f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70     }.        msp
12a00 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20  ->nsubsym++;.   
12a10 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
12a20 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
12a30 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d 73  l **) realloc(ms
12a40 70 2d 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20 20  p->subsym,.     
12a50 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75       sizeof(stru
12a60 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d  ct symbol*)*msp-
12a70 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20  >nsubsym);.     
12a80 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
12a90 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
12aa0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31   Symbol_new(&x[1
12ab0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
12ac0 49 53 4c 4f 57 45 52 28 78 5b 31 5d 29 20 7c 7c  ISLOWER(x[1]) ||
12ad0 20 49 53 4c 4f 57 45 52 28 6d 73 70 2d 3e 73 75   ISLOWER(msp->su
12ae0 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d  bsym[0]->name[0]
12af0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
12b00 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12b10 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12b20 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12b30 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d      "Cannot form
12b40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74   a compound cont
12b50 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72  aining a non-ter
12b60 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20  minal");.       
12b70 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12b80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
12b90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
12ba0 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
12bb0 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
12bc0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12bd0 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
12be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12bf0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12c00 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12c10 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12c20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
12c30 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
12c40 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
12c50 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
12c60 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12c70 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12c80 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
12c90 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
12ca0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12cb0 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
12cc0 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
12cd0 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b  ISALPHA(x[0]) ){
12ce0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
12cf0 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
12d00 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
12d10 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
12d20 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
12d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
12d40 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
12d50 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
12d60 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12d70 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
12d80 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
12d90 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
12da0 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
12db0 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
12dc0 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
12dd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
12de0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12df0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12e00 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
12e10 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
12e20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12e30 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
12e40 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
12e50 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
12e60 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12e70 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
12e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12e90 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12ea0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12eb0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12ec0 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
12ed0 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
12ee0 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
12ef0 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
12f00 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
12f10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12f20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12f30 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
12f40 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
12f50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12f60 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
12f70 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
12f80 44 3a 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  D:.      if( ISA
12f90 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LPHA(x[0]) ){.  
12fa0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
12fb0 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
12fc0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12fd0 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
12fe0 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
12ff0 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  oslot = 0;.     
13000 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
13010 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
13020 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13030 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
13040 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
13050 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
13060 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
13070 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13080 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
13090 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
130a0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
130b0 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
130c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
130d0 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64  strcmp(x,"includ
130e0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
130f0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13100 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13110 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20  ->include);.    
13120 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13130 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d  rcmp(x,"code")==
13140 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13150 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13160 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74  = &(psp->gp->ext
13170 72 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  racode);.       
13180 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13190 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72  p(x,"token_destr
131a0 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
131b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
131c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
131d0 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a  >gp->tokendest;.
131e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
131f0 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
13200 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ult_destructor")
13210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13220 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13230 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61  t = &psp->gp->va
13240 72 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  rdest;.        }
13250 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13260 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22  x,"token_prefix"
13270 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13280 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13290 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
132a0 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20  okenprefix;.    
132b0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
132c0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
132d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
132e0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74  ( strcmp(x,"synt
132f0 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b  ax_error")==0 ){
13300 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13310 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
13320 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b  psp->gp->error);
13330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13340 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72  f( strcmp(x,"par
13350 73 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29  se_accept")==0 )
13360 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13370 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
13380 28 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74  (psp->gp->accept
13390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
133a0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70   if( strcmp(x,"p
133b0 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d  arse_failure")==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
133d0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
133e0 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69  = &(psp->gp->fai
133f0 6c 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  lure);.        }
13400 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13410 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f  x,"stack_overflo
13420 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  w")==0 ){.      
13430 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13440 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13450 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  ->overflow);.   
13460 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13470 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61  trcmp(x,"extra_a
13480 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a  rgument")==0 ){.
13490 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
134a0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
134b0 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20  sp->gp->arg);.  
134c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
134d0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
134e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
134f0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
13500 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ken_type")==0 ){
13510 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13520 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
13530 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79  psp->gp->tokenty
13540 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
13550 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
13560 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13570 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13580 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70  p(x,"default_typ
13590 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
135a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
135b0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
135c0 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20  ->vartype);.    
135d0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
135e0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
135f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13600 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
13610 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  k_size")==0 ){. 
13620 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
13630 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
13640 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65  p->gp->stacksize
13650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13660 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13670 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13680 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13690 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22  x,"start_symbol"
136a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
136b0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
136c0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
136d0 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  start);.        
136e0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
136f0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
13700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13710 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d  rcmp(x,"left")==
13720 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13730 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
13740 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
13750 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45  ->declassoc = LE
13760 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  FT;.          ps
13770 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13780 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
13790 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
137a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
137b0 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30  mp(x,"right")==0
137c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
137d0 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
137e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
137f0 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47  >declassoc = RIG
13800 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  HT;.          ps
13810 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13820 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
13830 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
13840 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13850 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29  mp(x,"nonassoc")
13860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13870 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
13880 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
13890 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20  sp->declassoc = 
138a0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  NONE;.          
138b0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
138c0 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
138d0 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  NCE_SYMBOL;.    
138e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
138f0 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74  rcmp(x,"destruct
13900 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
13910 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13920 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
13930 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b  STRUCTOR_SYMBOL;
13940 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13950 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70  f( strcmp(x,"typ
13960 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13970 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13980 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
13990 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  ATYPE_SYMBOL;.  
139a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
139b0 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61  strcmp(x,"fallba
139c0 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ck")==0 ){.     
139d0 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61       psp->fallba
139e0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ck = 0;.        
139f0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
13a00 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
13a10 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ACK_ID;.        
13a20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13a30 28 78 2c 22 74 6f 6b 65 6e 22 29 3d 3d 30 20 29  (x,"token")==0 )
13a40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13a50 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13a60 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45 3b  _FOR_TOKEN_NAME;
13a70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13a80 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
13a90 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
13aa0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13ab0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13ac0 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
13ad0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13ae0 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
13af0 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20  class")==0 ){.  
13b00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13b10 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13b20 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20  _CLASS_ID;.     
13b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b40 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13b50 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
13b60 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
13b70 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77           "Unknow
13b80 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  n declaration ke
13b90 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e  yword: \"%%%s\".
13ba0 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",x);.          
13bb0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13bc0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13bd0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13be0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
13bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13c10 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
13c20 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
13c30 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13c40 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c     "Illegal decl
13c50 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a  aration keyword:
13c60 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
13c70 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13c80 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
13c90 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
13ca0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
13cb0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
13cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
13cd0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
13ce0 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c  ESTRUCTOR_SYMBOL
13cf0 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 41  :.      if( !ISA
13d00 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LPHA(x[0]) ){.  
13d10 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13d20 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13d30 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13d40 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
13d50 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66   name missing af
13d60 74 65 72 20 25 25 64 65 73 74 72 75 63 74 6f 72  ter %%destructor
13d70 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
13d80 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
13d90 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
13da0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
13db0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
13dc0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
13dd0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
13de0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
13df0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
13e00 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
13e10 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
13e20 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  uctor;.        p
13e30 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
13e40 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69  ot = &sp->destLi
13e50 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73  neno;.        ps
13e60 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
13e70 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
13e80 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
13e90 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
13ea0 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
13eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13ec0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
13ed0 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  ATYPE_SYMBOL:.  
13ee0 20 20 20 20 69 66 28 20 21 49 53 41 4c 50 48 41      if( !ISALPHA
13ef0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
13f00 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13f10 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
13f20 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13f30 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
13f40 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
13f50 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29  %%type keyword")
13f60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
13f70 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13f80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13f90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
13fa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
13fc0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
13fd0 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  = Symbol_find(x)
13fe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28 73 70  ;.        if((sp
13ff0 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79  ) && (sp->dataty
14000 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pe)){.          
14010 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14020 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14030 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14040 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74       "Symbol %%t
14050 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ype \"%s\" alrea
14060 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b  dy defined", x);
14070 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14080 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14090 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
140a0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
140b0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
140c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
140d0 20 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20       if (!sp){. 
140e0 20 20 20 20 20 20 20 20 20 20 20 73 70 20 3d 20             sp = 
140f0 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
14100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14110 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
14120 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74  gslot = &sp->dat
14130 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  atype;.         
14140 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
14150 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
14160 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14170 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
14180 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
14190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
141a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
141b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
141c0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
141d0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
141e0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
141f0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14200 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
14210 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
14220 20 69 66 28 20 49 53 55 50 50 45 52 28 78 5b 30   if( ISUPPER(x[0
14230 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
14240 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
14250 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
14260 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
14270 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
14280 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
14290 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
142a0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
142b0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
142c0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
142d0 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
142e0 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
142f0 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
14300 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
14310 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
14320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14330 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70    sp->prec = psp
14340 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20  ->preccounter;. 
14350 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73           sp->ass
14360 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73  oc = psp->declas
14370 73 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  soc;.        }. 
14380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14390 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
143a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
143b0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
143c0 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73         "Can't as
143d0 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63  sign a precedenc
143e0 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29  e to \"%s\".",x)
143f0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
14400 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14410 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14420 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
14430 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20  _FOR_DECL_ARG:. 
14440 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
14450 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27  {' || x[0]=='\"'
14460 20 7c 7c 20 49 53 41 4c 4e 55 4d 28 78 5b 30 5d   || ISALNUM(x[0]
14470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
14480 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a  st char *zOld, *
14490 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68  zNew;.        ch
144a0 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20  ar *zBuf, *z;.  
144b0 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20        int nOld, 
144c0 6e 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e  n, nLine = 0, nN
144d0 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20  ew, nBack;.     
144e0 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61     int addLineMa
144f0 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61  cro;.        cha
14500 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20  r zLine[50];.   
14510 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20       zNew = x;. 
14520 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b         if( zNew[
14530 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b  0]=='"' || zNew[
14540 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b  0]=='{' ) zNew++
14550 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d  ;.        nNew =
14560 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65   lemonStrlen(zNe
14570 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
14580 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
14590 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
145a0 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c  Old = *psp->decl
145b0 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20  argslot;.       
145c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
145d0 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20    zOld = "";.   
145e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
145f0 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  Old = lemonStrle
14600 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  n(zOld);.       
14610 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77   n = nOld + nNew
14620 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61   + 20;.        a
14630 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70  ddLineMacro = !p
14640 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  sp->gp->nolineno
14650 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e  sflag && psp->in
14660 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26  sertLineMacro &&
14670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14680 20 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64           (psp->d
14690 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30  ecllinenoslot==0
146a0 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e   || psp->decllin
146b0 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a  enoslot[0]!=0);.
146c0 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c          if( addL
146d0 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20  ineMacro ){.    
146e0 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d        for(z=psp-
146f0 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b  >filename, nBack
14700 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  =0; *z; z++){.  
14710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
14720 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b  =='\\' ) nBack++
14730 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14740 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70          lemon_sp
14750 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c  rintf(zLine, "#l
14760 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74  ine %d ", psp->t
14770 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  okenlineno);.   
14780 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c         nLine = l
14790 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65  emonStrlen(zLine
147a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b  );.          n +
147b0 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53  = nLine + lemonS
147c0 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e  trlen(psp->filen
147d0 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20  ame) + nBack;.  
147e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
147f0 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
14800 74 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61  t = (char *) rea
14810 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61  lloc(*psp->decla
14820 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20  rgslot, n);.    
14830 20 20 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d      zBuf = *psp-
14840 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e  >declargslot + n
14850 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
14860 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
14870 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
14880 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
14890 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
148a0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
148b0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
148c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
148d0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
148e0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
148f0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
14900 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
14910 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
14920 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
14930 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
14940 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
14950 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
14960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14970 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
14980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
14990 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
149a0 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
149b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
149c0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
149d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
149e0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
149f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a00 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
14a10 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
14a20 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
14a30 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
14a40 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
14a50 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
14a60 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
14a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14a80 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
14a90 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
14aa0 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
14ab0 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
14ac0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
14ad0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14ae0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
14af0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14b00 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
14b10 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
14b20 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
14b30 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
14b40 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
14b50 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
14b60 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
14b70 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
14b80 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
14b90 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
14ba0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
14bb0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
14bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14bd0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
14be0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
14bf0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
14c00 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
14c10 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14c20 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
14c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14c40 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
14c50 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
14c60 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
14c70 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
14c80 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14c90 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
14ca0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
14cb0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
14cc0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14cd0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
14ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14cf0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
14d00 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
14d10 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
14d20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
14d30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
14d40 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
14d50 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14d60 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
14d70 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
14d80 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
14d90 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
14da0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14db0 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
14dc0 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
14dd0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
14de0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
14df0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14e00 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
14e10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
14e20 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
14e30 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
14e40 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
14e50 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
14e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14e70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14e80 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
14e90 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45 3a 0a 20  OR_TOKEN_NAME:. 
14ea0 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 73 20 64       /* Tokens d
14eb0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65  o not have to be
14ec0 20 64 65 63 6c 61 72 65 64 20 62 65 66 6f 72 65   declared before
14ed0 20 75 73 65 2e 20 20 42 75 74 20 74 68 65 79 20   use.  But they 
14ee0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
14ef0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
14f00 72 6f 6c 20 74 68 65 69 72 20 61 73 73 69 67 6e  rol their assign
14f10 65 64 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  ed integer numbe
14f20 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 66  r.  The number f
14f30 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 61 63 68  or.      ** each
14f40 20 74 6f 6b 65 6e 20 69 73 20 61 73 73 69 67 6e   token is assign
14f50 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  ed when it is fi
14f60 72 73 74 20 73 65 65 6e 2e 20 20 53 6f 20 62 79  rst seen.  So by
14f70 20 69 6e 63 6c 75 64 69 6e 67 0a 20 20 20 20 20   including.     
14f80 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
14f90 20 25 74 6f 6b 65 6e 20 4f 4e 45 20 54 57 4f 20   %token ONE TWO 
14fa0 54 48 52 45 45 0a 20 20 20 20 20 20 2a 2a 0a 20  THREE.      **. 
14fb0 20 20 20 20 20 2a 2a 20 65 61 72 6c 79 20 69 6e       ** early in
14fc0 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c   the grammar fil
14fd0 65 2c 20 74 68 61 74 20 61 73 73 69 67 6e 73 20  e, that assigns 
14fe0 73 6d 61 6c 6c 20 63 6f 6e 73 65 63 75 74 69 76  small consecutiv
14ff0 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  e values.      *
15000 2a 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  * to each of the
15010 20 74 6f 6b 65 6e 73 20 4f 4e 45 20 54 57 4f 20   tokens ONE TWO 
15020 61 6e 64 20 54 48 52 45 45 2e 0a 20 20 20 20 20  and THREE..     
15030 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 78 5b   */.      if( x[
15040 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
15050 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
15060 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
15070 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
15080 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50 50  }else if( !ISUPP
15090 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ER(x[0]) ){.    
150a0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
150b0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
150c0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
150d0 20 20 20 20 20 20 20 20 22 25 25 74 6f 6b 65 6e          "%%token
150e0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
150f0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
15100 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
15110 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
15120 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15130 20 20 20 20 20 20 20 28 76 6f 69 64 29 53 79 6d         (void)Sym
15140 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
15150 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15160 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
15170 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
15180 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
15190 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
151a0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
151b0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
151c0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
151d0 65 6c 73 65 20 69 66 28 20 21 49 53 55 50 50 45  else if( !ISUPPE
151e0 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  R(x[0]) ){.     
151f0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
15200 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
15210 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
15220 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
15230 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
15240 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
15250 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
15260 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
15270 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
15280 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
15290 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
152a0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
152b0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
152c0 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
152d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
152e0 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
152f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15300 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
15310 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15320 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15330 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
15340 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
15350 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
15360 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
15370 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
153a0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
153b0 4f 52 5f 43 4c 41 53 53 5f 49 44 3a 0a 20 20 20  OR_CLASS_ID:.   
153c0 20 20 20 69 66 28 20 21 49 53 4c 4f 57 45 52 28     if( !ISLOWER(
153d0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
153e0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
153f0 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
15400 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
15410 20 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c       "%%token_cl
15420 61 73 73 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ass must be foll
15430 6f 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74  owed by an ident
15440 69 66 69 65 72 3a 20 22 2c 20 78 29 3b 0a 20 20  ifier: ", x);.  
15450 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
15460 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
15470 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
15480 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
15490 52 4f 52 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20  ROR;.     }else 
154a0 69 66 28 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  if( Symbol_find(
154b0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  x) ){.        Er
154c0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
154d0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
154e0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
154f0 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
15500 20 61 6c 72 65 61 64 79 20 75 73 65 64 22 2c 20   already used", 
15510 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15520 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15530 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
15540 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
15550 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
15560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15570 70 73 70 2d 3e 74 6b 63 6c 61 73 73 20 3d 20 53  psp->tkclass = S
15580 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
15590 20 20 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61        psp->tkcla
155a0 73 73 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49  ss->type = MULTI
155b0 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20  TERMINAL;.      
155c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
155d0 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
155e0 5f 54 4f 4b 45 4e 3b 0a 20 20 20 20 20 20 7d 0a  _TOKEN;.      }.
155f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15600 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
15610 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20  R_CLASS_TOKEN:. 
15620 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
15630 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
15640 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
15650 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
15660 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
15670 20 69 66 28 20 49 53 55 50 50 45 52 28 78 5b 30   if( ISUPPER(x[0
15680 5d 29 20 7c 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c  ]) || ((x[0]=='|
15690 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20  ' || x[0]=='/') 
156a0 26 26 20 49 53 55 50 50 45 52 28 78 5b 31 5d 29  && ISUPPER(x[1])
156b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
156c0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20  uct symbol *msp 
156d0 3d 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a  = psp->tkclass;.
156e0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
156f0 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
15700 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
15710 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
15720 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
15730 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  bsym,.          
15740 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
15750 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62  mbol*)*msp->nsub
15760 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sym);.        if
15770 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
15780 20 29 20 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) x++;.        
15790 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d  msp->subsym[msp-
157a0 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79  >nsubsym-1] = Sy
157b0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
157c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
157d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
157e0 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
157f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
15800 20 20 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63        "%%token_c
15810 6c 61 73 73 20 61 72 67 75 6d 65 6e 74 20 5c 22  lass argument \"
15820 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
15830 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
15840 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
15850 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
15860 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
15870 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
15880 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
15890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
158a0 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  e RESYNC_AFTER_R
158b0 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20  ULE_ERROR:./*   
158c0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
158d0 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
158e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
158f0 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20  _OR_RULE;.**    
15900 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20    break; */.    
15910 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45  case RESYNC_AFTE
15920 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20  R_DECL_ERROR:.  
15930 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
15940 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d  ' ) psp->state =
15950 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
15960 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
15970 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
15980 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
15990 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
159a0 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72  EYWORD;.      br
159b0 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  eak;.  }.}../* R
159c0 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63 65 73  un the preproces
159d0 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70  sor over the inp
159e0 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54  ut file text.  T
159f0 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
15a00 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b  les.** azDefine[
15a10 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66  0] through azDef
15a20 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63  ine[nDefine-1] c
15a30 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
15a40 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64  s of all defined
15a50 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69  .** macros.  Thi
15a60 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
15a70 66 6f 72 20 22 25 69 66 64 65 66 22 20 61 6e 64  for "%ifdef" and
15a80 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22   "%ifndef" and "
15a90 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63  %endif" and.** c
15aa0 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74  omments them out
15ab0 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74 77 65  .  Text in betwe
15ac0 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  en is also comme
15ad0 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70 70 72  nted out as appr
15ae0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
15af0 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65  ic void preproce
15b00 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a  ss_input(char *z
15b10 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
15b20 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75  , n;.  int exclu
15b30 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74  de = 0;.  int st
15b40 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c  art = 0;.  int l
15b50 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74  ineno = 1;.  int
15b60 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
15b70 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  1;.  for(i=0; z[
15b80 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
15b90 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c  ( z[i]=='\n' ) l
15ba0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
15bb0 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69   z[i]!='%' || (i
15bc0 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c  >0 && z[i-1]!='\
15bd0 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n') ) continue;.
15be0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
15bf0 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36  &z[i],"%endif",6
15c00 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45 28  )==0 && ISSPACE(
15c10 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20  z[i+6]) ){.     
15c20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
15c30 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d          exclude-
15c40 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  -;.        if( e
15c50 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20  xclude==0 ){.   
15c60 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61         for(j=sta
15c70 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66  rt; j<i; j++) if
15c80 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a  ( z[j]!='\n' ) z
15c90 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  [j] = ' ';.     
15ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15cb0 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d     for(j=i; z[j]
15cc0 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20   && z[j]!='\n'; 
15cd0 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  j++) z[j] = ' ';
15ce0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
15cf0 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25  strncmp(&z[i],"%
15d00 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20  ifdef",6)==0 && 
15d10 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29 29  ISSPACE(z[i+6]))
15d20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73  .          || (s
15d30 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69  trncmp(&z[i],"%i
15d40 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20  fndef",7)==0 && 
15d50 49 53 53 50 41 43 45 28 7a 5b 69 2b 37 5d 29 29  ISSPACE(z[i+7]))
15d60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15d70 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
15d80 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20   exclude++;.    
15d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15da0 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 49 53 53 50   for(j=i+7; ISSP
15db0 41 43 45 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b  ACE(z[j]); j++){
15dc0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d  }.        for(n=
15dd0 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 49 53  0; z[j+n] && !IS
15de0 53 50 41 43 45 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e  SPACE(z[j+n]); n
15df0 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78  ++){}.        ex
15e00 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  clude = 1;.     
15e10 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44     for(k=0; k<nD
15e20 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20  efine; k++){.   
15e30 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
15e40 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26  mp(azDefine[k],&
15e50 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65  z[j],n)==0 && le
15e60 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69  monStrlen(azDefi
15e70 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20  ne[k])==n ){.   
15e80 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65           exclude
15e90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15eb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15ec0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33         if( z[i+3
15ed0 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65  ]=='n' ) exclude
15ee0 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20   = !exclude;.   
15ef0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
15f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
15f10 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
15f20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20     start_lineno 
15f30 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
15f40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15f50 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
15f60 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
15f70 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
15f80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15f90 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66  exclude ){.    f
15fa0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75  printf(stderr,"u
15fb0 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66  nterminated %%if
15fc0 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  def starting on 
15fd0 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72  line %d\n", star
15fe0 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65  t_lineno);.    e
15ff0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(1);.  }.}../
16000 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74  * In spite of it
16010 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e  s name, this fun
16020 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ction is really 
16030 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72  a scanner.  It r
16040 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e  ead.** in the en
16050 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20  tire input file 
16060 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68  (all at once) th
16070 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e  en tokenizes it.
16080 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20    Each.** token 
16090 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
160a0 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65   function "parse
160b0 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20  onetoken" which 
160c0 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68  builds all.** th
160d0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
160e0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ta structures in
160f0 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74   the global stat
16100 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a  e vector "gp"..*
16110 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72  /.void Parse(str
16120 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b  uct lemon *gp).{
16130 0a 20 20 73 74 72 75 63 74 20 70 73 74 61 74 65  .  struct pstate
16140 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b   ps;.  FILE *fp;
16150 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66  .  char *filebuf
16160 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
16170 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74   filesize;.  int
16180 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63   lineno;.  int c
16190 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e  ;.  char *cp, *n
161a0 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61  extcp;.  int sta
161b0 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d  rtline = 0;..  m
161c0 65 6d 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c  emset(&ps, '\0',
161d0 20 73 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20   sizeof(ps));.  
161e0 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73  ps.gp = gp;.  ps
161f0 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e  .filename = gp->
16200 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65  filename;.  ps.e
16210 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70  rrorcnt = 0;.  p
16220 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41  s.state = INITIA
16230 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  LIZE;..  /* Begi
16240 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  n by reading the
16250 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
16260 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66   fp = fopen(ps.f
16270 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  ilename,"rb");. 
16280 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20   if( fp==0 ){.  
16290 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
162a0 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
162b0 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66  open this file f
162c0 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20  or reading.");. 
162d0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
162e0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
162f0 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c   }.  fseek(fp,0,
16300 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d  2);.  filesize =
16310 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65   ftell(fp);.  re
16320 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65  wind(fp);.  file
16330 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  buf = (char *)ma
16340 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31  lloc( filesize+1
16350 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 73 69   );.  if( filesi
16360 7a 65 3e 31 30 30 30 30 30 30 30 30 20 7c 7c 20  ze>100000000 || 
16370 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20  filebuf==0 ){.  
16380 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
16390 6c 65 6e 61 6d 65 2c 30 2c 22 49 6e 70 75 74 20  lename,0,"Input 
163a0 66 69 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e 22  file too large."
163b0 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
163c0 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73  cnt++;.    fclos
163d0 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72  e(fp);.    retur
163e0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
163f0 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
16400 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
16410 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
16420 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
16430 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
16440 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
16450 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
16460 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
16470 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
16480 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
16490 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65  nt++;.    fclose
164a0 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (fp);.    return
164b0 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
164c0 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
164d0 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
164e0 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69  /* Make an initi
164f0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
16500 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64  the file to hand
16510 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69  le %ifdef and %i
16520 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72  fndef */.  prepr
16530 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65  ocess_input(file
16540 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  buf);..  /* Now 
16550 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
16560 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
16570 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
16580 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
16590 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
165a0 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
165b0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
165d0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
165e0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
165f0 20 20 20 20 69 66 28 20 49 53 53 50 41 43 45 28      if( ISSPACE(
16600 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
16610 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
16620 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
16630 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
16640 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
16650 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
16660 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
16670 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16680 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
16690 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
166a0 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
166b0 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
166c0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
166d0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
166e0 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
166f0 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
16700 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
16710 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
16720 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
16730 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
16740 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
16750 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
16760 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
16770 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
16780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16790 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
167a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
167b0 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
167c0 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
167d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
167e0 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
167f0 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
16800 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
16810 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
16820 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
16830 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
16840 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
16850 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
16880 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
16890 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
168a0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
168b0 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
168c0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
168d0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
168e0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
168f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
16900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
16910 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
16920 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
16930 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
16940 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
16950 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
16960 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
16970 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
16980 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
16990 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
169a0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
169b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
169c0 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
169d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
169e0 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
169f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16a00 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
16a10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
16a20 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
16a30 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
16a40 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
16a50 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
16a60 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
16a70 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
16a80 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
16a90 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
16aa0 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
16ab0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
16ac0 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
16ad0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
16ae0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
16af0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
16b00 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
16b10 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
16b20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
16b30 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
16b40 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
16b50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
16b60 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
16b70 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
16b80 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
16b90 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
16ba0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
16bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
16bc0 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
16bd0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
16be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
16bf0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
16c00 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
16c10 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79   /* Skip C++ sty
16c20 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20  le comments too 
16c30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  */.          cp 
16c40 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
16c50 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
16c60 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e  cp)!=0 && c!='\n
16c70 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ' ) cp++;.      
16c80 20 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65      if( c ) line
16c90 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  no++;.        }e
16ca0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
16cb0 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  || c=='\"' ){   
16cc0 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61   /* String a cha
16cd0 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20  racter literals 
16ce0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
16cf0 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76   startchar, prev
16d00 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  c;.          sta
16d10 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20  rtchar = c;.    
16d20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
16d30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63  .          for(c
16d40 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  p++; (c= *cp)!=0
16d50 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61   && (c!=startcha
16d60 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27  r || prevc=='\\'
16d70 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
16d80 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
16d90 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
16da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
16db0 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76  evc=='\\' ) prev
16dc0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
16dd0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
16de0 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
16df0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16e00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16e10 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
16e20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
16e30 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e  (ps.filename,ps.
16e40 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20  tokenlineno,."C 
16e50 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e  code starting on
16e60 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
16e70 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
16e80 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
16e90 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
16ea0 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
16eb0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
16ec0 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
16ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
16ee0 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
16ef0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
16f00 28 20 49 53 41 4c 4e 55 4d 28 63 29 20 29 7b 20  ( ISALNUM(c) ){ 
16f10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e           /* Iden
16f20 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20  tifiers */.     
16f30 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
16f40 21 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28  !=0 && (ISALNUM(
16f50 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
16f60 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
16f70 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
16f80 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26  se if( c==':' &&
16f90 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63   cp[1]==':' && c
16fa0 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20  p[2]=='=' ){ /* 
16fb0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a  The operator "::
16fc0 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b  =" */.      cp +
16fd0 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  = 3;.      nextc
16fe0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
16ff0 65 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c  e if( (c=='/' ||
17000 20 63 3d 3d 27 7c 27 29 20 26 26 20 49 53 41 4c   c=='|') && ISAL
17010 50 48 41 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20  PHA(cp[1]) ){.  
17020 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20      cp += 2;.   
17030 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a     while( (c = *
17040 63 70 29 21 3d 30 20 26 26 20 28 49 53 41 4c 4e  cp)!=0 && (ISALN
17050 55 4d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29  UM(c) || c=='_')
17060 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e   ) cp++;.      n
17070 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
17080 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e  /* All other (on
170b0 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65  e character) ope
170c0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
170d0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
170e0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20  cp = cp;.    }. 
170f0 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
17100 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *cp = 0;        
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  /* Null terminat
17130 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
17140 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e     parseonetoken
17150 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20  (&ps);          
17160 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
17170 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70  token */.    *cp
17180 20 3d 20 28 63 68 61 72 29 63 3b 20 20 20 20 20   = (char)c;     
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171a0 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66  Restore the buff
171b0 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e  er */.    cp = n
171c0 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65  extcp;.  }.  fre
171d0 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20  e(filebuf);     
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171f0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75  * Release the bu
17200 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69  ffer after parsi
17210 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65  ng */.  gp->rule
17220 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b   = ps.firstrule;
17230 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20  .  gp->errorcnt 
17240 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d  = ps.errorcnt;.}
17250 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
17270 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
17280 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.c" **********
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
172a0 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
172b0 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61  essing configura
172c0 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  tion follow-set 
172d0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
172e0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  s.** in the LEMO
172f0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
17300 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  or..*/.static st
17310 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e  ruct plink *plin
17320 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  k_freelist = 0;.
17330 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
17340 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75  ew plink */.stru
17350 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f  ct plink *Plink_
17360 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 72  new(void){.  str
17370 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69  uct plink *newli
17380 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b  nk;..  if( plink
17390 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a  _freelist==0 ){.
173a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
173b0 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20  nt amt = 100;.  
173c0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
173d0 20 3d 20 28 73 74 72 75 63 74 20 70 6c 69 6e 6b   = (struct plink
173e0 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20   *)calloc( amt, 
173f0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c  sizeof(struct pl
17400 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ink) );.    if( 
17410 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
17420 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
17430 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
17440 20 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f   "Unable to allo
17450 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
17460 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74  a new follow-set
17470 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
17480 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  k.\n");.      ex
17490 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
174a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
174b0 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72  1; i++) plink_fr
174c0 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
174d0 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74   &plink_freelist
174e0 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b  [i+1];.    plink
174f0 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d  _freelist[amt-1]
17500 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
17510 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b   newlink = plink
17520 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69  _freelist;.  pli
17530 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
17540 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65  ink_freelist->ne
17550 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
17560 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  link;.}../* Add 
17570 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69  a plink to a pli
17580 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  nk list */.void 
17590 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74  Plink_add(struct
175a0 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73   plink **plpp, s
175b0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
175c0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p).{.  struct pl
175d0 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20  ink *newlink;.  
175e0 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f  newlink = Plink_
175f0 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b  new();.  newlink
17600 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a  ->next = *plpp;.
17610 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77 6c 69 6e    *plpp = newlin
17620 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66  k;.  newlink->cf
17630 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54  p = cfp;.}../* T
17640 72 61 6e 73 66 65 72 20 65 76 65 72 79 20 70 6c  ransfer every pl
17650 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ink on the list 
17660 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c 69  "from" to the li
17670 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64 20  st "to" */.void 
17680 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75 63  Plink_copy(struc
17690 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74  t plink **to, st
176a0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d  ruct plink *from
176b0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  ).{.  struct pli
176c0 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68  nk *nextpl;.  wh
176d0 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20  ile( from ){.   
176e0 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e   nextpl = from->
176f0 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e  next;.    from->
17700 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20  next = *to;.    
17710 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20  *to = from;.    
17720 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20  from = nextpl;. 
17730 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20   }.}../* Delete 
17740 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74  every plink on t
17750 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  he list */.void 
17760 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 73 74 72  Plink_delete(str
17770 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a  uct plink *plp).
17780 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
17790 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69   *nextpl;..  whi
177a0 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e  le( plp ){.    n
177b0 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78  extpl = plp->nex
177c0 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74  t;.    plp->next
177d0 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
177e0 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  t;.    plink_fre
177f0 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20  elist = plp;.   
17800 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20   plp = nextpl;. 
17810 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
17820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
17830 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
17840 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
17850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17860 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75  */./*.** Procedu
17870 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  res for generati
17880 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74  ng reports and t
17890 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
178a0 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
178b0 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65  tor..*/../* Gene
178c0 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20  rate a filename 
178d0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
178e0 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f  uffix.  Space to
178f0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d   hold the.** nam
17900 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c  e comes from mal
17910 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
17920 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
17930 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
17940 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63  on..*/.PRIVATE c
17950 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61  har *file_makena
17960 6d 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  me(struct lemon 
17970 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20 63 68 61  *lemp, const cha
17980 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a 20 20 63  r *suffix).{.  c
17990 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61  har *name;.  cha
179a0 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d  r *cp;..  name =
179b0 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
179c0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
179d0 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6c 65  ->filename) + le
179e0 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78  monStrlen(suffix
179f0 29 20 2b 20 35 20 29 3b 0a 20 20 69 66 28 20 6e  ) + 5 );.  if( n
17a00 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ame==0 ){.    fp
17a10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
17a20 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  n't allocate spa
17a30 63 65 20 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d  ce for a filenam
17a40 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  e.\n");.    exit
17a50 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e  (1);.  }.  lemon
17a60 5f 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d  _strcpy(name,lem
17a70 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
17a80 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d  cp = strrchr(nam
17a90 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
17aa0 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 6c 65   ) *cp = 0;.  le
17ab0 6d 6f 6e 5f 73 74 72 63 61 74 28 6e 61 6d 65 2c  mon_strcat(name,
17ac0 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72  suffix);.  retur
17ad0 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70  n name;.}../* Op
17ae0 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61  en a file with a
17af0 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74   name based on t
17b00 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
17b10 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75  nput file,.** bu
17b20 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
17b30 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73  nt (specified) s
17b40 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72  uffix, and retur
17b50 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
17b60 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a  o the stream */.
17b70 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69  PRIVATE FILE *fi
17b80 6c 65 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63  le_open(.  struc
17b90 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
17ba0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
17bb0 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  fix,.  const cha
17bc0 72 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c  r *mode.){.  FIL
17bd0 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65  E *fp;..  if( le
17be0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72  mp->outname ) fr
17bf0 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  ee(lemp->outname
17c00 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61  );.  lemp->outna
17c10 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
17c20 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29  me(lemp, suffix)
17c30 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c  ;.  fp = fopen(l
17c40 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64  emp->outname,mod
17c50 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  e);.  if( fp==0 
17c60 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b  && *mode=='w' ){
17c70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
17c80 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
17c90 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
17ca0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
17cb0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
17cc0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
17cd0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
17ce0 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   fp;.}../* Print
17cf0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20 72   the text of a r
17d00 75 6c 65 0a 2a 2f 0a 76 6f 69 64 20 72 75 6c 65  ule.*/.void rule
17d10 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
17d20 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
17d30 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  p){.  int i, j;.
17d40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
17d50 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  %s",rp->lhs->nam
17d60 65 29 3b 0a 20 20 2f 2a 20 20 20 20 69 66 28 20  e);.  /*    if( 
17d70 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 29 20 66  rp->lhsalias ) f
17d80 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 25 73 29  printf(out,"(%s)
17d90 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ",rp->lhsalias);
17da0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
17db0 74 2c 22 20 3a 3a 3d 22 29 3b 0a 20 20 66 6f 72  t," ::=");.  for
17dc0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
17dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
17de0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
17df0 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
17e00 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
17e10 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
17e20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17e30 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ," %s", sp->subs
17e40 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[0]->name);.  
17e50 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73      for(j=1; j<s
17e60 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
17e70 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
17e80 66 28 6f 75 74 2c 22 7c 25 73 22 2c 20 73 70 2d  f(out,"|%s", sp-
17e90 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
17ea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
17ec0 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73  ntf(out," %s", s
17ed0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
17ee0 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72      /* if( rp->r
17ef0 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 66 70 72  hsalias[i] ) fpr
17f00 69 6e 74 66 28 6f 75 74 2c 22 28 25 73 29 22 2c  intf(out,"(%s)",
17f10 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
17f20 3b 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44  ; */.  }.}../* D
17f30 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70  uplicate the inp
17f40 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  ut file without 
17f50 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74  comments and wit
17f60 68 6f 75 74 20 61 63 74 69 6f 6e 73 0a 2a 2a 20  hout actions.** 
17f70 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64  on rules */.void
17f80 20 52 65 70 72 69 6e 74 28 73 74 72 75 63 74 20   Reprint(struct 
17f90 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
17fa0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
17fb0 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
17fc0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
17fd0 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20  j, maxlen, len, 
17fe0 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a  ncolumns, skip;.
17ff0 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70    printf("// Rep
18000 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69  rint of input fi
18010 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53  le \"%s\".\n// S
18020 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d  ymbols:\n",lemp-
18030 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61  >filename);.  ma
18040 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  xlen = 10;.  for
18050 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
18060 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
18070 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
18080 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20  ols[i];.    len 
18090 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70  = lemonStrlen(sp
180a0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
180b0 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
180c0 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  xlen = len;.  }.
180d0 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f    ncolumns = 76/
180e0 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66  (maxlen+5);.  if
180f0 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e  ( ncolumns<1 ) n
18100 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73  columns = 1;.  s
18110 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79  kip = (lemp->nsy
18120 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20  mbol + ncolumns 
18130 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20  - 1)/ncolumns;. 
18140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70   for(i=0; i<skip
18150 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e  ; i++){.    prin
18160 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f  tf("//");.    fo
18170 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=i; j<lemp->n
18180 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29  symbol; j+=skip)
18190 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  {.      sp = lem
181a0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
181b0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d       assert( sp-
181c0 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20  >index==j );.   
181d0 20 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20     printf(" %3d 
181e0 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e  %-*.*s",j,maxlen
181f0 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65  ,maxlen,sp->name
18200 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
18210 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
18220 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
18230 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
18240 65 78 74 29 7b 0a 20 20 20 20 72 75 6c 65 5f 70  ext){.    rule_p
18250 72 69 6e 74 28 73 74 64 6f 75 74 2c 20 72 70 29  rint(stdout, rp)
18260 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22  ;.    printf("."
18270 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70  );.    if( rp->p
18280 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28  recsym ) printf(
18290 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63  " [%s]",rp->prec
182a0 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  sym->name);.    
182b0 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20  /* if( rp->code 
182c0 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20  ) printf("\n    
182d0 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a  %s",rp->code); *
182e0 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  /.    printf("\n
182f0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72  ");.  }.}../* Pr
18300 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 72 75 6c  int a single rul
18310 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 75 6c 65 50  e..*/.void RuleP
18320 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73  rint(FILE *fp, s
18330 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20  truct rule *rp, 
18340 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
18350 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18360 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
18370 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20   fprintf(fp,"%s 
18380 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
18390 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
183a0 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b  i<=rp->nrhs; i++
183b0 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 43  ){.    if( i==iC
183c0 75 72 73 6f 72 20 29 20 66 70 72 69 6e 74 66 28  ursor ) fprintf(
183d0 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66  fp," *");.    if
183e0 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
183f0 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20  break;.    sp = 
18400 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
18410 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
18420 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
18430 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18440 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79  " %s", sp->subsy
18450 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[0]->name);.   
18460 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70     for(j=1; j<sp
18470 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b  ->nsubsym; j++){
18480 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
18490 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75  (fp,"|%s",sp->su
184a0 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[j]->name);.
184b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
184c0 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
184d0 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e  (fp," %s", sp->n
184e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
184f0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 74 68 65 20  }../* Print the 
18500 72 75 6c 65 20 66 6f 72 20 61 20 63 6f 6e 66 69  rule for a confi
18510 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
18520 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49  d ConfigPrint(FI
18530 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63  LE *fp, struct c
18540 6f 6e 66 69 67 20 2a 63 66 70 29 7b 0a 20 20 52  onfig *cfp){.  R
18550 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 63 66 70  ulePrint(fp, cfp
18560 2d 3e 72 70 2c 20 63 66 70 2d 3e 64 6f 74 29 3b  ->rp, cfp->dot);
18570 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54  .}../* #define T
18580 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20  EST */.#if 0./* 
18590 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50  Print a set */.P
185a0 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74 50  RIVATE void SetP
185b0 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d  rint(out,set,lem
185c0 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68  p).FILE *out;.ch
185d0 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20  ar *set;.struct 
185e0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
185f0 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
18600 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72  spacer;.  spacer
18610 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66   = "";.  fprintf
18620 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29  (out,"%12s[","")
18630 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
18640 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
18650 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65  i++){.    if( Se
18660 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a  tFind(set,i) ){.
18670 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
18680 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c  t,"%s%s",spacer,
18690 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
186a0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  ->name);.      s
186b0 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20  pacer = " ";.   
186c0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
186d0 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a  (out,"]\n");.}..
186e0 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b  /* Print a plink
186f0 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54   chain */.PRIVAT
18700 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e  E void PlinkPrin
18710 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46  t(out,plp,tag).F
18720 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
18730 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61   plink *plp;.cha
18740 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c  r *tag;.{.  whil
18750 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70  e( plp ){.    fp
18760 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25  rintf(out,"%12s%
18770 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22 2c  s (state %2d) ",
18780 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d  "",tag,plp->cfp-
18790 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  >stp->statenum);
187a0 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74  .    ConfigPrint
187b0 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a  (out,plp->cfp);.
187c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
187d0 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d  "\n");.    plp =
187e0 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a   plp->next;.  }.
187f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69  }.#endif../* Pri
18800 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  nt an action to 
18810 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
18820 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
18830 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e  rn FALSE if.** n
18840 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74 75 61  othing was actua
18850 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a  lly printed..*/.
18860 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28  int PrintAction(
18870 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
18880 20 2a 61 70 2c 20 20 20 20 20 20 20 20 20 20 2f   *ap,          /
18890 2a 20 54 68 65 20 61 63 74 69 6f 6e 20 74 6f 20  * The action to 
188a0 70 72 69 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20  print */.  FILE 
188b0 2a 66 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fp,            
188c0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20         /* Print 
188d0 74 68 65 20 61 63 74 69 6f 6e 20 68 65 72 65 20  the action here 
188e0 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 6e 74 20  */.  int indent 
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 2f 2a 20 49 6e 64 65 6e 74 20 62 79 20 74 68   /* Indent by th
18910 69 73 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a  is amount */.){.
18920 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31    int result = 1
18930 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
18940 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
18950 20 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20   SHIFT: {.      
18960 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
18970 70 20 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20  p = ap->x.stp;. 
18980 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18990 22 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20  "%*s shift      
189a0 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61    %-7d",indent,a
189b0 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d  p->sp->name,stp-
189c0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
189d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
189e0 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20     case REDUCE: 
189f0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72  {.      struct r
18a00 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e  ule *rp = ap->x.
18a10 72 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  rp;.      fprint
18a20 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65  f(fp,"%*s reduce
18a30 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e 64         %-7d",ind
18a40 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
18a50 2c 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20  ,rp->iRule);.   
18a60 20 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c     RulePrint(fp,
18a70 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20   rp, -1);.      
18a80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18a90 20 63 61 73 65 20 53 48 49 46 54 52 45 44 55 43   case SHIFTREDUC
18aa0 45 3a 20 7b 0a 20 20 20 20 20 20 73 74 72 75 63  E: {.      struc
18ab0 74 20 72 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d  t rule *rp = ap-
18ac0 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 66 70 72  >x.rp;.      fpr
18ad0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
18ae0 66 74 2d 72 65 64 75 63 65 20 25 2d 37 64 22 2c  ft-reduce %-7d",
18af0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
18b00 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ame,rp->iRule);.
18b10 20 20 20 20 20 20 52 75 6c 65 50 72 69 6e 74 28        RulePrint(
18b20 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20  fp, rp, -1);.   
18b30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18b40 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
18b50 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
18b60 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69  p,"%*s accept",i
18b70 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
18b80 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
18b90 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52  ;.    case ERROR
18ba0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
18bb0 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69  fp,"%*s error",i
18bc0 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
18bd0 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
18be0 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43 4f 4e  ;.    case SRCON
18bf0 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73 65 20  FLICT:.    case 
18c00 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  RRCONFLICT:.    
18c10 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18c20 73 20 72 65 64 75 63 65 20 20 20 20 20 20 20 25  s reduce       %
18c30 2d 37 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63  -7d ** Parsing c
18c40 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20  onflict **",.   
18c50 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
18c60 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
18c70 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20  p->iRule);.     
18c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18c90 20 53 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SSCONFLICT:.   
18ca0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18cb0 2a 73 20 73 68 69 66 74 20 20 20 20 20 20 20 20  *s shift        
18cc0 25 2d 37 64 20 2a 2a 20 50 61 72 73 69 6e 67 20  %-7d ** Parsing 
18cd0 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20  conflict **",.  
18ce0 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d        indent,ap-
18cf0 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
18d00 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
18d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18d20 20 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45   case SH_RESOLVE
18d30 44 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f  D:.      if( sho
18d40 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c  wPrecedenceConfl
18d50 69 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ict ){.        f
18d60 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
18d70 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64  hift        %-7d
18d80 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70   -- dropped by p
18d90 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20  recedence",.    
18da0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
18db0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
18dc0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
18dd0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  num);.      }els
18de0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  e{.        resul
18df0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
18e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18e10 63 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44  case RD_RESOLVED
18e20 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77  :.      if( show
18e30 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69  PrecedenceConfli
18e40 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ct ){.        fp
18e50 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
18e60 64 75 63 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f  duce %-7d -- dro
18e70 70 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  pped by preceden
18e80 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce",.           
18e90 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
18ea0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
18eb0 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20  p->iRule);.     
18ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18ed0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
18ee0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
18ef0 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53  .    case NOT_US
18f00 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ED:.      result
18f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
18f20 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73  k;.  }.  if( res
18f30 75 6c 74 20 26 26 20 61 70 2d 3e 73 70 4f 70 74  ult && ap->spOpt
18f40 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18f50 66 70 2c 22 20 20 2f 2a 20 62 65 63 61 75 73 65  fp,"  /* because
18f60 20 25 73 3d 3d 25 73 20 2a 2f 22 2c 20 61 70 2d   %s==%s */", ap-
18f70 3e 73 70 2d 3e 6e 61 6d 65 2c 20 61 70 2d 3e 73  >sp->name, ap->s
18f80 70 4f 70 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d  pOpt->name);.  }
18f90 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
18fa0 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
18fb0 20 74 68 65 20 22 2a 2e 6f 75 74 22 20 6c 6f 67   the "*.out" log
18fc0 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65   file */.void Re
18fd0 70 6f 72 74 4f 75 74 70 75 74 28 73 74 72 75 63  portOutput(struc
18fe0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
18ff0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
19000 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
19010 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
19020 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  cfp;.  struct ac
19030 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75  tion *ap;.  stru
19040 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 46  ct rule *rp;.  F
19050 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20 3d  ILE *fp;..  fp =
19060 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
19070 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20 20  ".out","wb");.  
19080 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74 75  if( fp==0 ) retu
19090 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
190a0 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20  <lemp->nxstate; 
190b0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
190c0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
190d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
190e0 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74  "State %d:\n",st
190f0 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
19100 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69    if( lemp->basi
19110 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d  sflag ) cfp=stp-
19120 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  >bp;.    else   
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
19140 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20  fp=stp->cfp;.   
19150 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20   while( cfp ){. 
19160 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 32 30       char buf[20
19170 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  ];.      if( cfp
19180 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e  ->dot==cfp->rp->
19190 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
191a0 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75  lemon_sprintf(bu
191b0 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70  f,"(%d)",cfp->rp
191c0 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20  ->iRule);.      
191d0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20    fprintf(fp,"  
191e0 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20    %5s ",buf);.  
191f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19200 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
19210 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20           ");.   
19220 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69     }.      Confi
19230 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a  gPrint(fp,cfp);.
19240 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
19250 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20  ,"\n");.#if 0.  
19260 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c      SetPrint(fp,
19270 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a  cfp->fws,lemp);.
19280 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
19290 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54  (fp,cfp->fplp,"T
192a0 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69  o  ");.      Pli
192b0 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  nkPrint(fp,cfp->
192c0 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65  bplp,"From");.#e
192d0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c  ndif.      if( l
192e0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
192f0 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20   cfp=cfp->bp;.  
19300 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
19310 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63 66            cfp=cf
19320 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  p->next;.    }. 
19330 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
19340 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  n");.    for(ap=
19350 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
19360 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
19370 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e   if( PrintAction
19380 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72  (ap,fp,30) ) fpr
19390 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
193a0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
193b0 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
193c0 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d   fprintf(fp, "--
193d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19400 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74  --\n");.  fprint
19410 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c  f(fp, "Symbols:\
19420 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n");.  for(i=0; 
19430 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
19440 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
19450 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  ;.    struct sym
19460 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70  bol *sp;..    sp
19470 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
19480 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [i];.    fprintf
19490 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22  (fp, "  %3d: %s"
194a0 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  , i, sp->name);.
194b0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
194c0 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b  ==NONTERMINAL ){
194d0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
194e0 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69  p, ":");.      i
194f0 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b  f( sp->lambda ){
19500 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
19510 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22  (fp, " <lambda>"
19520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19530 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
19540 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
19550 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
19560 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26 20 53  p->firstset && S
19570 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74  etFind(sp->first
19580 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20  set, j) ){.     
19590 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
195a0 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79   " %s", lemp->sy
195b0 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  mbols[j]->name);
195c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
195d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
195e0 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 20 66   sp->prec>=0 ) f
195f0 70 72 69 6e 74 66 28 66 70 2c 22 20 28 70 72 65  printf(fp," (pre
19600 63 65 64 65 6e 63 65 3d 25 64 29 22 2c 20 73 70  cedence=%d)", sp
19610 2d 3e 70 72 65 63 29 3b 0a 20 20 20 20 66 70 72  ->prec);.    fpr
19620 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a  intf(fp, "\n");.
19630 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70    }.  fprintf(fp
19640 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  , "-------------
19650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19670 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66  -------\n");.  f
19680 70 72 69 6e 74 66 28 66 70 2c 20 22 52 75 6c 65  printf(fp, "Rule
19690 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 72 70  s:\n");.  for(rp
196a0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
196b0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
196c0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
196d0 25 34 64 3a 20 22 2c 20 72 70 2d 3e 69 52 75 6c  %4d: ", rp->iRul
196e0 65 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70 72 69  e);.    rule_pri
196f0 6e 74 28 66 70 2c 20 72 70 29 3b 0a 20 20 20 20  nt(fp, rp);.    
19700 66 70 72 69 6e 74 66 28 66 70 2c 22 2e 22 29 3b  fprintf(fp,".");
19710 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65  .    if( rp->pre
19720 63 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 66 70  csym ){.      fp
19730 72 69 6e 74 66 28 66 70 2c 22 20 5b 25 73 20 70  rintf(fp," [%s p
19740 72 65 63 65 64 65 6e 63 65 3d 25 64 5d 22 2c 0a  recedence=%d]",.
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
19760 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 2c  ->precsym->name,
19770 20 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 70 72   rp->precsym->pr
19780 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ec);.    }.    f
19790 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
197a0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70  .  }.  fclose(fp
197b0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
197c0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
197d0 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68  e file "name" wh
197e0 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73 61  ich is in the sa
197f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
19800 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62 6c  ** the exacutabl
19810 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  e */.PRIVATE cha
19820 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63 68  r *pathsearch(ch
19830 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72 20  ar *argv0, char 
19840 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d  *name, int modem
19850 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63  ask).{.  const c
19860 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
19870 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70 74   char *pathbufpt
19880 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62  r;.  char *pathb
19890 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  uf;.  char *path
198a0 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a  ,*cp;.  char c;.
198b0 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
198c0 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  _.  cp = strrchr
198d0 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65  (argv0,'\\');.#e
198e0 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72 63  lse.  cp = strrc
198f0 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23  hr(argv0,'/');.#
19900 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20 29  endif.  if( cp )
19910 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20  {.    c = *cp;. 
19920 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
19930 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  path = (char *)m
19940 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
19950 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f  en(argv0) + lemo
19960 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20  nStrlen(name) + 
19970 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  2 );.    if( pat
19980 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74  h ) lemon_sprint
19990 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 61  f(path,"%s/%s",a
199a0 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  rgv0,name);.    
199b0 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65  *cp = c;.  }else
199c0 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d  {.    pathlist =
199d0 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b   getenv("PATH");
199e0 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73  .    if( pathlis
199f0 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20  t==0 ) pathlist 
19a00 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62  = ".:/bin:/usr/b
19a10 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62 75 66  in";.    pathbuf
19a20 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
19a30 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
19a40 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20 29 3b  pathlist) + 1 );
19a50 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
19a60 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
19a70 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74  nStrlen(pathlist
19a80 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61  )+lemonStrlen(na
19a90 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
19aa0 20 28 70 61 74 68 62 75 66 20 21 3d 20 30 29 20   (pathbuf != 0) 
19ab0 26 26 20 28 70 61 74 68 21 3d 30 29 20 29 7b 0a  && (path!=0) ){.
19ac0 20 20 20 20 20 20 70 61 74 68 62 75 66 70 74 72        pathbufptr
19ad0 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20 20 20   = pathbuf;.    
19ae0 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 70    lemon_strcpy(p
19af0 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74  athbuf, pathlist
19b00 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
19b10 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20  *pathbuf ){.    
19b20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28      cp = strchr(
19b30 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20  pathbuf,':');.  
19b40 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
19b50 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b  ) cp = &pathbuf[
19b60 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68  lemonStrlen(path
19b70 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  buf)];.        c
19b80 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
19b90 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
19ba0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
19bb0 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68  ath,"%s/%s",path
19bc0 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  buf,name);.     
19bd0 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20     *cp = c;.    
19be0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70      if( c==0 ) p
19bf0 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20  athbuf[0] = 0;. 
19c00 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74 68         else path
19c10 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20  buf = &cp[1];.  
19c20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73        if( access
19c30 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d  (path,modemask)=
19c40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
19c50 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70    }.      free(p
19c60 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20 20  athbufptr);.    
19c70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
19c80 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e  ath;.}../* Given
19c90 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70   an action, comp
19ca0 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ute the integer 
19cb0 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61  value for that a
19cc0 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69  ction.** which i
19cd0 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74  s to be put in t
19ce0 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
19cf0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
19d00 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74   machine..** Ret
19d10 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
19d20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  no action should
19d30 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a   be generated..*
19d40 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
19d50 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74 72  mpute_action(str
19d60 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
19d70 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
19d80 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b  ap).{.  int act;
19d90 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
19da0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
19db0 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70  SHIFT:  act = ap
19dc0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
19dd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
19de0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19df0 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 52  .    case SHIFTR
19e00 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 2f  EDUCE: {.      /
19e10 2a 20 53 69 6e 63 65 20 61 20 53 48 49 46 54 20  * Since a SHIFT 
19e20 69 73 20 69 6e 68 65 72 69 65 6e 74 20 61 66 74  is inherient aft
19e30 65 72 20 61 20 70 72 69 6f 72 20 52 45 44 55 43  er a prior REDUC
19e40 45 2c 20 63 6f 6e 76 65 72 74 20 61 6e 79 0a 20  E, convert any. 
19e50 20 20 20 20 20 2a 2a 20 53 48 49 46 54 52 45 44       ** SHIFTRED
19e60 55 43 45 20 61 63 74 69 6f 6e 20 77 69 74 68 20  UCE action with 
19e70 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 6e  a nonterminal on
19e80 20 74 68 65 20 4c 48 53 20 69 6e 74 6f 20 61 20   the LHS into a 
19e90 73 69 6d 70 6c 65 0a 20 20 20 20 20 20 2a 2a 20  simple.      ** 
19ea0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 3a 20 2a  REDUCE action: *
19eb0 2f 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  /.      if( ap->
19ec0 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d  sp->index>=lemp-
19ed0 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
19ee0 20 20 20 20 20 20 61 63 74 20 3d 20 6c 65 6d 70        act = lemp
19ef0 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20 61 70  ->minReduce + ap
19f00 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b 0a 20  ->x.rp->iRule;. 
19f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19f20 20 20 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e      act = lemp->
19f30 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65 20 2b  minShiftReduce +
19f40 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65   ap->x.rp->iRule
19f50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19f60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19f70 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61 63   case REDUCE: ac
19f80 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  t = lemp->minRed
19f90 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e  uce + ap->x.rp->
19fa0 69 52 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  iRule;          
19fb0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19fc0 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
19fd0 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e 3b 20 20  mp->errAction;  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a000 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54  .    case ACCEPT
1a010 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 61 63  : act = lemp->ac
1a020 63 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  cAction;        
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1a050 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20  efault:     act 
1a060 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  = -1; break;.  }
1a070 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d  .  return act;.}
1a080 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49  ..#define LINESI
1a090 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e  ZE 1000./* The n
1a0a0 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72  ext cluster of r
1a0b0 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20  outines are for 
1a0c0 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70  reading the temp
1a0d0 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  late file.** and
1a0e0 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73   writing the res
1a0f0 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65  ults to the gene
1a100 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a  rated parser */.
1a110 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e  /* The first fun
1a120 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ction transfers 
1a130 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74  data from "in" t
1a140 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a  o "out" until.**
1a150 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20   a line is seen 
1a160 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74  which begins wit
1a170 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e  h "%%".  The lin
1a180 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74  e number is.** t
1a190 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  racked..**.** if
1a1a0 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61   name!=0, then a
1a1b0 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67  ny word that beg
1a1c0 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20  in with "Parse" 
1a1d0 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a  is changed to.**
1a1e0 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d   begin with *nam
1a1f0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52  e instead..*/.PR
1a200 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
1a210 78 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c  xfer(char *name,
1a220 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20   FILE *in, FILE 
1a230 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e  *out, int *linen
1a240 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53  o).{.  int i, iS
1a250 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e  tart;.  char lin
1a260 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77  e[LINESIZE];.  w
1a270 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65  hile( fgets(line
1a280 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26  ,LINESIZE,in) &&
1a290 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c   (line[0]!='%' |
1a2a0 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20  | line[1]!='%') 
1a2b0 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  ){.    (*lineno)
1a2c0 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d  ++;.    iStart =
1a2d0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65   0;.    if( name
1a2e0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
1a2f0 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29  0; line[i]; i++)
1a300 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69  {.        if( li
1a310 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74  ne[i]=='P' && st
1a320 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22  rncmp(&line[i],"
1a330 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20  Parse",5)==0.   
1a340 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20         && (i==0 
1a350 7c 7c 20 21 49 53 41 4c 50 48 41 28 6c 69 6e 65  || !ISALPHA(line
1a360 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20  [i-1])).        
1a370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1a380 20 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69   i>iStart ) fpri
1a390 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
1a3a0 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53  -iStart,&line[iS
1a3b0 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20  tart]);.        
1a3c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
1a3d0 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s",name);.      
1a3e0 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
1a3f0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
1a400 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1a410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a420 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
1a430 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b  ,&line[iStart]);
1a440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e  .  }.}../* The n
1a450 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  ext function fin
1a460 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ds the template 
1a470 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69  file and opens i
1a480 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  t, returning.** 
1a490 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1a4a0 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f   opened file. */
1a4b0 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74  .PRIVATE FILE *t
1a4c0 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20  plt_open(struct 
1a4d0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
1a4e0 20 73 74 61 74 69 63 20 63 68 61 72 20 74 65 6d   static char tem
1a4f0 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c  platename[] = "l
1a500 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72  empar.c";.  char
1a510 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49   buf[1000];.  FI
1a520 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a  LE *in;.  char *
1a530 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72  tpltname;.  char
1a540 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73   *cp;..  /* firs
1a550 74 2c 20 73 65 65 20 69 66 20 75 73 65 72 20 73  t, see if user s
1a560 70 65 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c  pecified a templ
1a570 61 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20  ate filename on 
1a580 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1a590 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f  . */.  if (user_
1a5a0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20  templatename != 
1a5b0 30 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63  0) {.    if( acc
1a5c0 65 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  ess(user_templat
1a5d0 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29  ename,004)==-1 )
1a5e0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1a5f0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
1a600 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
1a610 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
1a620 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
1a630 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70         user_temp
1a640 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  latename);.     
1a650 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1a660 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
1a670 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  0;.    }.    in 
1a680 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d  = fopen(user_tem
1a690 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b  platename,"rb");
1a6a0 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
1a6b0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1a6c0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70  stderr,"Can't op
1a6d0 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  en the template 
1a6e0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
1a6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
1a700 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
1a710 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
1a720 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1a730 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1a740 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a  .    return in;.
1a750 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72    }..  cp = strr
1a760 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  chr(lemp->filena
1a770 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
1a780 70 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73  p ){.    lemon_s
1a790 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73  printf(buf,"%.*s
1a7a0 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65  .lt",(int)(cp-le
1a7b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65  mp->filename),le
1a7c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
1a7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f   }else{.    lemo
1a7e0 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25  n_sprintf(buf,"%
1a7f0 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65  s.lt",lemp->file
1a800 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  name);.  }.  if(
1a810 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29   access(buf,004)
1a820 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
1a830 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c  ame = buf;.  }el
1a840 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65  se if( access(te
1a850 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
1a860 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
1a870 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d  me = templatenam
1a880 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1a890 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73  tpltname = paths
1a8a0 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76  earch(lemp->argv
1a8b0 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30  0,templatename,0
1a8c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c  );.  }.  if( tpl
1a8d0 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tname==0 ){.    
1a8e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1a8f0 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70  Can't find the p
1a900 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d  arser driver tem
1a910 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
1a920 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c  ".\n",.    templ
1a930 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  atename);.    le
1a940 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1a950 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a960 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74  }.  in = fopen(t
1a970 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  pltname,"rb");. 
1a980 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
1a990 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1a9a0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
1a9b0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
1a9c0 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61  "%s\".\n",templa
1a9d0 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
1a9e0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1a9f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1aa00 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a  .  return in;.}.
1aa10 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e  ./* Print a #lin
1aa20 65 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65  e directive line
1aa30 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66   to the output f
1aa40 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
1aa50 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69  void tplt_linedi
1aa60 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74  r(FILE *out, int
1aa70 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a 66   lineno, char *f
1aa80 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70 72  ilename).{.  fpr
1aa90 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20  intf(out,"#line 
1aaa0 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a  %d \"",lineno);.
1aab0 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61    while( *filena
1aac0 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66  me ){.    if( *f
1aad0 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20  ilename == '\\' 
1aae0 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29  ) putc('\\',out)
1aaf0 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65  ;.    putc(*file
1ab00 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66  name,out);.    f
1ab10 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20  ilename++;.  }. 
1ab20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
1ab30 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  \n");.}../* Prin
1ab40 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68  t a string to th
1ab50 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20  e file and keep 
1ab60 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75  the linenumber u
1ab70 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49  p to date */.PRI
1ab80 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70  VATE void tplt_p
1ab90 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20  rint(FILE *out, 
1aba0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1abb0 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69  mp, char *str, i
1abc0 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20  nt *lineno).{.  
1abd0 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74  if( str==0 ) ret
1abe0 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73  urn;.  while( *s
1abf0 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63 28 2a  tr ){.    putc(*
1ac00 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69 66  str,out);.    if
1ac10 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28  ( *str=='\n' ) (
1ac20 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
1ac30 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  str++;.  }.  if(
1ac40 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29   str[-1]!='\n' )
1ac50 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e 27 2c  {.    putc('\n',
1ac60 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65  out);.    (*line
1ac70 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 20  no)++;.  }.  if 
1ac80 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
1ac90 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a 6c  sflag) {.    (*l
1aca0 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
1acb0 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
1acc0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
1acd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
1ace0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1acf0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
1ad00 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74  emits code for t
1ad10 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
1ad20 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  r the.** symbol 
1ad30 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f  sp.*/.void emit_
1ad40 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1ad50 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
1ad60 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1ad70 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  p,.  struct lemo
1ad80 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a  n *lemp,.  int *
1ad90 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72 20  lineno.){. char 
1ada0 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20 73  *cp = 0;.. if( s
1adb0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
1adc0 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  L ){.   cp = lem
1add0 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20  p->tokendest;.  
1ade0 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
1adf0 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
1ae00 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
1ae10 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20  neno)++;. }else 
1ae20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74  if( sp->destruct
1ae30 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70  or ){.   cp = sp
1ae40 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
1ae50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
1ae60 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1ae70 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e  ;.   if( !lemp->
1ae80 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b  nolinenosflag ){
1ae90 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  .     (*lineno)+
1aea0 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e  +;.     tplt_lin
1aeb0 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73  edir(out,sp->des
1aec0 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69  tLineno,lemp->fi
1aed0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d  lename);.   }. }
1aee0 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76  else if( lemp->v
1aef0 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20  ardest ){.   cp 
1af00 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b  = lemp->vardest;
1af10 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
1af20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
1af30 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
1af40 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
1af50 73 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30  se{.   assert( 0
1af60 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1af70 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72  appen */. }. for
1af80 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  (; *cp; cp++){. 
1af90 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26    if( *cp=='$' &
1afa0 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a  & cp[1]=='$' ){.
1afb0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1afc0 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25  ,"(yypminor->yy%
1afd0 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a  d)",sp->dtnum);.
1afe0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
1aff0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20  continue;.   }. 
1b000 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
1b010 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ) (*lineno)++;. 
1b020 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29    fputc(*cp,out)
1b030 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75  ;. }. fprintf(ou
1b040 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  t,"\n"); (*linen
1b050 6f 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70  o)++;. if (!lemp
1b060 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
1b070 20 7b 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b   {.   (*lineno)+
1b080 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
1b090 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
1b0a0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 0a 20  ->outname);. }. 
1b0b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
1b0c0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1b0d0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
1b0e0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
1b0f0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
1b100 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
1b110 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
1b120 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
1b130 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d  uctor(struct sym
1b140 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20  bol *sp, struct 
1b150 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
1b160 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
1b170 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1b180 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
1b190 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
1b1a0 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
1b1b0 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
1b1c0 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
1b1d0 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
1b1e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
1b1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1b200 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
1b210 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
1b220 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
1b230 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
1b240 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
1b250 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
1b260 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
1b270 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
1b280 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
1b290 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
1b2a0 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
1b2b0 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
1b2c0 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
1b2d0 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
1b2e0 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
1b2f0 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
1b300 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
1b310 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
1b320 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
1b330 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
1b340 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
1b350 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
1b360 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
1b370 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
1b380 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
1b390 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
1b3a0 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
1b3b0 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
1b3c0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
1b3d0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
1b3e0 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
1b3f0 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  nd_str(const cha
1b400 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
1b410 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
1b420 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
1b430 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d  empty[1] = { 0 }
1b440 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
1b450 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
1b460 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
1b470 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
1b480 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
1b490 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
1b4a0 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  ];.  if( zText==
1b4b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 73 65  0 ){.    if( use
1b4c0 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29 20 7a  d==0 && z!=0 ) z
1b4d0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  [0] = 0;.    use
1b4e0 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  d = 0;.    retur
1b4f0 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n z;.  }.  if( n
1b500 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  <=0 ){.    if( n
1b510 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65 64  <0 ){.      used
1b520 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73 73   += n;.      ass
1b530 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a  ert( used>=0 );.
1b540 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65      }.    n = le
1b550 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74 29  monStrlen(zText)
1b560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 6e 74  ;.  }.  if( (int
1b570 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74  ) (n+sizeof(zInt
1b580 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61 6c 6c  )*2+used) >= all
1b590 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  oced ){.    allo
1b5a0 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66  ced = n + sizeof
1b5b0 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20  (zInt)*2 + used 
1b5c0 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 28  + 200;.    z = (
1b5d0 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28  char *) realloc(
1b5e0 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20  z,  alloced);.  
1b5f0 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  }.  if( z==0 ) r
1b600 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20 77  eturn empty;.  w
1b610 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
1b620 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78 74  .    c = *(zText
1b630 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
1b640 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20 7a 54  '%' && n>0 && zT
1b650 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a 20  ext[0]=='d' ){. 
1b660 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
1b670 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70  tf(zInt, "%d", p
1b680 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70  1);.      p1 = p
1b690 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  2;.      lemon_s
1b6a0 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
1b6b0 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
1b6c0 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
1b6d0 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
1b6e0 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
1b6f0 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
1b700 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
1b710 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20 20 20   = (char)c;.    
1b720 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d 20  }.  }.  z[used] 
1b730 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  = 0;.  return z;
1b740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1b750 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  and transform th
1b760 65 20 72 70 2d 3e 63 6f 64 65 20 73 74 72 69 6e  e rp->code strin
1b770 67 20 73 6f 20 74 68 61 74 20 73 79 6d 62 6f 6c  g so that symbol
1b780 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1b790 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
1b7a0 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 61  rp->codePrefix a
1b7b0 6e 64 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69  nd rp->codeSuffi
1b7c0 78 20 73 74 72 69 6e 67 73 2c 20 61 73 20 61 70  x strings, as ap
1b7d0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a  propriate..**.**
1b7e0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1b7f0 20 65 78 70 61 6e 64 65 64 20 63 6f 64 65 20 72   expanded code r
1b800 65 71 75 69 72 65 73 20 74 68 61 74 20 22 79 79  equires that "yy
1b810 6c 68 73 6d 69 6e 6f 72 22 20 6c 6f 63 61 6c 20  lhsminor" local 
1b820 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f 20 62  variable.** to b
1b830 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 50 52  e defined..*/.PR
1b840 49 56 41 54 45 20 69 6e 74 20 74 72 61 6e 73 6c  IVATE int transl
1b850 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74 20  ate_code(struct 
1b860 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72  lemon *lemp, str
1b870 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
1b880 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a   char *cp, *xp;.
1b890 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
1b8a0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1b8b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 79 79 6c    /* True if yyl
1b8c0 68 73 6d 69 6e 6f 72 20 69 73 20 75 73 65 64 20  hsminor is used 
1b8d0 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 74 55 73 65  */.  int dontUse
1b8e0 52 68 73 30 20 3d 20 30 3b 20 20 20 2f 2a 20 49  Rhs0 = 0;   /* I
1b8f0 66 20 74 72 75 65 2c 20 75 73 65 20 6f 66 20 6c  f true, use of l
1b900 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61 62  eft-most RHS lab
1b910 65 6c 20 69 73 20 69 6c 6c 65 67 61 6c 20 2a 2f  el is illegal */
1b920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b930 53 6b 69 70 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Skip = 0; /* The
1b940 20 7a 4f 76 77 72 74 20 63 6f 6d 6d 65 6e 74 20   zOvwrt comment 
1b950 77 69 74 68 69 6e 20 72 70 2d 3e 63 6f 64 65 2c  within rp->code,
1b960 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
1b970 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
1b980 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b990 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20  the LHS element 
1b9a0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f  has been used */
1b9b0 0a 20 20 63 68 61 72 20 6c 68 73 64 69 72 65 63  .  char lhsdirec
1b9c0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
1b9d0 65 20 69 66 20 4c 48 53 20 77 72 69 74 65 73 20  e if LHS writes 
1b9e0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 73 74  directly into st
1b9f0 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 75 73  ack */.  char us
1ba00 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20 20  ed[MAXRHS];     
1ba10 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63 68  /* True for each
1ba20 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69   RHS element whi
1ba30 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20  ch is used */.  
1ba40 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b 20 20  char zLhs[50];  
1ba50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72         /* Conver
1ba60 74 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  t the LHS symbol
1ba70 20 69 6e 74 6f 20 74 68 69 73 20 73 74 72 69 6e   into this strin
1ba80 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4f 76 77  g */.  char zOvw
1ba90 72 74 5b 39 30 30 5d 3b 20 20 20 20 20 20 2f 2a  rt[900];      /*
1baa0 20 43 6f 6d 6d 65 6e 74 20 74 68 61 74 20 74 6f   Comment that to
1bab0 20 61 6c 6c 6f 77 20 4c 48 53 20 74 6f 20 6f 76   allow LHS to ov
1bac0 65 72 77 72 69 74 65 20 52 48 53 20 2a 2f 0a 0a  erwrite RHS */..
1bad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
1bae0 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65 64  >nrhs; i++) used
1baf0 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73  [i] = 0;.  lhsus
1bb00 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  ed = 0;..  if( r
1bb10 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  p->code==0 ){.  
1bb20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 6e 65    static char ne
1bb30 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20 7b 20  wlinestr[2] = { 
1bb40 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a 20 20  '\n', '\0' };.  
1bb50 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e 65 77    rp->code = new
1bb60 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72 70 2d  linestr;.    rp-
1bb70 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65  >line = rp->rule
1bb80 6c 69 6e 65 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f  line;.    rp->no
1bb90 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Code = 1;.  }els
1bba0 65 7b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64  e{.    rp->noCod
1bbb0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 0a 20 20 69  e = 0;.  }...  i
1bbc0 66 28 20 72 70 2d 3e 6e 72 68 73 3d 3d 30 20 29  f( rp->nrhs==0 )
1bbd0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1bbe0 65 20 61 72 65 20 6e 6f 20 52 48 53 20 73 79 6d  e are no RHS sym
1bbf0 62 6f 6c 73 2c 20 74 68 65 6e 20 77 72 69 74 69  bols, then writi
1bc00 6e 67 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  ng directly to t
1bc10 68 65 20 4c 48 53 20 69 73 20 6f 6b 20 2a 2f 0a  he LHS is ok */.
1bc20 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20      lhsdirect = 
1bc30 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  1;.  }else if( r
1bc40 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 3d 3d  p->rhsalias[0]==
1bc50 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
1bc60 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79  left-most RHS sy
1bc70 6d 62 6f 6c 20 68 61 73 20 6e 6f 20 76 61 6c 75  mbol has no valu
1bc80 65 2e 20 20 4c 48 53 20 64 69 72 65 63 74 20 69  e.  LHS direct i
1bc90 73 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  s ok.  But.    *
1bca0 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63 61 6c  * we have to cal
1bcb0 6c 20 74 68 65 20 64 69 73 74 72 75 63 74 6f 72  l the distructor
1bcc0 20 6f 6e 20 74 68 65 20 52 48 53 20 73 79 6d 62   on the RHS symb
1bcd0 6f 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ol first. */.   
1bce0 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a   lhsdirect = 1;.
1bcf0 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74      if( has_dest
1bd00 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 30  ructor(rp->rhs[0
1bd10 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20  ],lemp) ){.     
1bd20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
1bd30 30 2c 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65  0,0);.      appe
1bd40 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73  nd_str("  yy_des
1bd50 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73 65  tructor(yypParse
1bd60 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e  r,%d,&yymsp[%d].
1bd70 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20  minor);\n", 0,. 
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e 64 65  rp->rhs[0]->inde
1bda0 78 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b 0a 20  x,1-rp->nrhs);. 
1bdb0 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 50 72 65       rp->codePre
1bdc0 66 69 78 20 3d 20 53 74 72 73 61 66 65 28 61 70  fix = Strsafe(ap
1bdd0 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1bde0 29 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 6e 6f  ));.      rp->no
1bdf0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Code = 0;.    }.
1be00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
1be10 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  lhsalias==0 ){. 
1be20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1be30 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79 6d 62  o LHS value symb
1be40 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69  ol. */.    lhsdi
1be50 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rect = 1;.  }els
1be60 65 20 69 66 28 20 73 74 72 63 6d 70 28 72 70 2d  e if( strcmp(rp-
1be70 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72 68  >lhsalias,rp->rh
1be80 73 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20 29 7b  salias[0])==0 ){
1be90 0a 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20  .    /* The LHS 
1bea0 73 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65 20 6c  symbol and the l
1beb0 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79 6d  eft-most RHS sym
1bec0 62 6f 6c 20 61 72 65 20 74 68 65 20 73 61 6d 65  bol are the same
1bed0 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 64 69 72 65  , so.    ** dire
1bee0 63 74 20 77 72 69 74 69 6e 67 20 69 73 20 61 6c  ct writing is al
1bef0 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 6c 68 73  lowed */.    lhs
1bf00 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20  direct = 1;.    
1bf10 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20  lhsused = 1;.   
1bf20 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b 0a 20 20   used[0] = 1;.  
1bf30 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 64    if( rp->lhs->d
1bf40 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73 5b 30 5d  tnum!=rp->rhs[0]
1bf50 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20  ->dtnum ){.     
1bf60 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1bf70 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1bf80 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22  eline,.        "
1bf90 25 73 28 25 73 29 20 61 6e 64 20 25 73 28 25 73  %s(%s) and %s(%s
1bfa0 29 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  ) share the same
1bfb0 20 6c 61 62 65 6c 20 62 75 74 20 68 61 76 65 20   label but have 
1bfc0 22 0a 20 20 20 20 20 20 20 20 22 64 69 66 66 65  ".        "diffe
1bfd0 72 65 6e 74 20 64 61 74 61 74 79 70 65 73 2e 22  rent datatypes."
1bfe0 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
1bff0 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 6c 68 73  s->name, rp->lhs
1c000 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73 5b 30  alias, rp->rhs[0
1c010 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73  ]->name, rp->rhs
1c020 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20 20  alias[0]);.     
1c030 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1c040 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
1c050 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
1c060 6e 74 66 28 7a 4f 76 77 72 74 2c 20 22 2f 2a 25  ntf(zOvwrt, "/*%
1c070 73 2d 6f 76 65 72 77 72 69 74 65 73 2d 25 73 2a  s-overwrites-%s*
1c080 2f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  /",.            
1c090 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
1c0a0 61 73 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  as, rp->rhsalias
1c0b0 5b 30 5d 29 3b 0a 20 20 20 20 7a 53 6b 69 70 20  [0]);.    zSkip 
1c0c0 3d 20 73 74 72 73 74 72 28 72 70 2d 3e 63 6f 64  = strstr(rp->cod
1c0d0 65 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20  e, zOvwrt);.    
1c0e0 69 66 28 20 7a 53 6b 69 70 21 3d 30 20 29 7b 0a  if( zSkip!=0 ){.
1c0f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1c100 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70 65  e contains a spe
1c110 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 20 74 68 61  cial comment tha
1c120 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
1c130 20 69 74 20 69 73 20 73 61 66 65 0a 20 20 20 20   it is safe.    
1c140 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53    ** for the LHS
1c150 20 6c 61 62 65 6c 20 74 6f 20 6f 76 65 72 77 72   label to overwr
1c160 69 74 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48  ite left-most RH
1c170 53 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20 20 20  S label. */.    
1c180 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1c190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c1a0 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 30 3b    lhsdirect = 0;
1c1b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1c1c0 20 6c 68 73 64 69 72 65 63 74 20 29 7b 0a 20 20   lhsdirect ){.  
1c1d0 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20    sprintf(zLhs, 
1c1e0 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  "yymsp[%d].minor
1c1f0 2e 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e 72 68  .yy%d",1-rp->nrh
1c200 73 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  s,rp->lhs->dtnum
1c210 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c220 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 70 72 69  rc = 1;.    spri
1c230 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6c 68 73  ntf(zLhs, "yylhs
1c240 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e  minor.yy%d",rp->
1c250 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d  lhs->dtnum);.  }
1c260 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30  ..  append_str(0
1c270 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54  ,0,0,0);..  /* T
1c280 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69  his const cast i
1c290 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d  s wrong but harm
1c2a0 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65 20 63  less, if we're c
1c2b0 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72  areful. */.  for
1c2c0 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e  (cp=(char *)rp->
1c2d0 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
1c2e0 7b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 7a 53  {.    if( cp==zS
1c2f0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 61 70 70  kip ){.      app
1c300 65 6e 64 5f 73 74 72 28 7a 4f 76 77 72 74 2c 30  end_str(zOvwrt,0
1c310 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 63 70 20  ,0,0);.      cp 
1c320 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a  += lemonStrlen(z
1c330 4f 76 77 72 74 29 2d 31 3b 0a 20 20 20 20 20 20  Ovwrt)-1;.      
1c340 64 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 31 3b  dontUseRhs0 = 1;
1c350 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1c360 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
1c370 53 41 4c 50 48 41 28 2a 63 70 29 20 26 26 20 28  SALPHA(*cp) && (
1c380 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20  cp==rp->code || 
1c390 28 21 49 53 41 4c 4e 55 4d 28 63 70 5b 2d 31 5d  (!ISALNUM(cp[-1]
1c3a0 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27  ) && cp[-1]!='_'
1c3b0 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  )) ){.      char
1c3c0 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f   saved;.      fo
1c3d0 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 49 53  r(xp= &cp[1]; IS
1c3e0 41 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c 20 2a 78  ALNUM(*xp) || *x
1c3f0 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20  p=='_'; xp++);. 
1c400 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70       saved = *xp
1c410 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b  ;.      *xp = 0;
1c420 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
1c430 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d  hsalias && strcm
1c440 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  p(cp,rp->lhsalia
1c450 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s)==0 ){.       
1c460 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73   append_str(zLhs
1c470 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20  ,0,0,0);.       
1c480 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
1c490 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
1c4a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c4b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
1c4c0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
1c4d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d           if( rp-
1c4e0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20  >rhsalias[i] && 
1c4f0 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68  strcmp(cp,rp->rh
1c500 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
1c510 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1c520 20 69 3d 3d 30 20 26 26 20 64 6f 6e 74 55 73 65   i==0 && dontUse
1c530 52 68 73 30 20 29 7b 0a 20 20 20 20 20 20 20 20  Rhs0 ){.        
1c540 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1c550 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1c560 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 61               "La
1c580 62 65 6c 20 25 73 20 75 73 65 64 20 61 66 74 65  bel %s used afte
1c590 72 20 27 25 73 27 2e 22 2c 0a 20 20 20 20 20 20  r '%s'.",.      
1c5a0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
1c5b0 68 73 61 6c 69 61 73 5b 30 5d 2c 20 7a 4f 76 77  hsalias[0], zOvw
1c5c0 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
1c5d0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1c5e0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
1c5f0 20 7d 65 6c 73 65 20 69 66 28 20 63 70 21 3d 72   }else if( cp!=r
1c600 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31  p->code && cp[-1
1c610 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20  ]=='@' ){.      
1c620 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c630 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66  e argument is of
1c640 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65   the form @X the
1c650 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20  n substituted.  
1c660 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1c670 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20  he token number 
1c680 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61  of X, not the va
1c690 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20  lue of X */.    
1c6a0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
1c6b0 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e  _str("yymsp[%d].
1c6c0 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e  major",-1,i-rp->
1c6d0 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20  nrhs+1,0);.     
1c6e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1c700 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1c710 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
1c720 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 74            int dt
1c730 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  num;.           
1c740 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
1c750 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
1c760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c770 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75    dtnum = sp->su
1c780 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a  bsym[0]->dtnum;.
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
1c7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c7b0 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d       dtnum = sp-
1c7c0 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
1c7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c7e0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c7f0 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ("yymsp[%d].mino
1c800 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e  r.yy%d",0,i-rp->
1c810 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a  nrhs+1, dtnum);.
1c820 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c830 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78            cp = x
1c840 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  p;.            u
1c850 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20  sed[i] = 1;.    
1c860 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c870 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c880 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c890 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a     *xp = saved;.
1c8a0 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64      }.    append
1c8b0 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30  _str(cp, 1, 0, 0
1c8c0 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f  );.  } /* End lo
1c8d0 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 69 6e  op */..  /* Main
1c8e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1c8f0 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 20 20   completed */.  
1c900 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28  cp = append_str(
1c910 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  0,0,0,0);.  if( 
1c920 63 70 20 26 26 20 63 70 5b 30 5d 20 29 20 72 70  cp && cp[0] ) rp
1c930 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65  ->code = Strsafe
1c940 28 63 70 29 3b 0a 20 20 61 70 70 65 6e 64 5f 73  (cp);.  append_s
1c950 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20  tr(0,0,0,0);..  
1c960 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
1c970 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61   sure the LHS ha
1c980 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
1c990 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
1c9a0 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b  s && !lhsused ){
1c9b0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65  .    ErrorMsg(le
1c9c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1c9d0 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1c9e0 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66   "Label \"%s\" f
1c9f0 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73  or \"%s(%s)\" is
1ca00 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20   never used.",. 
1ca10 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c         rp->lhsal
1ca20 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  ias,rp->lhs->nam
1ca30 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  e,rp->lhsalias);
1ca40 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
1ca50 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  cnt++;.  }..  /*
1ca60 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75   Generate destru
1ca70 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48  ctor code for RH
1ca80 53 20 6d 69 6e 6f 72 20 76 61 6c 75 65 73 20 77  S minor values w
1ca90 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72 65 66  hich are not ref
1caa0 65 72 65 6e 63 65 64 2e 0a 20 20 2a 2a 20 47 65  erenced..  ** Ge
1cab0 6e 65 72 61 74 65 20 65 72 72 6f 72 20 6d 65 73  nerate error mes
1cac0 73 61 67 65 73 20 66 6f 72 20 75 6e 75 73 65 64  sages for unused
1cad0 20 6c 61 62 65 6c 73 20 61 6e 64 20 64 75 70 6c   labels and dupl
1cae0 69 63 61 74 65 20 6c 61 62 65 6c 73 2e 0a 20 20  icate labels..  
1caf0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1cb00 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
1cb10 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
1cb20 6c 69 61 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  lias[i] ){.     
1cb30 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
1cb40 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1cb50 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c     if( rp->lhsal
1cb60 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 72 70  ias && strcmp(rp
1cb70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72  ->lhsalias,rp->r
1cb80 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29  hsalias[i])==0 )
1cb90 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
1cba0 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1cbb0 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1cbc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 25  ,.            "%
1cbd0 73 28 25 73 29 20 68 61 73 20 74 68 65 20 73 61  s(%s) has the sa
1cbe0 6d 65 20 6c 61 62 65 6c 20 61 73 20 74 68 65 20  me label as the 
1cbf0 4c 48 53 20 62 75 74 20 69 73 20 6e 6f 74 20 74  LHS but is not t
1cc00 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 22 0a 20  he left-most ". 
1cc10 20 20 20 20 20 20 20 20 20 20 20 22 73 79 6d 62             "symb
1cc20 6f 6c 20 6f 6e 20 74 68 65 20 52 48 53 2e 22 2c  ol on the RHS.",
1cc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
1cc40 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 20 72  >rhs[i]->name, r
1cc50 70 2d 3e 72 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->rhsalias);.  
1cc60 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
1cc70 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1cc80 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
1cc90 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
1cca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70            if( rp
1ccb0 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 20 26 26  ->rhsalias[j] &&
1ccc0 20 73 74 72 63 6d 70 28 72 70 2d 3e 72 68 73 61   strcmp(rp->rhsa
1ccd0 6c 69 61 73 5b 6a 5d 2c 72 70 2d 3e 72 68 73 61  lias[j],rp->rhsa
1cce0 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20  lias[i])==0 ){. 
1ccf0 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72             Error
1cd00 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1cd10 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1cd30 4c 61 62 65 6c 20 25 73 20 75 73 65 64 20 66 6f  Label %s used fo
1cd40 72 20 6d 75 6c 74 69 70 6c 65 20 73 79 6d 62 6f  r multiple symbo
1cd50 6c 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ls on the RHS of
1cd60 20 61 20 72 75 6c 65 2e 22 2c 0a 20 20 20 20 20   a rule.",.     
1cd70 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
1cd80 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20  alias[i]);.     
1cd90 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
1cda0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
1cdb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cdd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1cde0 69 66 28 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a  if( !used[i] ){.
1cdf0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
1ce00 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1ce10 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1ce20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25          "Label %
1ce30 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  s for \"%s(%s)\"
1ce40 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
1ce50 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ,.          rp->
1ce60 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e  rhsalias[i],rp->
1ce70 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d  rhs[i]->name,rp-
1ce80 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20  >rhsalias[i]);. 
1ce90 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
1cea0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
1ceb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
1cec0 3e 30 20 26 26 20 68 61 73 5f 64 65 73 74 72 75  >0 && has_destru
1ced0 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c  ctor(rp->rhs[i],
1cee0 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 61  lemp) ){.      a
1cef0 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f  ppend_str("  yy_
1cf00 64 65 73 74 72 75 63 74 6f 72 28 79 79 70 50 61  destructor(yypPa
1cf10 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25  rser,%d,&yymsp[%
1cf20 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30  d].minor);\n", 0
1cf30 2c 0a 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  ,.         rp->r
1cf40 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72  hs[i]->index,i-r
1cf50 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20  p->nrhs+1);.    
1cf60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75  }.  }..  /* If u
1cf70 6e 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 4c  nable to write L
1cf80 48 53 20 76 61 6c 75 65 73 20 64 69 72 65 63 74  HS values direct
1cf90 6c 79 20 69 6e 74 6f 20 74 68 65 20 73 74 61 63  ly into the stac
1cfa0 6b 2c 20 77 72 69 74 65 20 74 68 65 0a 20 20 2a  k, write the.  *
1cfb0 2a 20 73 61 76 65 64 20 4c 48 53 20 76 61 6c 75  * saved LHS valu
1cfc0 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  e now. */.  if( 
1cfd0 6c 68 73 64 69 72 65 63 74 3d 3d 30 20 29 7b 0a  lhsdirect==0 ){.
1cfe0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1cff0 20 20 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f    yymsp[%d].mino
1d000 72 2e 79 79 25 64 20 3d 20 22 2c 20 30 2c 20 31  r.yy%d = ", 0, 1
1d010 2d 72 70 2d 3e 6e 72 68 73 2c 20 72 70 2d 3e 6c  -rp->nrhs, rp->l
1d020 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  hs->dtnum);.    
1d030 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c  append_str(zLhs,
1d040 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61   0, 0, 0);.    a
1d050 70 70 65 6e 64 5f 73 74 72 28 22 3b 5c 6e 22 2c  ppend_str(";\n",
1d060 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 0, 0);.  }..
1d070 20 20 2f 2a 20 53 75 66 66 69 78 20 63 6f 64 65    /* Suffix code
1d080 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70   generation comp
1d090 6c 65 74 65 20 2a 2f 0a 20 20 63 70 20 3d 20 61  lete */.  cp = a
1d0a0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1d0b0 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20  0);.  if( cp && 
1d0c0 63 70 5b 30 5d 20 29 7b 0a 20 20 20 20 72 70 2d  cp[0] ){.    rp-
1d0d0 3e 63 6f 64 65 53 75 66 66 69 78 20 3d 20 53 74  >codeSuffix = St
1d0e0 72 73 61 66 65 28 63 70 29 3b 0a 20 20 20 20 72  rsafe(cp);.    r
1d0f0 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20  p->noCode = 0;. 
1d100 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1d110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d120 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1d130 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
1d140 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64  rule "rp" is red
1d150 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20  uced.  Write.** 
1d160 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74  the code to "out
1d170 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69  ".  Make sure li
1d180 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f  neno stays up-to
1d190 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54  -date..*/.PRIVAT
1d1a0 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65  E void emit_code
1d1b0 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20  (.  FILE *out,. 
1d1c0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1d1d0 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ,.  struct lemon
1d1e0 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c   *lemp,.  int *l
1d1f0 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20  ineno.){. const 
1d200 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 53  char *cp;.. /* S
1d210 65 74 75 70 20 63 6f 64 65 20 70 72 69 6f 72 20  etup code prior 
1d220 74 6f 20 74 68 65 20 23 6c 69 6e 65 20 64 69 72  to the #line dir
1d230 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20 72  ective */. if( r
1d240 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 26 26  p->codePrefix &&
1d250 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 5b   rp->codePrefix[
1d260 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66  0] ){.   fprintf
1d270 28 6f 75 74 2c 20 22 7b 25 73 22 2c 20 72 70 2d  (out, "{%s", rp-
1d280 3e 63 6f 64 65 50 72 65 66 69 78 29 3b 0a 20 20  >codePrefix);.  
1d290 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1d2a0 50 72 65 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Prefix; *cp; cp+
1d2b0 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1d2c0 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1d2d0 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72   }. }.. /* Gener
1d2e0 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  ate code to do t
1d2f0 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
1d300 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
1d310 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c 65 6d  e ){.   if( !lem
1d320 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1d330 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1d340 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1d350 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e  linedir(out,rp->
1d360 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
1d370 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20 66 70  ame);.   }.   fp
1d380 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c  rintf(out,"{%s",
1d390 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f  rp->code);.   fo
1d3a0 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
1d3b0 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1d3c0 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1d3d0 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 66 70 72  eno)++; }.   fpr
1d3e0 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
1d3f0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1d400 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if( !lemp->noli
1d410 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20  nenosflag ){.   
1d420 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
1d430 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72      tplt_linedir
1d440 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1d450 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
1d460 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  }. }.. /* Genera
1d470 74 65 20 62 72 65 61 6b 64 6f 77 6e 20 63 6f 64  te breakdown cod
1d480 65 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66  e that occurs af
1d490 74 65 72 20 74 68 65 20 23 6c 69 6e 65 20 64 69  ter the #line di
1d4a0 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20  rective */. if( 
1d4b0 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 26  rp->codeSuffix &
1d4c0 26 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  & rp->codeSuffix
1d4d0 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74  [0] ){.   fprint
1d4e0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 72 70 2d  f(out, "%s", rp-
1d4f0 3e 63 6f 64 65 53 75 66 66 69 78 29 3b 0a 20 20  >codeSuffix);.  
1d500 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1d510 53 75 66 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Suffix; *cp; cp+
1d520 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1d530 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1d540 20 7d 0a 20 7d 0a 0a 20 69 66 28 20 72 70 2d 3e   }. }.. if( rp->
1d550 63 6f 64 65 50 72 65 66 69 78 20 29 7b 0a 20 20  codePrefix ){.  
1d560 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1d570 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1d580 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75 72 6e 3b 0a  +;. }.. return;.
1d590 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
1d5a0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1d5b0 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20   the union used 
1d5c0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73  for the parser's
1d5d0 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20   data stack..** 
1d5e0 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61  This union conta
1d5f0 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65  ins fields for e
1d600 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61  very possible da
1d610 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65  ta type for toke
1d620 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72  ns.** and nonter
1d630 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20  minals.  In the 
1d640 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75  process of compu
1d650 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e  ting and printin
1d660 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c  g this.** union,
1d670 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e   also set the ".
1d680 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
1d690 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61  every terminal a
1d6a0 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a  nd nonterminal.*
1d6b0 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69  * symbol..*/.voi
1d6c0 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e  d print_stack_un
1d6d0 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ion(.  FILE *out
1d6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d6f0 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
1d700 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72   stream */.  str
1d710 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1d720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d730 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74  main info struct
1d740 75 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72  ure for this par
1d750 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c  ser */.  int *pl
1d760 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  ineno,          
1d770 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d780 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  to the line numb
1d790 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c  er */.  int mhfl
1d7a0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
1d7b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67      /* True if g
1d7c0 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65  enerating makehe
1d7d0 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a  aders output */.
1d7e0 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  ){.  int lineno 
1d7f0 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f  = *plineno;    /
1d800 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  * The line numbe
1d810 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  r of the output 
1d820 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65  */.  char **type
1d830 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1d840 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f  * A hash table o
1d850 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20  f datatypes */. 
1d860 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20   int arraysize; 
1d870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d880 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73  ze of the "types
1d890 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  " array */.  int
1d8a0 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20   maxdtlength;   
1d8b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1d8c0 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20  m length of any 
1d8d0 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c  ".datatype" fiel
1d8e0 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  d. */.  char *st
1d8f0 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddt;            
1d900 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65    /* Standardize
1d910 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74  d name for a dat
1d920 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  atype */.  int i
1d930 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ,j;             
1d940 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d950 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67  nters */.  unsig
1d960 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20 20 20  ned hash;       
1d970 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68       /* For hash
1d980 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1d990 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73  a type */.  cons
1d9a0 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20  t char *name;   
1d9b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d9c0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a   the parser */..
1d9d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
1d9e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70  d initialize typ
1d9f0 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74  es[] and allocat
1da00 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61  e stddt[] */.  a
1da10 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d  rraysize = lemp-
1da20 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20  >nsymbol * 2;.  
1da30 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  types = (char**)
1da40 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a  calloc( arraysiz
1da50 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  e, sizeof(char*)
1da60 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
1da70 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1da80 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
1da90 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
1daa0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1dab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1dac0 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
1dad0 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
1dae0 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
1daf0 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
1db00 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
1db10 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  gth = lemonStrle
1db20 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29  n(lemp->vartype)
1db30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1db40 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1db50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1db60 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20  len;.    struct 
1db70 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1db80 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1db90 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74     if( sp->datat
1dba0 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ype==0 ) continu
1dbb0 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  e;.    len = lem
1dbc0 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74  onStrlen(sp->dat
1dbd0 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  atype);.    if( 
1dbe0 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20  len>maxdtlength 
1dbf0 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20  ) maxdtlength = 
1dc00 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74  len;.  }.  stddt
1dc10 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1dc20 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20  ( maxdtlength*2 
1dc30 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74 64  + 1 );.  if( std
1dc40 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  dt==0 ){.    fpr
1dc50 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
1dc60 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
1dc70 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1dc80 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20  }..  /* Build a 
1dc90 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
1dca0 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64  tatypes. The ".d
1dcb0 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
1dcc0 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20  ach symbol.  ** 
1dcd0 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
1dce0 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78  h the hash index
1dcf0 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74   plus 1.  A ".dt
1dd00 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20  num" value of 0 
1dd10 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  is.  ** used for
1dd20 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
1dd30 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
1dd40 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65  no %default_type
1dd50 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20   defined then.  
1dd60 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65  ** 0 is also use
1dd70 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20  d as the .dtnum 
1dd80 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72  value for nonter
1dd90 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20  minals which do 
1dda0 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a  not specify.  **
1ddb0 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e   a datatype usin
1ddc0 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65  g the %type dire
1ddd0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ctive..  */.  fo
1dde0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1ddf0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1de00 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1de10 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1de20 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72  ols[i];.    char
1de30 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70   *cp;.    if( sp
1de40 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  ==lemp->errsym )
1de50 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
1de60 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b  m = arraysize+1;
1de70 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1de80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1de90 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d  p->type!=NONTERM
1dea0 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74  INAL || (sp->dat
1deb0 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70  atype==0 && lemp
1dec0 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b  ->vartype==0) ){
1ded0 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1dee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
1def0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1df00 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70  cp = sp->datatyp
1df10 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30  e;.    if( cp==0
1df20 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61   ) cp = lemp->va
1df30 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30  rtype;.    j = 0
1df40 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 53 53  ;.    while( ISS
1df50 50 41 43 45 28 2a 63 70 29 20 29 20 63 70 2b 2b  PACE(*cp) ) cp++
1df60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70  ;.    while( *cp
1df70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20   ) stddt[j++] = 
1df80 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  *cp++;.    while
1df90 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41 43 45  ( j>0 && ISSPACE
1dfa0 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a  (stddt[j-1]) ) j
1dfb0 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d  --;.    stddt[j]
1dfc0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 65   = 0;.    if( le
1dfd0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26  mp->tokentype &&
1dfe0 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20 6c   strcmp(stddt, l
1dff0 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d  emp->tokentype)=
1e000 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1e010 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
1e020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1e030 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20  .    hash = 0;. 
1e040 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64     for(j=0; stdd
1e050 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
1e060 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33    hash = hash*53
1e070 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20   + stddt[j];.   
1e080 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68   }.    hash = (h
1e090 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66  ash & 0x7fffffff
1e0a0 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20  )%arraysize;.   
1e0b0 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61   while( types[ha
1e0c0 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sh] ){.      if(
1e0d0 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61   strcmp(types[ha
1e0e0 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b  sh],stddt)==0 ){
1e0f0 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  .        sp->dtn
1e100 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
1e110 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e120 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68      }.      hash
1e130 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  ++;.      if( ha
1e140 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29 61 72  sh>=(unsigned)ar
1e150 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d  raysize ) hash =
1e160 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1e170 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
1e180 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1e190 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a  num = hash + 1;.
1e1a0 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68        types[hash
1e1b0 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  ] = (char*)mallo
1e1c0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73  c( lemonStrlen(s
1e1d0 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
1e1e0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
1e1f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1e200 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1e210 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1e220 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
1e230 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1e240 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 74    lemon_strcpy(t
1e250 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1e260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e270 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65  /* Print out the
1e280 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59   definition of Y
1e290 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59  YTOKENTYPE and Y
1e2a0 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20  YMINORTYPE */.  
1e2b0 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
1e2c0 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
1e2d0 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65   "Parse";.  line
1e2e0 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20  no = *plineno;. 
1e2f0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
1e300 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1e310 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1e320 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72  ineno++; }.  fpr
1e330 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e340 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73  e %sTOKENTYPE %s
1e350 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65  \n",name,.    le
1e360 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65  mp->tokentype?le
1e370 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76  mp->tokentype:"v
1e380 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  oid*");  lineno+
1e390 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1e3a0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1e3b0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1e3c0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
1e3d0 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75  f(out,"typedef u
1e3e0 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  nion {\n"); line
1e3f0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1e400 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e 69  out,"  int yyini
1e410 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t;\n"); lineno++
1e420 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1e430 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79  "  %sTOKENTYPE y
1e440 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  y0;\n",name); li
1e450 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1e460 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20  0; i<arraysize; 
1e470 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79  i++){.    if( ty
1e480 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  pes[i]==0 ) cont
1e490 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1e4a0 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64  f(out,"  %s yy%d
1e4b0 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b  ;\n",types[i],i+
1e4c0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1e4d0 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29    free(types[i])
1e4e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  ;.  }.  if( lemp
1e4f0 2d 3e 65 72 72 73 79 6d 20 26 26 20 6c 65 6d 70  ->errsym && lemp
1e500 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1e510 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1e520 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b  out,"  int yy%d;
1e530 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1e540 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1e550 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73  ++;.  }.  free(s
1e560 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79  tddt);.  free(ty
1e570 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  pes);.  fprintf(
1e580 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59  out,"} YYMINORTY
1e590 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PE;\n"); lineno+
1e5a0 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20  +;.  *plineno = 
1e5b0 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lineno;.}../*.**
1e5c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1e5d0 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65   of a C datatype
1e5e0 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65   able to represe
1e5f0 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  nt values betwee
1e600 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72  n.** lwr and upr
1e610 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 49 66  , inclusive.  If
1e620 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20 74 68   pnByte!=NULL th
1e630 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  en also write th
1e640 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20  e sizeof.** for 
1e650 74 68 61 74 20 74 79 70 65 20 28 31 2c 20 32 2c  that type (1, 2,
1e660 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70 6e 42   or 4) into *pnB
1e670 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  yte..*/.static c
1e680 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1e690 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1e6a0 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69   lwr, int upr, i
1e6b0 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 63  nt *pnByte){.  c
1e6c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1e6d0 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e 74 20   = "int";.  int 
1e6e0 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28  nByte = 4;.  if(
1e6f0 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69   lwr>=0 ){.    i
1e700 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20  f( upr<=255 ){. 
1e710 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1e720 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1e730 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20      nByte = 1;. 
1e740 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72     }else if( upr
1e750 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20  <65535 ){.      
1e760 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1e770 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20  d short int";.  
1e780 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20      nByte = 2;. 
1e790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e7a0 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1e7b0 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42  d int";.      nB
1e7c0 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  yte = 4;.    }. 
1e7d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1e7e0 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
1e7f0 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
1e800 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
1e810 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20     nByte = 1;.  
1e820 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1e830 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
1e840 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  67 ){.    zType 
1e850 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20 20 6e  = "short";.    n
1e860 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a 20 20  Byte = 2;.  }.  
1e870 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
1e880 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Byte = nByte;.  
1e890 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
1e8a0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74  ./*.** Each stat
1e8b0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74  e contains a set
1e8c0 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61   of token transa
1e8d0 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20  ction and a set 
1e8e0 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61  of.** nontermina
1e8f0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  l transactions. 
1e900 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73   Each of these s
1e910 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73  ets makes an ins
1e920 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
1e930 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1e940 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f  ure.  An array o
1e950 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
1e960 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  es is used.** to
1e970 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74   order the creat
1e980 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ion of entries i
1e990 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  n the yy_action[
1e9a0 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  ] table..*/.stru
1e9b0 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72  ct axset {.  str
1e9c0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1e9d0 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74    /* A pointer t
1e9e0 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  o a state */.  i
1e9f0 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20  nt isTkn;       
1ea00 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
1ea10 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73  se tokens.  Fals
1ea20 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e  e for non-termin
1ea30 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  als */.  int nAc
1ea40 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  tion;         /*
1ea50 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
1ea60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64  ns */.  int iOrd
1ea70 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
1ea80 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f  Original order o
1ea90 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f  f action sets */
1eaa0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .};../*.** Compa
1eab0 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75  re to axset stru
1eac0 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69  ctures for sorti
1ead0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
1eae0 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f  tatic int axset_
1eaf0 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  compare(const vo
1eb00 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1eb10 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20  d *b){.  struct 
1eb20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72  axset *p1 = (str
1eb30 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20  uct axset*)a;.  
1eb40 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32  struct axset *p2
1eb50 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1eb60 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *)b;.  int c;.  
1eb70 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20  c = p2->nAction 
1eb80 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20  - p1->nAction;. 
1eb90 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1eba0 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65 72 20   c = p1->iOrder 
1ebb0 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a 20 20  - p2->iOrder;.  
1ebc0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d 30  }.  assert( c!=0
1ebd0 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20   || p1==p2 );.  
1ebe0 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
1ebf0 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e  ** Write text on
1ec00 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63   "out" that desc
1ec10 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22  ribes the rule "
1ec20 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rp"..*/.static v
1ec30 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78  oid writeRuleTex
1ec40 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72  t(FILE *out, str
1ec50 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
1ec60 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74   int j;.  fprint
1ec70 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20  f(out,"%s ::=", 
1ec80 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
1ec90 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
1eca0 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nrhs; j++){.   
1ecb0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1ecc0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b  sp = rp->rhs[j];
1ecd0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
1ece0 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
1ecf0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1ed00 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
1ed10 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  >name);.    }els
1ed20 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  e{.      int k;.
1ed30 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1ed40 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62  t," %s", sp->sub
1ed50 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[0]->name);. 
1ed60 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1ed70 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
1ed80 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ed90 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d  tf(out,"|%s",sp-
1eda0 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65  >subsym[k]->name
1edb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1edc0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1edd0 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f  rate C source co
1ede0 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
1edf0 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1ee00 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20  Table(.  struct 
1ee10 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69  lemon *lemp,.  i
1ee20 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a  nt mhflag     /*
1ee30 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68   Output in makeh
1ee40 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66  eaders format if
1ee50 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49   true */.){.  FI
1ee60 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20  LE *out, *in;.  
1ee70 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
1ee80 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65  ZE];.  int  line
1ee90 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  no;.  struct sta
1eea0 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
1eeb0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
1eec0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1eed0 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62  .  struct acttab
1eee0 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74   *pActtab;.  int
1eef0 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20   i, j, n, sz;.  
1ef00 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79 70 65  int szActionType
1ef10 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28  ;     /* sizeof(
1ef20 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20 2a 2f  YYACTIONTYPE) */
1ef30 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54 79 70  .  int szCodeTyp
1ef40 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65  e;       /* size
1ef50 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29 20 20  of(YYCODETYPE)  
1ef60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1ef70 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e   *name;.  int mn
1ef80 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66  TknOfst, mxTknOf
1ef90 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66  st;.  int mnNtOf
1efa0 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20  st, mxNtOfst;.  
1efb0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78  struct axset *ax
1efc0 3b 0a 0a 20 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68  ;..  lemp->minSh
1efd0 69 66 74 52 65 64 75 63 65 20 3d 20 6c 65 6d 70  iftReduce = lemp
1efe0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70  ->nstate;.  lemp
1eff0 2d 3e 65 72 72 41 63 74 69 6f 6e 20 3d 20 6c 65  ->errAction = le
1f000 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64 75  mp->minShiftRedu
1f010 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  ce + lemp->nrule
1f020 3b 0a 20 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74  ;.  lemp->accAct
1f030 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41  ion = lemp->errA
1f040 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d  ction + 1;.  lem
1f050 70 2d 3e 6e 6f 41 63 74 69 6f 6e 20 3d 20 6c 65  p->noAction = le
1f060 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 20 2b 20  mp->accAction + 
1f070 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65  1;.  lemp->minRe
1f080 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e 6f 41  duce = lemp->noA
1f090 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d  ction + 1;.  lem
1f0a0 70 2d 3e 6d 61 78 41 63 74 69 6f 6e 20 3d 20 6c  p->maxAction = l
1f0b0 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b  emp->minReduce +
1f0c0 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 0a 20   lemp->nrule;.. 
1f0d0 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
1f0e0 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
1f0f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
1f100 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1f110 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
1f120 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
1f130 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1f140 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1f150 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
1f160 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1f170 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1f180 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1f190 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
1f1a0 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
1f1b0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1f1c0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
1f1d0 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lude,&lineno);. 
1f1e0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1f1f0 20 20 20 63 68 61 72 20 2a 69 6e 63 4e 61 6d 65     char *incName
1f200 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
1f210 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
1f220 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f230 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
1f240 22 2c 20 69 6e 63 4e 61 6d 65 29 3b 20 6c 69 6e  ", incName); lin
1f250 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
1f260 69 6e 63 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  incName);.  }.  
1f270 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1f280 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1f290 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1f2a0 72 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f  rate #defines fo
1f2b0 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a  r all tokens */.
1f2c0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1f2d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f2e0 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69  prefix;.    fpri
1f2f0 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1f300 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1f310 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65  no++;.    if( le
1f320 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1f330 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1f340 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1f350 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1f360 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1f370 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1f380 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1f390 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1f3a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f3b0 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1f3c0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1f3d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1f3e0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c  name,i);.      l
1f3f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1f400 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f410 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1f420 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1f430 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1f440 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1f450 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1f460 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a   the defines */.
1f470 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f480 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50  define YYCODETYP
1f490 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e  E %s\n",.    min
1f4a0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30  imum_size_type(0
1f4b0 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c  , lemp->nsymbol,
1f4c0 20 26 73 7a 43 6f 64 65 54 79 70 65 29 29 3b 20   &szCodeType)); 
1f4d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1f4e0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1f4f0 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c   YYNOCODE %d\n",
1f500 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 29 3b 20  lemp->nsymbol); 
1f510 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f520 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f530 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25  e YYACTIONTYPE %
1f540 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75  s\n",.    minimu
1f550 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65  m_size_type(0,le
1f560 6d 70 2d 3e 6d 61 78 41 63 74 69 6f 6e 2c 26 73  mp->maxAction,&s
1f570 7a 41 63 74 69 6f 6e 54 79 70 65 29 29 3b 20 6c  zActionType)); l
1f580 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c  ineno++;.  if( l
1f590 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b  emp->wildcard ){
1f5a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f5b0 2c 22 23 64 65 66 69 6e 65 20 59 59 57 49 4c 44  ,"#define YYWILD
1f5c0 43 41 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20  CARD %d\n",.    
1f5d0 20 20 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72     lemp->wildcar
1f5e0 64 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  d->index); linen
1f5f0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74  o++;.  }.  print
1f600 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74  _stack_union(out
1f610 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68  ,lemp,&lineno,mh
1f620 66 6c 61 67 29 3b 0a 20 20 66 70 72 69 6e 74 66  flag);.  fprintf
1f630 28 6f 75 74 2c 20 22 23 69 66 6e 64 65 66 20 59  (out, "#ifndef Y
1f640 59 53 54 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b  YSTACKDEPTH\n");
1f650 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1f660 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
1f670 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1f680 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
1f690 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c  TACKDEPTH %s\n",
1f6a0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
1f6b0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1f6c0 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
1f6d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1f6e0 59 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c  YSTACKDEPTH 100\
1f6f0 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
1f700 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1f710 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  t, "#endif\n"); 
1f720 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1f730 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
1f740 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
1f750 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
1f760 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61  neno++;.  }.  na
1f770 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
1f780 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
1f790 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65  Parse";.  if( le
1f7a0 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d  mp->arg && lemp-
1f7b0 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >arg[0] ){.    i
1f7c0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
1f7d0 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77  emp->arg);.    w
1f7e0 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 49 53  hile( i>=1 && IS
1f7f0 53 50 41 43 45 28 6c 65 6d 70 2d 3e 61 72 67 5b  SPACE(lemp->arg[
1f800 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
1f810 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1f820 28 49 53 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 61  (ISALNUM(lemp->a
1f830 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  rg[i-1]) || lemp
1f840 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->arg[i-1]=='_')
1f850 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
1f860 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1f870 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b   %sARG_SDECL %s;
1f880 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1f890 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1f8a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f8b0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50  "#define %sARG_P
1f8c0 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
1f8d0 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1f8e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1f8f0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1f900 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20   %sARG_FETCH %s 
1f910 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c  = yypParser->%s\
1f920 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f930 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e       name,lemp->
1f940 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  arg,&lemp->arg[i
1f950 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1f960 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f970 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
1f980 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25  ORE yypParser->%
1f990 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  s = %s\n",.     
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
1f9b0 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26  ,&lemp->arg[i],&
1f9c0 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1f9d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1f9e0 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1f9f0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1fa00 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_SDECL\n",name)
1fa10 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1fa20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1fa30 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1fa40 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e  L\n",name);  lin
1fa50 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1fa60 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1fa70 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e  %sARG_FETCH\n",n
1fa80 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1fa90 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1faa0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1fab0 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  TORE\n",name); l
1fac0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1fad0 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1fae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
1faf0 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1fb00 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1fb10 6d 70 2d 3e 65 72 72 73 79 6d 20 26 26 20 6c 65  mp->errsym && le
1fb20 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1fb30 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1fb40 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1fb50 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c  YERRORSYMBOL %d\
1fb60 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1fb70 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1fb80 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1fb90 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1fba0 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c  RSYMDT yy%d\n",l
1fbb0 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
1fbc0 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  um); lineno++;. 
1fbd0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68   }.  if( lemp->h
1fbe0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1fbf0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1fc00 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
1fc10 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
1fc20 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  o++;.  }..  /* C
1fc30 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f  ompute the actio
1fc40 6e 20 74 61 62 6c 65 2c 20 62 75 74 20 64 6f 20  n table, but do 
1fc50 6e 6f 74 20 6f 75 74 70 75 74 20 69 74 20 79 65  not output it ye
1fc60 74 2e 20 20 54 68 65 20 61 63 74 69 6f 6e 0a 20  t.  The action. 
1fc70 20 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20 62   ** table must b
1fc80 65 20 63 6f 6d 70 75 74 65 64 20 62 65 66 6f 72  e computed befor
1fc90 65 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  e generating the
1fca0 20 59 59 4e 53 54 41 54 45 20 6d 61 63 72 6f 20   YYNSTATE macro 
1fcb0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 77 65 20  because.  ** we 
1fcc0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 68 6f 77  need to know how
1fcd0 20 6d 61 6e 79 20 73 74 61 74 65 73 20 63 61 6e   many states can
1fce0 20 62 65 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   be eliminated..
1fcf0 20 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74 72    */.  ax = (str
1fd00 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61 6c  uct axset *) cal
1fd10 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  loc(lemp->nxstat
1fd20 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1fd30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30  ]));.  if( ax==0
1fd40 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1fd50 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
1fd60 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65  ailed\n");.    e
1fd70 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f  xit(1);.  }.  fo
1fd80 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1fd90 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  xstate; i++){.  
1fda0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1fdb0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b  rted[i];.    ax[
1fdc0 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  i*2].stp = stp;.
1fdd0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b      ax[i*2].isTk
1fde0 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a  n = 1;.    ax[i*
1fdf0 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70  2].nAction = stp
1fe00 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61  ->nTknAct;.    a
1fe10 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73  x[i*2+1].stp = s
1fe20 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  tp;.    ax[i*2+1
1fe30 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20  ].isTkn = 0;.   
1fe40 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69   ax[i*2+1].nActi
1fe50 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74  on = stp->nNtAct
1fe60 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73  ;.  }.  mxTknOfs
1fe70 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20  t = mnTknOfst = 
1fe80 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20  0;.  mxNtOfst = 
1fe90 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 20 20  mnNtOfst = 0;.  
1fea0 2f 2a 20 49 6e 20 61 6e 20 65 66 66 6f 72 74 20  /* In an effort 
1feb0 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
1fec0 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 73 69 7a  action table siz
1fed0 65 2c 20 75 73 65 20 74 68 65 20 68 65 75 72 69  e, use the heuri
1fee0 73 74 69 63 0a 20 20 2a 2a 20 6f 66 20 70 6c 61  stic.  ** of pla
1fef0 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73 74  cing the largest
1ff00 20 61 63 74 69 6f 6e 20 73 65 74 73 20 66 69 72   action sets fir
1ff10 73 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  st */.  for(i=0;
1ff20 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
1ff30 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e 69  *2; i++) ax[i].i
1ff40 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71 73 6f  Order = i;.  qso
1ff50 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78 73  rt(ax, lemp->nxs
1ff60 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61  tate*2, sizeof(a
1ff70 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d  x[0]), axset_com
1ff80 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62  pare);.  pActtab
1ff90 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28   = acttab_alloc(
1ffa0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2c 20 6c  lemp->nsymbol, l
1ffb0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29 3b  emp->nterminal);
1ffc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1ffd0 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26 26  mp->nxstate*2 &&
1ffe0 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30   ax[i].nAction>0
1fff0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
20000 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20  = ax[i].stp;.   
20010 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e   if( ax[i].isTkn
20020 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70   ){.      for(ap
20030 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
20040 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
20050 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
20060 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
20070 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d  sp->index>=lemp-
20080 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
20090 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
200a0 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
200b0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
200c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
200d0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
200e0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
200f0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
20100 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
20110 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
20120 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b  }.      stp->iTk
20130 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  nOfst = acttab_i
20140 6e 73 65 72 74 28 70 41 63 74 74 61 62 2c 20 31  nsert(pActtab, 1
20150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
20160 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
20170 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
20180 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
20190 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
201a0 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
201b0 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
201c0 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
201d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
201e0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
201f0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
20200 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
20210 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
20220 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
20230 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
20240 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
20250 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
20260 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
20270 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
20280 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
20290 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
202a0 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
202b0 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
202c0 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
202d0 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
202e0 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
202f0 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
20300 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
20310 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
20320 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
20330 28 70 41 63 74 74 61 62 2c 20 30 29 3b 0a 20 20  (pActtab, 0);.  
20340 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
20350 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20  Ofst<mnNtOfst ) 
20360 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mnNtOfst = stp->
20370 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69  iNtOfst;.      i
20380 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e  f( stp->iNtOfst>
20390 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f  mxNtOfst ) mxNtO
203a0 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66  fst = stp->iNtOf
203b0 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30 20  st;.    }.#if 0 
203c0 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20 66 6f   /* Uncomment fo
203d0 72 20 61 20 74 72 61 63 65 20 6f 66 20 68 6f 77  r a trace of how
203e0 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
203f0 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f 75 74   table fills out
20400 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20 6a 6a   */.    { int jj
20410 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  , nn;.      for(
20420 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63 74  jj=nn=0; jj<pAct
20430 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 6a  tab->nAction; jj
20440 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
20450 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74 69 6f   pActtab->aActio
20460 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20 29  n[jj].action<0 )
20470 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   nn++;.      }. 
20480 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34 64       printf("%4d
20490 3a 20 53 74 61 74 65 20 25 33 64 20 25 73 20 6e  : State %3d %s n
204a0 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35 64 20  : %2d size: %5d 
204b0 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c 6e 22  freespace: %d\n"
204c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
204d0 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 2c  , stp->statenum,
204e0 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20 22   ax[i].isTkn ? "
204f0 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20 20 22  Token" : "Var  "
20500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  ,.             a
20510 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70 41  x[i].nAction, pA
20520 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c 20  cttab->nAction, 
20530 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  nn);.    }.#endi
20540 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29  f.  }.  free(ax)
20550 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72 75 6c  ;..  /* Mark rul
20560 65 73 20 74 68 61 74 20 61 72 65 20 61 63 74 75  es that are actu
20570 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20 72 65  ally used for re
20580 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61 66 74  duce actions aft
20590 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74 69  er all.  ** opti
205a0 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65 20 62  mizations have b
205b0 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20 2a 2f  een applied.  */
205c0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
205d0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
205e0 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65 73 52  >next) rp->doesR
205f0 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41  educe = LEMON_FA
20600 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  LSE;.  for(i=0; 
20610 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  i<lemp->nxstate;
20620 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 61   i++){.    for(a
20630 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
20640 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  ]->ap; ap; ap=ap
20650 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
20660 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
20670 55 43 45 20 7c 7c 20 61 70 2d 3e 74 79 70 65 3d  UCE || ap->type=
20680 3d 53 48 49 46 54 52 45 44 55 43 45 20 29 7b 0a  =SHIFTREDUCE ){.
20690 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e 72 70          ap->x.rp
206a0 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d 20 31  ->doesReduce = 1
206b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
206c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68    }..  /* Finish
206d0 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65 20 63   rendering the c
206e0 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20 74 68 61  onstants now tha
206f0 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  t the action tab
20700 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  le has.  ** been
20710 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 66   computed */.  f
20720 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20730 69 6e 65 20 59 59 4e 53 54 41 54 45 20 20 20 20  ine YYNSTATE    
20740 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c           %d\n",l
20750 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29 3b 20 20  emp->nxstate);  
20760 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
20770 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20780 20 59 59 4e 52 55 4c 45 20 20 20 20 20 20 20 20   YYNRULE        
20790 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70        %d\n",lemp
207a0 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e  ->nrule);  linen
207b0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
207c0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 54  ut,"#define YYNT
207d0 4f 4b 45 4e 20 20 20 20 20 20 20 20 20 20 20 20  OKEN            
207e0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 74 65   %d\n",lemp->nte
207f0 72 6d 69 6e 61 6c 29 3b 20 6c 69 6e 65 6e 6f 2b  rminal); lineno+
20800 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
20810 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58  ,"#define YY_MAX
20820 5f 53 48 49 46 54 20 20 20 20 20 20 20 20 20 25  _SHIFT         %
20830 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61  d\n",lemp->nxsta
20840 74 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  te-1); lineno++;
20850 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e  .  i = lemp->min
20860 53 68 69 66 74 52 65 64 75 63 65 3b 0a 20 20 66  ShiftReduce;.  f
20870 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20880 69 6e 65 20 59 59 5f 4d 49 4e 5f 53 48 49 46 54  ine YY_MIN_SHIFT
20890 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 69  REDUCE   %d\n",i
208a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
208b0 20 2b 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b   += lemp->nrule;
208c0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
208d0 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53  #define YY_MAX_S
208e0 48 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c  HIFTREDUCE   %d\
208f0 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", i-1); lineno
20900 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
20910 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 45 52  t,"#define YY_ER
20920 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  ROR_ACTION      
20930 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 65 72 72  %d\n", lemp->err
20940 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b  Action); lineno+
20950 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
20960 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 43  ,"#define YY_ACC
20970 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20 25  EPT_ACTION     %
20980 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 61 63 63 41  d\n", lemp->accA
20990 63 74 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ction); lineno++
209a0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
209b0 22 23 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41  "#define YY_NO_A
209c0 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64  CTION         %d
209d0 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74  \n", lemp->noAct
209e0 69 6f 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ion); lineno++;.
209f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
20a00 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 52 45  define YY_MIN_RE
20a10 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e  DUCE        %d\n
20a20 22 2c 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75  ", lemp->minRedu
20a30 63 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ce); lineno++;. 
20a40 20 69 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65   i = lemp->minRe
20a50 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  duce + lemp->nru
20a60 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  le;.  fprintf(ou
20a70 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41  t,"#define YY_MA
20a80 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  X_REDUCE        
20a90 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e  %d\n", i-1); lin
20aa0 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
20ab0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
20ac0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
20ad0 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70 75 74 20    /* Now output 
20ae0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
20af0 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
20b00 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  tes:.  **.  **  
20b10 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20  yy_action[]     
20b20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c     A single tabl
20b30 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
20b40 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20   actions..  **  
20b50 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20  yy_lookahead[]  
20b60 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61     A table conta
20b70 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68  ining the lookah
20b80 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74  ead for each ent
20b90 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ry in.  **      
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
20bb0 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20  y_action.  Used 
20bc0 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63  to detect hash c
20bd0 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20  ollisions..  ** 
20be0 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
20bf0 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61      For each sta
20c00 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
20c10 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
20c20 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
20c30 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
20c40 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20  ing terminals.. 
20c50 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f   **  yy_reduce_o
20c60 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68  fst[]   For each
20c70 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
20c80 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
20c90 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20cb0 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d  hifting non-term
20cc0 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65  inals after a re
20cd0 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64  duce..  **  yy_d
20ce0 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
20cf0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
20d00 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20  r each state..  
20d10 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  */..  /* Output 
20d20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  the yy_action ta
20d30 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e  ble */.  lemp->n
20d40 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e 20 3d 20  actiontab = n = 
20d50 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73 69  acttab_action_si
20d60 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 6c  ze(pActtab);.  l
20d70 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
20d80 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65  = n*szActionType
20d90 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
20da0 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54 54  "#define YY_ACTT
20db0 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22  AB_COUNT (%d)\n"
20dc0 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  , n); lineno++;.
20dd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
20de0 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43  tatic const YYAC
20df0 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69  TIONTYPE yy_acti
20e00 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  on[] = {\n"); li
20e10 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
20e20 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
20e30 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d      int action =
20e40 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
20e50 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20  (pActtab, i);.  
20e60 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
20e70 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e   action = lemp->
20e80 6e 6f 41 63 74 69 6f 6e 3b 0a 20 20 20 20 69 66  noAction;.    if
20e90 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
20ea0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
20eb0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
20ec0 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
20ed0 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69  , action);.    i
20ee0 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
20ef0 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
20f00 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
20f10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
20f20 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
20f30 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
20f40 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
20f50 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
20f60 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
20f70 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b  tput the yy_look
20f80 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ahead table */. 
20f90 20 6c 65 6d 70 2d 3e 6e 6c 6f 6f 6b 61 68 65 61   lemp->nlookahea
20fa0 64 74 61 62 20 3d 20 6e 20 3d 20 61 63 74 74 61  dtab = n = actta
20fb0 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a 65  b_lookahead_size
20fc0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d  (pActtab);.  lem
20fd0 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20  p->tablesize += 
20fe0 6e 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20  n*szCodeType;.  
20ff0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61  fprintf(out,"sta
21000 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45  tic const YYCODE
21010 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61  TYPE yy_lookahea
21020 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  d[] = {\n"); lin
21030 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  eno++;.  for(i=j
21040 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
21050 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74     int la = actt
21060 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70  ab_yylookahead(p
21070 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
21080 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20  if( la<0 ) la = 
21090 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20  lemp->nsymbol;. 
210a0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
210b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
210c0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
210d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
210e0 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20  %4d,", la);.    
210f0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
21100 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
21110 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
21120 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
21130 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
21140 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
21150 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
21160 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
21170 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
21180 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68 69  utput the yy_shi
21190 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ft_ofst[] table 
211a0 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  */.  n = lemp->n
211b0 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  xstate;.  while(
211c0 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
211d0 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
211e0 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
211f0 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
21200 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
21210 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20 20 20  _SHIFT_COUNT    
21220 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
21230 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
21240 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
21250 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20   YY_SHIFT_MIN   
21260 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b     (%d)\n", mnTk
21270 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
21280 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21290 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
212a0 46 54 5f 4d 41 58 20 20 20 20 20 20 28 25 64 29  FT_MAX      (%d)
212b0 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b  \n", mxTknOfst);
212c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
212d0 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
212e0 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68  c const %s yy_sh
212f0 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e  ift_ofst[] = {\n
21300 22 2c 0a 20 20 20 20 20 20 20 6d 69 6e 69 6d 75  ",.       minimu
21310 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b  m_size_type(mnTk
21320 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e 74 65  nOfst, lemp->nte
21330 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e 61 63  rminal+lemp->nac
21340 74 69 6f 6e 74 61 62 2c 20 26 73 7a 29 29 3b 0a  tiontab, &sz));.
21350 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b         lineno++;
21360 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
21370 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f  ze += n*sz;.  fo
21380 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
21390 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
213a0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
213b0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
213c0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
213d0 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
213e0 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
213f0 20 6f 66 73 74 20 3d 20 6c 65 6d 70 2d 3e 6e 61   ofst = lemp->na
21400 63 74 69 6f 6e 74 61 62 3b 0a 20 20 20 20 69 66  ctiontab;.    if
21410 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
21420 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
21430 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
21440 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
21450 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
21460 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
21470 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
21480 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
21490 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
214a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
214b0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
214c0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
214d0 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
214e0 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
214f0 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63 65  ut the yy_reduce
21500 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
21510 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
21520 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
21530 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
21540 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74  ed[n-1]->iNtOfst
21550 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d  ==NO_OFFSET ) n-
21560 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  -;.  fprintf(out
21570 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
21580 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c  DUCE_COUNT (%d)\
21590 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
215a0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
215b0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
215c0 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29  EDUCE_MIN   (%d)
215d0 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20  \n", mnNtOfst); 
215e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
215f0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
21600 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
21610 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f    (%d)\n", mxNtO
21620 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
21630 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21640 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
21650 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
21660 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20   = {\n",.       
21670 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
21680 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c  type(mnNtOfst-1,
21690 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29   mxNtOfst, &sz))
216a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65  ; lineno++;.  le
216b0 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
216c0 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a   n*sz;.  for(i=j
216d0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
216e0 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20     int ofst;.   
216f0 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
21700 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74  ted[i];.    ofst
21710 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
21720 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
21730 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
21740 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a  = mnNtOfst - 1;.
21750 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
21760 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
21770 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
21780 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21790 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
217a0 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
217b0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
217c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
217d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
217e0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
217f0 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
21800 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
21810 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
21820 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
21830 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65 66  * Output the def
21840 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  ault action tabl
21850 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
21860 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
21870 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
21880 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c  y_default[] = {\
21890 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
218a0 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61   n = lemp->nxsta
218b0 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  te;.  lemp->tabl
218c0 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74  esize += n*szAct
218d0 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28 69  ionType;.  for(i
218e0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
218f0 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
21900 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
21910 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
21920 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
21930 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 69 66  */ ", i);.    if
21940 28 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75  ( stp->iDfltRedu
21950 63 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 70  ce<0 ){.      fp
21960 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
21970 2c 22 2c 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74  ,", lemp->errAct
21980 69 6f 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ion);.    }else{
21990 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
219a0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70  ut, " %4d,", stp
219b0 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 2b 20  ->iDfltReduce + 
219c0 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 29  lemp->minReduce)
219d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
219e0 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
219f0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
21a00 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
21a10 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
21a20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21a30 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
21a40 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
21a50 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
21a60 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
21a70 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
21a80 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
21a90 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
21aa0 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63  table of fallbac
21ab0 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  k tokens..  */. 
21ac0 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
21ad0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69  allback ){.    i
21ae0 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74  nt mx = lemp->nt
21af0 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20  erminal - 1;.   
21b00 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20   while( mx>0 && 
21b10 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78  lemp->symbols[mx
21b20 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  ]->fallback==0 )
21b30 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65  { mx--; }.    le
21b40 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
21b50 20 28 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79   (mx+1)*szCodeTy
21b60 70 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pe;.    for(i=0;
21b70 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20   i<=mx; i++){.  
21b80 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
21b90 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
21ba0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
21bb0 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
21bc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
21bd0 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
21be0 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
21bf0 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
21c00 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
21c10 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
21c20 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
21c30 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
21c40 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
21c50 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
21c60 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
21c70 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
21c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21c90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
21ca0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
21cb0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
21cc0 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
21cd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21ce0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
21cf0 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
21d00 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
21d10 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
21d20 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
21d30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
21d40 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65  mon_sprintf(line
21d50 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d  ,"\"%s\",",lemp-
21d60 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
21d70 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e);.    fprintf(
21d80 6f 75 74 2c 22 20 20 2f 2a 20 25 34 64 20 2a 2f  out,"  /* %4d */
21d90 20 5c 22 25 73 5c 22 2c 5c 6e 22 2c 69 2c 20 6c   \"%s\",\n",i, l
21da0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
21db0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
21dc0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
21dd0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
21de0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
21df0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74   /* Generate a t
21e00 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
21e10 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68  a text string th
21e20 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65  at describes eve
21e30 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20  ry.  ** rule in 
21e40 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20  the rule set of 
21e50 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68  the grammar.  Th
21e60 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
21e70 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e  s used.  ** when
21e80 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20   tracing REDUCE 
21e90 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
21ea0 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70  for(i=0, rp=lemp
21eb0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
21ec0 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  p->next, i++){. 
21ed0 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69     assert( rp->i
21ee0 52 75 6c 65 3d 3d 69 20 29 3b 0a 20 20 20 20 66  Rule==i );.    f
21ef0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
21f00 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a  %3d */ \"", i);.
21f10 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78      writeRuleTex
21f20 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
21f30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c  fprintf(out,"\",
21f40 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
21f50 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
21f60 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
21f70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
21f80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21f90 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65  which executes e
21fa0 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62  very time a symb
21fb0 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ol is popped fro
21fc0 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b  m.  ** the stack
21fd0 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
21fe0 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c  g errors or whil
21ff0 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65  e destroying the
22000 20 70 61 72 73 65 72 2e 0a 20 20 2a 2a 20 28 49   parser..  ** (I
22010 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
22020 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
22030 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
22040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
22050 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
22060 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
22070 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22080 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
22090 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
220a0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
220b0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
220c0 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
220d0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
220e0 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
220f0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  e;.      if( onc
22100 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
22110 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20  intf(out, "     
22120 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73   /* TERMINAL Des
22130 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20  tructor */\n"); 
22140 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
22150 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
22160 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
22170 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
22180 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
22190 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
221a0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
221b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
221c0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
221d0 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d  bol && lemp->sym
221e0 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54  bols[i]->type!=T
221f0 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20  ERMINAL; i++);. 
22200 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e     if( i<lemp->n
22210 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
22220 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
22230 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
22240 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
22250 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66  lineno);.      f
22260 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
22270 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
22280 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
22290 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  }.  if( lemp->va
222a0 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72  rdest ){.    str
222b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74  uct symbol *dflt
222c0 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  _sp = 0;.    int
222d0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
222e0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
222f0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
22300 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
22310 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
22320 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
22330 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
22340 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
22350 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
22360 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
22370 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
22380 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22390 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20    if( once ){.  
223a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
223b0 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66  t, "      /* Def
223c0 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41  ault NON-TERMINA
223d0 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c  L Destructor */\
223e0 6e 22 29 3b 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  n");lineno++;.  
223f0 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
22400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
22410 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
22420 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
22430 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
22440 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
22450 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
22460 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
22470 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
22480 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
22490 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
224a0 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
224b0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d  ,&lineno);.    }
224c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
224d0 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
224e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
224f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
22500 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
22510 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
22520 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
22530 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
22540 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
22550 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
22560 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  L || sp->destruc
22570 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor==0 ) continu
22580 65 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64  e;.    if( sp->d
22590 65 73 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63 6f  estLineno<0 ) co
225a0 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72 65  ntinue;  /* Alre
225b0 61 64 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a 20  ady emitted */. 
225c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
225d0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
225e0 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e  %s */\n", sp->in
225f0 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
22600 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f  lineno++;..    /
22610 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63  * Combine duplic
22620 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20  ate destructors 
22630 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61  into a single ca
22640 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  se */.    for(j=
22650 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79  i+1; j<lemp->nsy
22660 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  mbol; j++){.    
22670 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
22680 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  *sp2 = lemp->sym
22690 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  bols[j];.      i
226a0 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74  f( sp2 && sp2->t
226b0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26  ype!=TERMINAL &&
226c0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
226d0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70  .          && sp
226e0 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74  2->dtnum==sp->dt
226f0 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26  num.          &&
22700 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74   strcmp(sp->dest
22710 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74  ructor,sp2->dest
22720 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20  ructor)==0 ){.  
22730 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
22740 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
22750 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22770 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e  p2->index, sp2->
22780 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
22790 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64  .         sp2->d
227a0 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b 20  estLineno = -1; 
227b0 20 2f 2a 20 41 76 6f 69 64 20 65 6d 69 74 74 69   /* Avoid emitti
227c0 6e 67 20 74 68 69 73 20 64 65 73 74 72 75 63 74  ng this destruct
227d0 6f 72 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  or again */.    
227e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65    }.    }..    e
227f0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
22800 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
22810 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
22820 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
22830 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
22840 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
22850 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
22860 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
22870 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
22880 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
22890 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
228a0 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  tes whenever the
228b0 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76   parser stack ov
228c0 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c  erflows */.  tpl
228d0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
228e0 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c  ,lemp->overflow,
228f0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
22900 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
22910 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
22920 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
22930 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75   the table of ru
22940 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  le information. 
22950 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
22960 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
22970 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
22980 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
22990 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
229a0 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
229b0 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
229c0 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e  r(i=0, rp=lemp->
229d0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
229e0 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  >next, i++){.   
229f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
22a00 7b 20 25 34 64 2c 20 25 34 64 20 7d 2c 20 2f 2a  { %4d, %4d }, /*
22a10 20 28 25 64 29 20 22 2c 72 70 2d 3e 6c 68 73 2d   (%d) ",rp->lhs-
22a20 3e 69 6e 64 65 78 2c 2d 72 70 2d 3e 6e 72 68 73  >index,-rp->nrhs
22a30 2c 69 29 3b 0a 20 20 20 20 72 75 6c 65 5f 70 72  ,i);.    rule_pr
22a40 69 6e 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  int(out, rp);.  
22a50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
22a60 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
22a70 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
22a80 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
22a90 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
22aa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
22ab0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
22ac0 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
22ad0 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
22ae0 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70   i = 0;.  for(rp
22af0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
22b00 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
22b10 20 20 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74     i += translat
22b20 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29  e_code(lemp, rp)
22b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b  ;.  }.  if( i ){
22b40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
22b50 2c 22 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f  ,"        YYMINO
22b60 52 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72  RTYPE yylhsminor
22b70 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
22b80 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20  .  }.  /* First 
22b90 6f 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68  output rules oth
22ba0 65 72 20 74 68 61 6e 20 74 68 65 20 64 65 66 61  er than the defa
22bb0 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66  ult: rule */.  f
22bc0 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
22bd0 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
22be0 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72  t){.    struct r
22bf0 75 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20  ule *rp2;       
22c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72          /* Other
22c10 20 72 75 6c 65 73 20 77 69 74 68 20 74 68 65 20   rules with the 
22c20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  same action */. 
22c30 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 45     if( rp->codeE
22c40 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  mitted ) continu
22c50 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6e  e;.    if( rp->n
22c60 6f 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 2f  oCode ){.      /
22c70 2a 20 4e 6f 20 43 20 63 6f 64 65 20 61 63 74 69  * No C code acti
22c80 6f 6e 73 2c 20 73 6f 20 74 68 69 73 20 77 69 6c  ons, so this wil
22c90 6c 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65  l be part of the
22ca0 20 22 64 65 66 61 75 6c 74 3a 22 20 72 75 6c 65   "default:" rule
22cb0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
22cc0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ue;.    }.    fp
22cd0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
22ce0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
22cf0 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
22d00 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
22d10 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69  t, rp);.    fpri
22d20 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22  ntf(out, " */\n"
22d30 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
22d40 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78   for(rp2=rp->nex
22d50 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d  t; rp2; rp2=rp2-
22d60 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
22d70 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d  ( rp2->code==rp-
22d80 3e 63 6f 64 65 20 26 26 20 72 70 32 2d 3e 63 6f  >code && rp2->co
22d90 64 65 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63 6f  dePrefix==rp->co
22da0 64 65 50 72 65 66 69 78 0a 20 20 20 20 20 20 20  dePrefix.       
22db0 20 20 20 20 20 20 26 26 20 72 70 32 2d 3e 63 6f        && rp2->co
22dc0 64 65 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63 6f  deSuffix==rp->co
22dd0 64 65 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20  deSuffix ){.    
22de0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22df0 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
22e00 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65  /* ", rp2->iRule
22e10 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
22e20 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
22e30 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  2);.        fpri
22e40 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74  ntf(out," */ yyt
22e50 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f  estcase(yyruleno
22e60 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e  ==%d);\n", rp2->
22e70 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  iRule); lineno++
22e80 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63  ;.        rp2->c
22e90 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a  odeEmitted = 1;.
22ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22eb0 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
22ec0 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
22ed0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
22ee0 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
22ef0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
22f00 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d 69  .    rp->codeEmi
22f10 74 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  tted = 1;.  }.  
22f20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70  /* Finally, outp
22f30 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20  ut the default: 
22f40 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73 65  rule.  We choose
22f50 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 3a   as the default:
22f60 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20   all.  ** empty 
22f70 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70  actions. */.  fp
22f80 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
22f90 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c   default:\n"); l
22fa0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72  ineno++;.  for(r
22fb0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
22fc0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
22fd0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
22fe0 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e  Emitted ) contin
22ff0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
23000 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20 20  rp->noCode );.  
23010 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
23020 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20       /* (%d) ", 
23030 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
23040 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
23050 74 2c 20 72 70 29 3b 0a 20 20 20 20 69 66 28 20  t, rp);.    if( 
23060 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 29  rp->doesReduce )
23070 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
23080 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74  out, " */ yytest
23090 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25  case(yyruleno==%
230a0 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 52 75 6c  d);\n", rp->iRul
230b0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
230c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
230d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 28 4f  printf(out, " (O
230e0 50 54 49 4d 49 5a 45 44 20 4f 55 54 29 20 2a 2f  PTIMIZED OUT) */
230f0 20 61 73 73 65 72 74 28 79 79 72 75 6c 65 6e 6f   assert(yyruleno
23100 21 3d 25 64 29 3b 5c 6e 22 2c 0a 20 20 20 20 20  !=%d);\n",.     
23110 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 52 75           rp->iRu
23120 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  le); lineno++;. 
23130 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
23140 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
23150 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
23160 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
23170 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
23180 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
23190 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
231a0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
231b0 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c   if a parse fail
231c0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
231d0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
231e0 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f  >failure,&lineno
231f0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
23200 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
23210 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
23220 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
23230 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
23240 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
23250 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70  r occurs */.  tp
23260 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
23270 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c  p,lemp->error,&l
23280 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
23290 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
232a0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
232b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
232c0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
232d0 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73  es when the pars
232e0 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69  er accepts its i
232f0 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  nput */.  tplt_p
23300 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
23310 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65  mp->accept,&line
23320 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
23330 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
23340 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
23350 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
23360 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
23370 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
23380 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
23390 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
233a0 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  acode,&lineno);.
233b0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
233c0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
233d0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
233e0 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
233f0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
23400 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
23410 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20  rtHeader(struct 
23420 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
23430 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
23440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
23450 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
23460 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
23470 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
23480 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
23490 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
234a0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
234b0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
234c0 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
234f0 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
23500 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b  lemp,".h","rb");
23510 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20  .  if( in ){.   
23520 20 69 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20   int nextChar;. 
23530 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
23540 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
23550 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
23560 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a  SIZE,in); i++){.
23570 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
23580 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
23590 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64  fine %s%-30s %3d
235a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
235b0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
235c0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
235d0 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
235e0 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65   if( strcmp(line
235f0 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61  ,pattern) ) brea
23600 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  k;.    }.    nex
23610 74 43 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e  tChar = fgetc(in
23620 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  );.    fclose(in
23630 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65  );.    if( i==le
23640 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
23650 20 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29   nextChar==EOF )
23660 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
23670 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
23680 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
23690 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
236a0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
236b0 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
236c0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
236d0 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
236e0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
236f0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
23700 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
23710 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
23720 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c   %s%-30s %3d\n",
23730 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
23740 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
23750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
23760 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  se(out);.  }.  r
23770 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64  eturn;.}../* Red
23780 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  uce the size of 
23790 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
237a0 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  s, if possible, 
237b0 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a  by making use.**
237c0 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a   of defaults..**
237d0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
237e0 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65  ion, we take the
237f0 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52   most frequent R
23800 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64  EDUCE action and
23810 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20   make.** it the 
23820 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74  default.  Except
23830 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  , there is no de
23840 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c  fault if the wil
23850 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69  dcard token.** i
23860 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f  s a possible loo
23870 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64  k-ahead..*/.void
23880 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
23890 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
238a0 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp).{.  struct s
238b0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
238c0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
238d0 2a 61 70 32 2c 20 2a 6e 65 78 74 61 70 3b 0a 20  *ap2, *nextap;. 
238e0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
238f0 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a  , *rp2, *rbest;.
23900 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a    int nbest, n;.
23910 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75    int i;.  int u
23920 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20  sesWildcard;..  
23930 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
23940 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
23950 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
23960 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62  orted[i];.    nb
23970 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65  est = 0;.    rbe
23980 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73  st = 0;.    uses
23990 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20  Wildcard = 0;.. 
239a0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
239b0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
239c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
239d0 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  p->type==SHIFT &
239e0 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e  & ap->sp==lemp->
239f0 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
23a00 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
23a10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
23a20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
23a30 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69  !=REDUCE ) conti
23a40 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20  nue;.      rp = 
23a50 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  ap->x.rp;.      
23a60 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74  if( rp->lhsStart
23a70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23a80 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74     if( rp==rbest
23a90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23aa0 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
23ab0 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74  for(ap2=ap->next
23ac0 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e  ; ap2; ap2=ap2->
23ad0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
23ae0 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45  f( ap2->type!=RE
23af0 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
23b00 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61  .        rp2 = a
23b10 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  p2->x.rp;.      
23b20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74    if( rp2==rbest
23b30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23b40 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70       if( rp2==rp
23b50 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
23b60 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73        if( n>nbes
23b70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65  t ){.        nbe
23b80 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  st = n;.        
23b90 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20  rbest = rp;.    
23ba0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23bb0 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
23bc0 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
23bd0 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
23be0 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
23bf0 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
23c00 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c   1 or if the wil
23c10 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61  dcard token is a
23c20 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
23c30 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
23c40 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74  */.    if( nbest
23c50 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61  <1 || usesWildca
23c60 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  rd ) continue;..
23c70 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
23c80 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20  matching REDUCE 
23c90 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  actions into a s
23ca0 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f  ingle default */
23cb0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
23cc0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
23cd0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
23ce0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
23cf0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
23d00 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  best ) break;.  
23d10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23d20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70  ap );.    ap->sp
23d30 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b   = Symbol_new("{
23d40 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20  default}");.    
23d50 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  for(ap=ap->next;
23d60 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
23d70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
23d80 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
23d90 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
23da0 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f   ) ap->type = NO
23db0 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  T_USED;.    }.  
23dc0 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
23dd0 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
23de0 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  ;..    for(ap=st
23df0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
23e00 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
23e10 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49  f( ap->type==SHI
23e20 46 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT ) break;.    
23e30 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
23e40 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
23e50 72 70 21 3d 72 62 65 73 74 20 29 20 62 72 65 61  rp!=rbest ) brea
23e60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
23e70 20 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   ap==0 ){.      
23e80 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 20  stp->autoReduce 
23e90 3d 20 31 3b 0a 20 20 20 20 20 20 73 74 70 2d 3e  = 1;.      stp->
23ea0 70 44 66 6c 74 52 65 64 75 63 65 20 3d 20 72 62  pDfltReduce = rb
23eb0 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  est;.    }.  }..
23ec0 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f    /* Make a seco
23ed0 6e 64 20 70 61 73 73 20 6f 76 65 72 20 61 6c 6c  nd pass over all
23ee0 20 73 74 61 74 65 73 20 61 6e 64 20 61 63 74 69   states and acti
23ef0 6f 6e 73 2e 20 20 43 6f 6e 76 65 72 74 0a 20 20  ons.  Convert.  
23f00 2a 2a 20 65 76 65 72 79 20 61 63 74 69 6f 6e 20  ** every action 
23f10 74 68 61 74 20 69 73 20 61 20 53 48 49 46 54 20  that is a SHIFT 
23f20 74 6f 20 61 6e 20 61 75 74 6f 52 65 64 75 63 65  to an autoReduce
23f30 20 73 74 61 74 65 20 69 6e 74 6f 0a 20 20 2a 2a   state into.  **
23f40 20 61 20 53 48 49 46 54 52 45 44 55 43 45 20 61   a SHIFTREDUCE a
23f50 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ction..  */.  fo
23f60 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
23f70 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
23f80 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
23f90 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
23fa0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
23fb0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
23fc0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65      struct state
23fd0 20 2a 70 4e 65 78 74 53 74 61 74 65 3b 0a 20 20   *pNextState;.  
23fe0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
23ff0 21 3d 53 48 49 46 54 20 29 20 63 6f 6e 74 69 6e  !=SHIFT ) contin
24000 75 65 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 53  ue;.      pNextS
24010 74 61 74 65 20 3d 20 61 70 2d 3e 78 2e 73 74 70  tate = ap->x.stp
24020 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 78  ;.      if( pNex
24030 74 53 74 61 74 65 2d 3e 61 75 74 6f 52 65 64 75  tState->autoRedu
24040 63 65 20 26 26 20 70 4e 65 78 74 53 74 61 74 65  ce && pNextState
24050 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 21 3d 30  ->pDfltReduce!=0
24060 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e   ){.        ap->
24070 74 79 70 65 20 3d 20 53 48 49 46 54 52 45 44 55  type = SHIFTREDU
24080 43 45 3b 0a 20 20 20 20 20 20 20 20 61 70 2d 3e  CE;.        ap->
24090 78 2e 72 70 20 3d 20 70 4e 65 78 74 53 74 61 74  x.rp = pNextStat
240a0 65 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 3b 0a  e->pDfltReduce;.
240b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
240c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 49  }..  /* If a SHI
240d0 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  FTREDUCE action 
240e0 73 70 65 63 69 66 69 65 73 20 61 20 72 75 6c 65  specifies a rule
240f0 20 74 68 61 74 20 68 61 73 20 61 20 73 69 6e 67   that has a sing
24100 6c 65 20 52 48 53 20 74 65 72 6d 0a 20 20 2a 2a  le RHS term.  **
24110 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74   (meaning that t
24120 68 65 20 53 48 49 46 54 52 45 44 55 43 45 20 77  he SHIFTREDUCE w
24130 69 6c 6c 20 6c 61 6e 64 20 62 61 63 6b 20 69 6e  ill land back in
24140 20 74 68 65 20 73 74 61 74 65 20 77 68 65 72 65   the state where
24150 20 69 74 0a 20 20 2a 2a 20 73 74 61 72 74 65 64   it.  ** started
24160 29 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69  ) and if there i
24170 73 20 6e 6f 20 43 2d 63 6f 64 65 20 61 73 73 6f  s no C-code asso
24180 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
24190 72 65 64 75 63 65 20 61 63 74 69 6f 6e 2c 0a 20  reduce action,. 
241a0 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 20   ** then we can 
241b0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63 6f 6e  go ahead and con
241c0 76 65 72 74 20 74 68 65 20 61 63 74 69 6f 6e 20  vert the action 
241d0 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  to be the same a
241e0 73 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f  s the.  ** actio
241f0 6e 20 66 6f 72 20 74 68 65 20 52 48 53 20 6f 66  n for the RHS of
24200 20 74 68 65 20 72 75 6c 65 2e 0a 20 20 2a 2f 0a   the rule..  */.
24210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
24220 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
24230 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
24240 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
24250 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
24260 61 70 3b 20 61 70 3d 6e 65 78 74 61 70 29 7b 0a  ap; ap=nextap){.
24270 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20 61        nextap = a
24280 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 69  p->next;.      i
24290 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 53 48 49  f( ap->type!=SHI
242a0 46 54 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69  FTREDUCE ) conti
242b0 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20  nue;.      rp = 
242c0 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  ap->x.rp;.      
242d0 69 66 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 3d 3d  if( rp->noCode==
242e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
242f0 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 72 68 73      if( rp->nrhs
24300 21 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=1 ) continue;.
24310 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20 4f  #if 1.      /* O
24320 6e 6c 79 20 61 70 70 6c 79 20 74 68 69 73 20 6f  nly apply this o
24330 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 6e  ptimization to n
24340 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  on-terminals.  I
24350 74 20 77 6f 75 6c 64 20 62 65 20 4f 4b 20 74 6f  t would be OK to
24360 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 79 20  .      ** apply 
24370 69 74 20 74 6f 20 74 65 72 6d 69 6e 61 6c 20 73  it to terminal s
24380 79 6d 62 6f 6c 73 20 74 6f 6f 2c 20 62 75 74 20  ymbols too, but 
24390 74 68 61 74 20 6d 61 6b 65 73 20 74 68 65 20 70  that makes the p
243a0 61 72 73 65 72 20 74 61 62 6c 65 73 0a 20 20 20  arser tables.   
243b0 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 2a 2f     ** larger. */
243c0 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73  .      if( ap->s
243d0 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
243e0 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69  terminal ) conti
243f0 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
24400 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
24410 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
24420 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6d 69  means the optimi
24430 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 61 70  zation can be ap
24440 70 6c 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e  plied */.      n
24450 65 78 74 61 70 20 3d 20 61 70 3b 0a 20 20 20 20  extap = ap;.    
24460 20 20 66 6f 72 28 61 70 32 3d 73 74 70 2d 3e 61    for(ap2=stp->a
24470 70 3b 20 61 70 32 20 26 26 20 28 61 70 32 3d 3d  p; ap2 && (ap2==
24480 61 70 20 7c 7c 20 61 70 32 2d 3e 73 70 21 3d 72  ap || ap2->sp!=r
24490 70 2d 3e 6c 68 73 29 3b 20 61 70 32 3d 61 70 32  p->lhs); ap2=ap2
244a0 2d 3e 6e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  ->next){}.      
244b0 61 73 73 65 72 74 28 20 61 70 32 21 3d 30 20 29  assert( ap2!=0 )
244c0 3b 0a 20 20 20 20 20 20 61 70 2d 3e 73 70 4f 70  ;.      ap->spOp
244d0 74 20 3d 20 61 70 32 2d 3e 73 70 3b 0a 20 20 20  t = ap2->sp;.   
244e0 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 61 70     ap->type = ap
244f0 32 2d 3e 74 79 70 65 3b 0a 20 20 20 20 20 20 61  2->type;.      a
24500 70 2d 3e 78 20 3d 20 61 70 32 2d 3e 78 3b 0a 20  p->x = ap2->x;. 
24510 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
24520 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  ** Compare two s
24530 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tates for sortin
24540 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
24550 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69   smaller state i
24560 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74  s the.** one wit
24570 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74  h the most non-t
24580 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e  erminal actions.
24590 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20 74    If they have t
245a0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
245b0 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  * of non-termina
245c0 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20  l actions, then 
245d0 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74  the smaller is t
245e0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
245f0 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63  most.** token ac
24600 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
24610 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74   int stateResort
24620 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  Compare(const vo
24630 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
24640 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73  d *b){.  const s
24650 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41 20  truct state *pA 
24660 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
24670 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f   state**)a;.  co
24680 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
24690 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pB = *(const s
246a0 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b  truct state**)b;
246b0 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
246c0 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41   pB->nNtAct - pA
246d0 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20  ->nNtAct;.  if( 
246e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  n==0 ){.    n = 
246f0 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41  pB->nTknAct - pA
24700 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69  ->nTknAct;.    i
24710 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
24720 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75   n = pB->statenu
24730 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d  m - pA->statenum
24740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
24750 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20  sert( n!=0 );.  
24760 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
24770 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64  .** Renumber and
24780 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20 73   resort states s
24790 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69  o that states wi
247a0 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73  th fewer choices
247b0 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65  .** occur at the
247c0 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b   end.  Except, k
247d0 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20 74  eep state 0 as t
247e0 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a  he first state..
247f0 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74  */.void ResortSt
24800 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  ates(struct lemo
24810 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
24820 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
24830 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
24840 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20  t action *ap;.. 
24850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
24860 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
24870 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
24880 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73  sorted[i];.    s
24890 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74  tp->nTknAct = st
248a0 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20  p->nNtAct = 0;. 
248b0 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64     stp->iDfltRed
248c0 75 63 65 20 3d 20 2d 31 3b 20 2f 2a 20 49 6e 69  uce = -1; /* Ini
248d0 74 20 64 66 6c 74 20 61 63 74 69 6f 6e 20 74 6f  t dflt action to
248e0 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72 22 20   "syntax error" 
248f0 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  */.    stp->iTkn
24900 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
24910 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66  ;.    stp->iNtOf
24920 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
24930 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
24940 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
24950 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
24960 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74  iAction = comput
24970 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
24980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 41 63  );.      if( iAc
24990 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  tion>=0 ){.     
249a0 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
249b0 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ndex<lemp->nterm
249c0 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
249d0 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b    stp->nTknAct++
249e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
249f0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
24a00 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  x<lemp->nsymbol 
24a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
24a20 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20  ->nNtAct++;.    
24a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24a40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74 70       assert( stp
24a50 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d 3d 30 20  ->autoReduce==0 
24a60 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64  || stp->pDfltRed
24a70 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70 20 29 3b  uce==ap->x.rp );
24a80 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
24a90 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 69 41  iDfltReduce = iA
24aa0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d  ction;.        }
24ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24ac0 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
24ad0 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
24ae0 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
24af0 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
24b00 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
24b10 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
24b20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
24b30 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
24b40 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
24b50 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
24b60 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d  m = i;.  }.  lem
24b70 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d  p->nxstate = lem
24b80 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69  p->nstate;.  whi
24b90 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  le( lemp->nxstat
24ba0 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  e>1 && lemp->sor
24bb0 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ted[lemp->nxstat
24bc0 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65  e-1]->autoReduce
24bd0 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78   ){.    lemp->nx
24be0 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  state--;.  }.}..
24bf0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
24c00 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
24c10 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
24c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24c40 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
24c50 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
24c60 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
24c70 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
24c80 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
24c90 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
24ca0 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
24cb0 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e  .void SetSize(in
24cc0 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20  t n).{.  size = 
24cd0 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  n+1;.}../* Alloc
24ce0 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f  ate a new set */
24cf0 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f  .char *SetNew(vo
24d00 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a  id){.  char *s;.
24d10 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c    s = (char*)cal
24d20 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20  loc( size, 1);. 
24d30 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20   if( s==0 ){.   
24d40 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d   extern void mem
24d50 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  ory_error();.   
24d60 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
24d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b  .  }.  return s;
24d80 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  .}../* Deallocat
24d90 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20  e a set */.void 
24da0 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73 29  SetFree(char *s)
24db0 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
24dc0 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
24dd0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
24de0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
24df0 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
24e00 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
24e10 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
24e20 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
24e30 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
24e40 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20   *s, int e).{.  
24e50 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74  int rv;.  assert
24e60 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65  ( e>=0 && e<size
24e70 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b   );.  rv = s[e];
24e80 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72  .  s[e] = 1;.  r
24e90 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a  eturn !rv;.}../*
24ea0 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65   Add every eleme
24eb0 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20  nt of s2 to s1. 
24ec0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
24ed0 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69  s1 changes. */.i
24ee0 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72  nt SetUnion(char
24ef0 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a   *s1, char *s2).
24f00 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72  {.  int i, progr
24f10 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20  ess;.  progress 
24f20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
24f30 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  i<size; i++){.  
24f40 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29    if( s2[i]==0 )
24f50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24f60 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20  f( s1[i]==0 ){. 
24f70 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
24f80 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d  1;.      s1[i] =
24f90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
24fa0 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b  return progress;
24fb0 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
24fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
24fd0 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
24fe0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
24ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
25000 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
25010 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
25020 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
25030 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
25040 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
25050 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
25060 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
25070 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
25080 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
25090 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
250a0 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
250b0 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
250c0 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
250d0 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
250e0 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
250f0 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
25100 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
25110 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
25120 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
25130 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
25140 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
25150 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69  */..PRIVATE unsi
25160 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e  gned strhash(con
25170 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
25180 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a  unsigned h = 0;.
25190 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20    while( *x ) h 
251a0 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b  = h*13 + *(x++);
251b0 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
251c0 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74  /* Works like st
251d0 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20  rdup, sort of.  
251e0 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e  Save a string in
251f0 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79   malloced memory
25200 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74  , but.** keep st
25210 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65  rings in a table
25220 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
25230 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  e string is not 
25240 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  in more.** than 
25250 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f  one place..*/.co
25260 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
25270 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29  e(const char *y)
25280 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .{.  const char 
25290 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b  *z;.  char *cpy;
252a0 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72  ..  if( y==0 ) r
252b0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53  eturn 0;.  z = S
252c0 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a  trsafe_find(y);.
252d0 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63    if( z==0 && (c
252e0 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f  py=(char *)mallo
252f0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79  c( lemonStrlen(y
25300 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
25310 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70   lemon_strcpy(cp
25320 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70  y,y);.    z = cp
25330 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69  y;.    Strsafe_i
25340 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20  nsert(z);.  }.  
25350 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a  MemoryCheck(z);.
25360 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
25370 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
25380 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
25390 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
253a0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
253b0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
253c0 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
253d0 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a  /.struct s_x1 {.
253e0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
253f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25400 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
25410 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
25440 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
25450 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
25460 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
25490 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
254b0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
254c0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
254d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
254e0 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  1node *tbl;  /* 
254f0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
25500 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
25510 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x1node **ht; 
25520 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
25530 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
25540 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
25550 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
25560 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
25570 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
25580 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
25590 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
255a0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
255b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
255c0 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73  _x1node {.  cons
255d0 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  t char *data;   
255e0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
255f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
25600 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  1node *next;   /
25610 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
25620 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
25630 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
25640 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
25650 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
25660 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x1node;../* 
25670 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
25680 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
25690 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
256a0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
256b0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
256c0 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20   s_x1 *x1a;../* 
256d0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
256e0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
256f0 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65   */.void Strsafe
25700 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _init(void){.  i
25710 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b  f( x1a ) return;
25720 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74  .  x1a = (struct
25730 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x1*)malloc( s
25740 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
25750 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20  1) );.  if( x1a 
25760 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65  ){.    x1a->size
25770 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61   = 1024;.    x1a
25780 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
25790 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e   x1a->tbl = (x1n
257a0 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32 34  ode*)calloc(1024
257b0 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29  , sizeof(x1node)
257c0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
257d0 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61  *));.    if( x1a
257e0 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
257f0 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20    free(x1a);.   
25800 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20     x1a = 0;.    
25810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
25820 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68   i;.      x1a->h
25830 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
25840 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b  x1a->tbl[1024]);
25850 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
25860 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61  i<1024; i++) x1a
25870 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
25880 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
25890 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
258a0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
258b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
258c0 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
258d0 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
258e0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
258f0 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
25900 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e  /.int Strsafe_in
25910 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20  sert(const char 
25920 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64  *data).{.  x1nod
25930 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65  e *np;.  unsigne
25940 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  d h;.  unsigned 
25950 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  ph;..  if( x1a==
25960 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25970 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74  ph = strhash(dat
25980 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  a);.  h = ph & (
25990 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
259a0 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
259b0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
259c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
259d0 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30  p->data,data)==0
259e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
259f0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
25a00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
25a10 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
25a20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
25a30 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
25a40 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
25a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
25a60 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
25a70 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
25a80 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x1a->count>=x
25a90 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  1a->size ){.    
25aa0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
25ab0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
25ac0 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
25ad0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
25ae0 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
25af0 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
25b00 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 31  e = arrSize = x1
25b10 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
25b20 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61  rray.count = x1a
25b30 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
25b40 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  ay.tbl = (x1node
25b50 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
25b60 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29  , sizeof(x1node)
25b70 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
25b80 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
25b90 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
25ba0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
25bb0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
25bc0 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
25bd0 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  y.ht = (x1node**
25be0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
25bf0 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
25c00 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
25c10 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
25c20 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
25c30 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b  0; i<x1a->count;
25c40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e   i++){.      x1n
25c50 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
25c60 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
25c70 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x1a->tbl[i])
25c80 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68  ;.      h = strh
25c90 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29  ash(oldnp->data)
25ca0 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a   & (arrSize-1);.
25cb0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
25cc0 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
25cd0 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
25ce0 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
25cf0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
25d00 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
25d10 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
25d20 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
25d30 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
25d40 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
25d50 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
25d60 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
25d70 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
25d80 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
25d90 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e  }.    free(x1a->
25da0 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d  tbl);.    *x1a =
25db0 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
25dc0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
25dd0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
25de0 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
25df0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e  ;.  np = &(x1a->
25e00 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x1a->count++
25e10 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
25e20 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61   data;.  if( x1a
25e30 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68  ->ht[h] ) x1a->h
25e40 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
25e50 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
25e60 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68  next = x1a->ht[h
25e70 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20  ];.  x1a->ht[h] 
25e80 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
25e90 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29   = &(x1a->ht[h])
25ea0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
25eb0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
25ec0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
25ed0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
25ee0 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
25ef0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
25f00 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74  ch key. */.const
25f10 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66   char *Strsafe_f
25f20 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
25f30 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
25f40 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  d h;.  x1node *n
25f50 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  p;..  if( x1a==0
25f60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
25f70 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
25f80 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
25f90 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
25fa0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
25fb0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
25fc0 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
25fd0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
25fe0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
25ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
26000 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
26010 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
26020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65  inter to the (te
26030 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72  rminal or nonter
26040 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78  minal) symbol "x
26050 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  "..** Create a n
26060 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69  ew symbol if thi
26070 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
26080 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e  ime "x" has been
26090 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74   seen..*/.struct
260a0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
260b0 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
260c0 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  x).{.  struct sy
260d0 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20  mbol *sp;..  sp 
260e0 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  = Symbol_find(x)
260f0 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b  ;.  if( sp==0 ){
26100 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63  .    sp = (struc
26110 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f  t symbol *)callo
26120 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  c(1, sizeof(stru
26130 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20  ct symbol) );.  
26140 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70    MemoryCheck(sp
26150 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20  );.    sp->name 
26160 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20  = Strsafe(x);.  
26170 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53 55    sp->type = ISU
26180 50 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d 49  PPER(*x) ? TERMI
26190 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41  NAL : NONTERMINA
261a0 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20  L;.    sp->rule 
261b0 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c  = 0;.    sp->fal
261c0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  lback = 0;.    s
261d0 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20  p->prec = -1;.  
261e0 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e    sp->assoc = UN
261f0 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74  K;.    sp->first
26200 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  set = 0;.    sp-
26210 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
26220 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64  FALSE;.    sp->d
26230 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20  estructor = 0;. 
26240 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e     sp->destLinen
26250 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  o = 0;.    sp->d
26260 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  atatype = 0;.   
26270 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b   sp->useCnt = 0;
26280 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .    Symbol_inse
26290 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b  rt(sp,sp->name);
262a0 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e  .  }.  sp->useCn
262b0 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70  t++;.  return sp
262c0 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
262d0 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20  two symbols for 
262e0 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
262f0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
26300 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20  ve,.** zero, or 
26310 70 6f 73 69 74 69 76 65 20 69 66 20 61 20 69 73  positive if a is
26320 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75 61   less then, equa
26330 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
26340 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a  .** than b..**.*
26350 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  * Symbols that b
26360 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20  egin with upper 
26370 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65  case letters (te
26380 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e  rminals or token
26390 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20  s).** must sort 
263a0 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74  before symbols t
263b0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c  hat begin with l
263c0 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  ower case letter
263d0 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e  s.** (non-termin
263e0 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54 49  als).  And MULTI
263f0 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c 73  TERMINAL symbols
26400 20 28 63 72 65 61 74 65 64 20 75 73 69 6e 67 20   (created using 
26410 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c  the.** %token_cl
26420 61 73 73 20 64 69 72 65 63 74 69 76 65 29 20 6d  ass directive) m
26430 75 73 74 20 73 6f 72 74 20 61 74 20 74 68 65 20  ust sort at the 
26440 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72 20  very end. Other 
26450 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74 68  than.** that, th
26460 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74  e order does not
26470 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   matter..**.** W
26480 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e  e find experimen
26490 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69  tally that leavi
264a0 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ng the symbols i
264b0 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  n their original
264c0 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f  .** order (the o
264d0 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61 72  rder they appear
264e0 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  ed in the gramma
264f0 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74 68  r file) gives th
26500 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61  e.** smallest pa
26510 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53  rser tables in S
26520 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79  QLite..*/.int Sy
26530 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76  mbolcmpp(const v
26540 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76  oid *_a, const v
26550 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e  oid *_b).{.  con
26560 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
26570 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74   *a = *(const st
26580 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
26590 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
265a0 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a  ct symbol *b = *
265b0 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79  (const struct sy
265c0 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69  mbol **) _b;.  i
265d0 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65 3d  nt i1 = a->type=
265e0 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f  =MULTITERMINAL ?
265f0 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e   3 : a->name[0]>
26600 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 69  'Z' ? 2 : 1;.  i
26610 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65 3d  nt i2 = b->type=
26620 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f  =MULTITERMINAL ?
26630 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e   3 : b->name[0]>
26640 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 72  'Z' ? 2 : 1;.  r
26650 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20 61  eturn i1==i2 ? a
26660 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e 64  ->index - b->ind
26670 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d 0a  ex : i1 - i2;.}.
26680 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
26690 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
266a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
266b0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
266c0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
266d0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
266e0 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20  .*/.struct s_x2 
266f0 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
26700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
26720 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
26730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
26750 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
26760 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
26770 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
267a0 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
267b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
267c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
267d0 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
267e0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
267f0 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x2node *tbl;  /
26800 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
26810 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
26820 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74  ct s_x2node **ht
26830 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
26840 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
26850 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
26860 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
26870 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
26880 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
26890 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
268a0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
268b0 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
268c0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
268d0 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x2node {.  st
268e0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74  ruct symbol *dat
268f0 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  a;     /* The da
26900 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ta */.  const ch
26910 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ar *key;        
26920 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
26930 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
26940 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
26950 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
26960 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
26970 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
26980 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
26990 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
269a0 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  2node;../* There
269b0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
269c0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
269d0 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
269e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
269f0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32  atic struct s_x2
26a00 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x2a;../* Alloc
26a10 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
26a20 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
26a30 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
26a40 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 32 61  void){.  if( x2a
26a50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61   ) return;.  x2a
26a60 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a   = (struct s_x2*
26a70 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
26a80 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a  struct s_x2) );.
26a90 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20    if( x2a ){.   
26aa0 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x2a->size = 128
26ab0 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74  ;.    x2a->count
26ac0 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74   = 0;.    x2a->t
26ad0 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61  bl = (x2node*)ca
26ae0 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66  lloc(128, sizeof
26af0 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x2node) + sizeo
26b00 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x2node*));.   
26b10 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
26b20 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
26b30 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
26b40 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
26b50 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
26b60 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
26b70 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
26b80 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
26b90 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
26ba0 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
26bb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
26bc0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
26bd0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
26be0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
26bf0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
26c00 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
26c10 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
26c20 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
26c30 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
26c40 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  ol_insert(struct
26c50 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63   symbol *data, c
26c60 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a  onst char *key).
26c70 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
26c80 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
26c90 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
26ca0 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
26cb0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
26cc0 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20  rhash(key);.  h 
26cd0 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a  = ph & (x2a->siz
26ce0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
26cf0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
26d00 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
26d10 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
26d20 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
26d30 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
26d40 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
26d50 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
26d60 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
26d70 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
26d80 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
26d90 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
26da0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
26db0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
26dc0 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f   }.  if( x2a->co
26dd0 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29  unt>=x2a->size )
26de0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
26df0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
26e00 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
26e10 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
26e20 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
26e30 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
26e40 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
26e50 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b  e = x2a->size*2;
26e60 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
26e70 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
26e80 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
26e90 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x2node*)calloc(a
26ea0 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
26eb0 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
26ec0 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x2node*));.    i
26ed0 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
26ee0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
26ef0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
26f00 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
26f10 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32    array.ht = (x2
26f20 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
26f30 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
26f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
26f50 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
26f60 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
26f70 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e  for(i=0; i<x2a->
26f80 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
26f90 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x2node *oldnp
26fa0 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
26fb0 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  oldnp = &(x2a->t
26fc0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
26fd0 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
26fe0 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a 65  >key) & (arrSize
26ff0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
27000 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
27010 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
27020 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
27030 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
27040 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
27050 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
27060 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
27070 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
27080 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
27090 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
270a0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
270b0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
270c0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
270d0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
270e0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
270f0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
27100 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  2a->tbl);.    *x
27110 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  2a = array;.  }.
27120 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
27130 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
27140 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a  = ph & (x2a->siz
27150 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
27160 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75  2a->tbl[x2a->cou
27170 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
27180 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
27190 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
271a0 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x2a->ht[h] ) x
271b0 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  2a->ht[h]->from 
271c0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
271d0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d   np->next = x2a-
271e0 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68  >ht[h];.  x2a->h
271f0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
27200 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68  >from = &(x2a->h
27210 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
27220 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
27230 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
27240 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
27250 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
27260 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
27270 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
27280 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
27290 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74  ymbol_find(const
272a0 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
272b0 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 32  unsigned h;.  x2
272c0 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
272d0 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
272e0 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
272f0 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73  h(key) & (x2a->s
27300 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
27310 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
27320 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
27330 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
27340 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
27350 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
27360 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
27370 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
27380 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
27390 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e  n the n-th data.
273a0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
273b0 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   n is out of ran
273c0 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ge. */.struct sy
273d0 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
273e0 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75  (int n).{.  stru
273f0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
27400 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e  .  if( x2a && n>
27410 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75  0 && n<=x2a->cou
27420 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d  nt ){.    data =
27430 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64   x2a->tbl[n-1].d
27440 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ata;.  }else{.  
27450 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a    data = 0;.  }.
27460 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d    return data;.}
27470 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
27480 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
27490 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  y */.int Symbol_
274a0 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75  count().{.  retu
274b0 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f  rn x2a ? x2a->co
274c0 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  unt : 0;.}../* R
274d0 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f  eturn an array o
274e0 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  f pointers to al
274f0 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61  l data in the ta
27500 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61  ble..** The arra
27510 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
27520 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75  om malloc.  Retu
27530 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72  rn NULL if memor
27540 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
27550 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20  problems, or if 
27560 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70  the array is emp
27570 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ty. */.struct sy
27580 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72  mbol **Symbol_ar
27590 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
275a0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61  ct symbol **arra
275b0 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69  y;.  int i,arrSi
275c0 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  ze;.  if( x2a==0
275d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
275e0 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f  rrSize = x2a->co
275f0 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
27600 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
27610 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
27620 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
27630 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28  ymbol *));.  if(
27640 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
27650 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
27660 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20  ; i++) array[i] 
27670 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  = x2a->tbl[i].da
27680 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ta;.  }.  return
27690 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f   array;.}../* Co
276a0 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67  mpare two config
276b0 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20  urations */.int 
276c0 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
276d0 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63  char *_a,const c
276e0 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e  har *_b).{.  con
276f0 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  st struct config
27700 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63 6f   *a = (struct co
27710 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f  nfig *) _a;.  co
27720 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69  nst struct confi
27730 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20 63  g *b = (struct c
27740 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69  onfig *) _b;.  i
27750 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72  nt x;.  x = a->r
27760 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70  p->index - b->rp
27770 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78  ->index;.  if( x
27780 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74  ==0 ) x = a->dot
27790 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74   - b->dot;.  ret
277a0 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  urn x;.}../* Com
277b0 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
277c0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73  */.PRIVATE int s
277d0 74 61 74 65 63 6d 70 28 73 74 72 75 63 74 20 63  tatecmp(struct c
277e0 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63 74  onfig *a, struct
277f0 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20   config *b).{.  
27800 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
27810 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
27820 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
27830 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
27840 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
27850 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
27860 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
27870 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
27880 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
27890 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
278a0 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
278b0 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
278c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
278d0 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
278e0 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
278f0 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68 61  unsigned stateha
27900 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  sh(struct config
27910 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *a).{.  unsigne
27920 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20  d h=0;.  while( 
27930 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35  a ){.    h = h*5
27940 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  71 + a->rp->inde
27950 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20  x*37 + a->dot;. 
27960 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20     a = a->bp;.  
27970 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  }.  return h;.}.
27980 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
27990 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75  ew state structu
279a0 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  re */.struct sta
279b0 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a  te *State_new().
279c0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
279d0 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e 65   *newstate;.  ne
279e0 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63 74  wstate = (struct
279f0 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28   state *)calloc(
27a00 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  1, sizeof(struct
27a10 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d   state) );.  Mem
27a20 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61 74  oryCheck(newstat
27a30 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  e);.  return new
27a40 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  state;.}../* The
27a50 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
27a60 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
27a70 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
27a80 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
27a90 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
27aa0 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72  ype "x3"..*/.str
27ab0 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74  uct s_x3 {.  int
27ac0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
27ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
27ae0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27af0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
27b20 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
27b30 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
27b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
27b60 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
27b70 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
27b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27b90 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
27ba0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
27bb0 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
27bc0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
27bd0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
27be0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
27bf0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
27c00 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
27c10 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
27c20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
27c30 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
27c40 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
27c50 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
27c60 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
27c70 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
27c80 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x3"..*/.typed
27c90 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  ef struct s_x3no
27ca0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  de {.  struct st
27cb0 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20  ate *data;      
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27cd0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
27ce0 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
27d10 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
27d20 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
27d30 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
27d40 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
27d50 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
27d60 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
27d70 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
27d80 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x3node;../* The
27d90 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
27da0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
27db0 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
27dc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
27dd0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
27de0 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c  x3 *x3a;../* All
27df0 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
27e00 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
27e10 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74  .void State_init
27e20 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 33  (void){.  if( x3
27e30 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33  a ) return;.  x3
27e40 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33  a = (struct s_x3
27e50 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
27e60 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b  (struct s_x3) );
27e70 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20  .  if( x3a ){.  
27e80 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x3a->size = 12
27e90 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e  8;.    x3a->coun
27ea0 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e  t = 0;.    x3a->
27eb0 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63  tbl = (x3node*)c
27ec0 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f  alloc(128, sizeo
27ed0 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x3node) + size
27ee0 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x3node*));.  
27ef0 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d    if( x3a->tbl==
27f00 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
27f10 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20  x3a);.      x3a 
27f20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
27f30 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
27f40 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33     x3a->ht = (x3
27f50 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62  node**)&(x3a->tb
27f60 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
27f70 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
27f80 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x3a->ht[i] =
27f90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
27fa0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
27fb0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27fc0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
27fd0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
27fe0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
27ff0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
28000 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
28010 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61  itten */.int Sta
28020 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  te_insert(struct
28030 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74   state *data, st
28040 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
28050 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70  ).{.  x3node *np
28060 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
28070 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
28080 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
28090 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
280a0 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a  statehash(key);.
280b0 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
280c0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
280d0 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x3a->ht[h];.  w
280e0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
280f0 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d  if( statecmp(np-
28100 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
28110 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
28120 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
28130 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
28140 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
28150 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
28160 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
28170 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
28180 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
28190 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
281a0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
281b0 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e  3a->count>=x3a->
281c0 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
281d0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
281e0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
281f0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
28200 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
28210 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
28220 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
28230 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73  arrSize = x3a->s
28240 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
28250 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f  .count = x3a->co
28260 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
28270 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61  bl = (x3node*)ca
28280 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
28290 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
282a0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b  izeof(x3node*));
282b0 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
282c0 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
282d0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
282e0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
282f0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
28300 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61   = (x3node**)&(a
28310 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
28320 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
28330 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
28340 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
28350 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
28360 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x3a->count; i++
28370 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20  ){.      x3node 
28380 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
28390 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
283a0 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x3a->tbl[i]);.  
283b0 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73      h = statehas
283c0 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
283d0 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
283e0 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
283f0 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
28400 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
28410 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
28420 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
28430 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
28440 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
28450 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
28460 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
28470 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
28480 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
28490 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
284a0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
284b0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
284c0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
284d0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
284e0 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29    free(x3a->tbl)
284f0 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72  ;.    *x3a = arr
28500 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
28510 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
28520 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
28530 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
28540 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
28550 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x3a->count++]);.
28560 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
28570 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
28580 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68  ta;.  if( x3a->h
28590 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68  t[h] ) x3a->ht[h
285a0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
285b0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
285c0 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x3a->ht[h];.
285d0 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x3a->ht[h] = n
285e0 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
285f0 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x3a->ht[h]);. 
28600 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
28610 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
28620 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
28630 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
28640 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
28650 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
28660 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
28670 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
28680 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
28690 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
286a0 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  d h;.  x3node *n
286b0 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  p;..  if( x3a==0
286c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
286d0 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
286e0 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  ) & (x3a->size-1
286f0 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
28700 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
28710 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
28720 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
28730 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
28740 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
28750 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
28760 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
28770 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
28780 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
28790 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
287a0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
287b0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
287c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
287d0 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
287e0 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
287f0 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
28800 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
28810 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
28820 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
28830 74 61 74 65 5f 61 72 72 61 79 6f 66 28 76 6f 69  tate_arrayof(voi
28840 64 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  d).{.  struct st
28850 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  ate **array;.  i
28860 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
28870 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
28880 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65  urn 0;.  arrSize
28890 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
288a0 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
288b0 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63   state **)calloc
288c0 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
288d0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
288e0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
288f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
28900 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
28910 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74  rray[i] = x3a->t
28920 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
28930 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
28940 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e  }../* Hash a con
28950 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
28960 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63  IVATE unsigned c
28970 6f 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74  onfighash(struct
28980 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20   config *a).{.  
28990 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20  unsigned h=0;.  
289a0 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
289b0 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
289c0 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
289d0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
289e0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
289f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
28a00 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
28a10 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
28a20 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
28a30 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
28a40 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
28a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28a60 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
28a70 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
28a80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28aa0 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
28ab0 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
28ac0 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
28af0 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
28b00 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
28b10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28b20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
28b30 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
28b40 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
28b50 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
28b60 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
28b70 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
28b80 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
28b90 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
28ba0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
28bb0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
28bc0 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
28bd0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
28be0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
28bf0 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
28c00 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
28c10 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
28c20 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
28c30 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
28c40 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
28c50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
28c60 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
28c70 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
28c80 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
28c90 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
28ca0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
28cb0 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
28cc0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
28cd0 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
28ce0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
28cf0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
28d00 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
28d10 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
28d20 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
28d30 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
28d40 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
28d50 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
28d60 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
28d70 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69  igtable_init(voi
28d80 64 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20  d){.  if( x4a ) 
28d90 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20  return;.  x4a = 
28da0 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61  (struct s_x4*)ma
28db0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
28dc0 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69  uct s_x4) );.  i
28dd0 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34  f( x4a ){.    x4
28de0 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20  a->size = 64;.  
28df0 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
28e00 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d  ;.    x4a->tbl =
28e10 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x4node*)calloc
28e20 28 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f  (64, sizeof(x4no
28e30 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
28e40 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
28e50 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x4a->tbl==0 ){. 
28e60 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a       free(x4a);.
28e70 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20        x4a = 0;. 
28e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28e90 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61  int i;.      x4a
28ea0 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  ->ht = (x4node**
28eb0 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29  )&(x4a->tbl[64])
28ec0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28ed0 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d   i<64; i++) x4a-
28ee0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
28ef0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
28f00 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
28f10 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
28f20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
28f30 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
28f40 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
28f50 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
28f60 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
28f70 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
28f80 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63  _insert(struct c
28f90 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20  onfig *data).{. 
28fa0 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x4node *np;.  u
28fb0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
28fc0 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
28fd0 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
28fe0 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69   0;.  ph = confi
28ff0 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68  ghash(data);.  h
29000 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
29010 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
29020 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
29030 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
29040 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73   Configcmp((cons
29050 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61  t char *) np->da
29060 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta,(const char *
29070 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  ) data)==0 ){.  
29080 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
29090 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
290a0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
290b0 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
290c0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
290d0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
290e0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
290f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
29100 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
29110 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61  t;.  }.  if( x4a
29120 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69  ->count>=x4a->si
29130 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
29140 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
29150 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
29160 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
29170 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
29180 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20   s_x4 array;.   
29190 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
291a0 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a  rSize = x4a->siz
291b0 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
291c0 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e  ount = x4a->coun
291d0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
291e0 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c   = (x4node*)call
291f0 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
29200 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
29210 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x4node*));. 
29220 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
29230 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
29240 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
29250 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
29260 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
29270 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x4node**)&(arr
29280 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
29290 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
292a0 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
292b0 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
292c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
292d0 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  4a->count; i++){
292e0 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f  .      x4node *o
292f0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
29300 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34      oldnp = &(x4
29310 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
29320 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
29330 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
29340 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
29350 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
29360 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
29370 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
29380 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
29390 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
293a0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
293b0 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
293c0 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
293d0 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
293e0 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
293f0 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
29400 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
29410 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
29420 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
29430 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c     free(x4a->tbl
29440 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72  );.    *x4a = ar
29450 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
29460 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
29470 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
29480 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
29490 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c   np = &(x4a->tbl
294a0 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x4a->count++]);
294b0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
294c0 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68  ta;.  if( x4a->h
294d0 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68  t[h] ) x4a->ht[h
294e0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
294f0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
29500 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x4a->ht[h];.
29510 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x4a->ht[h] = n
29520 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
29530 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x4a->ht[h]);. 
29540 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
29550 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
29560 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
29570 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
29580 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
29590 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
295a0 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63  key. */.struct c
295b0 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
295c0 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  le_find(struct c
295d0 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20  onfig *key).{.  
295e0 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20  int h;.  x4node 
295f0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d  *np;..  if( x4a=
29600 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
29610 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28   h = confighash(
29620 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a  key) & (x4a->siz
29630 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
29640 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
29650 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
29660 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74  Configcmp((const
29670 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74   char *) np->dat
29680 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a,(const char *)
29690 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b   key)==0 ) break
296a0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
296b0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
296c0 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
296d0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76  : 0;.}../* Remov
296e0 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
296f0 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73  the table.  Pass
29700 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68   each data to th
29710 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a  e function "f".*
29720 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76  * as it is remov
29730 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65  ed.  ("f" may be
29740 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74   null to avoid t
29750 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f  his step.) */.vo
29760 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
29770 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74 72  lear(int(*f)(str
29780 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a 7b  uct config *)).{
29790 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
297a0 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63  x4a==0 || x4a->c
297b0 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  ount==0 ) return
297c0 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28  ;.  if( f ) for(
297d0 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
297e0 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61  t; i++) (*f)(x4a
297f0 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a  ->tbl[i].data);.
29800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
29810 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61  ->size; i++) x4a
29820 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78  ->ht[i] = 0;.  x
29830 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  4a->count = 0;. 
29840 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.